1*055d4590SKeyi Gui#!/bin/bash 2*055d4590SKeyi Gui# 3*055d4590SKeyi Gui# Copyright (C) 2013 The Android Open Source Project 4*055d4590SKeyi Gui# 5*055d4590SKeyi Gui# Licensed under the Apache License, Version 2.0 (the "License"); 6*055d4590SKeyi Gui# you may not use this file except in compliance with the License. 7*055d4590SKeyi Gui# You may obtain a copy of the License at 8*055d4590SKeyi Gui# 9*055d4590SKeyi Gui# http://www.apache.org/licenses/LICENSE-2.0 10*055d4590SKeyi Gui# 11*055d4590SKeyi Gui# Unless required by applicable law or agreed to in writing, software 12*055d4590SKeyi Gui# distributed under the License is distributed on an "AS IS" BASIS, 13*055d4590SKeyi Gui# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*055d4590SKeyi Gui# See the License for the specific language governing permissions and 15*055d4590SKeyi Gui# limitations under the License. 16*055d4590SKeyi Gui 17*055d4590SKeyi Guifunction makeTempJar () 18*055d4590SKeyi Gui{ 19*055d4590SKeyi Gui local tempDir=/tmp 20*055d4590SKeyi Gui if [ ! -e "${tempDir}" ]; then 21*055d4590SKeyi Gui tempDir=. 22*055d4590SKeyi Gui fi 23*055d4590SKeyi Gui local tempfile="${tempDir}/mainDexClasses-$$.tmp.jar" 24*055d4590SKeyi Gui if [ -e "${tempfile}" ]; then 25*055d4590SKeyi Gui echo "Failed to create temporary file" >2 26*055d4590SKeyi Gui exit 6 27*055d4590SKeyi Gui fi 28*055d4590SKeyi Gui echo "${tempfile}" 29*055d4590SKeyi Gui} 30*055d4590SKeyi Gui 31*055d4590SKeyi Guifunction cleanTmp () 32*055d4590SKeyi Gui{ 33*055d4590SKeyi Gui if [ -e "${tmpOut}" ] ; then 34*055d4590SKeyi Gui rm "${tmpOut}" 35*055d4590SKeyi Gui fi 36*055d4590SKeyi Gui} 37*055d4590SKeyi Gui 38*055d4590SKeyi Gui 39*055d4590SKeyi Gui# Set up prog to be the path of this script, including following symlinks, 40*055d4590SKeyi Gui# and set up progdir to be the fully-qualified pathname of its directory. 41*055d4590SKeyi Guiprog="$0" 42*055d4590SKeyi Gui 43*055d4590SKeyi Guiwhile [ -h "${prog}" ]; do 44*055d4590SKeyi Gui newProg=`/bin/ls -ld "${prog}"` 45*055d4590SKeyi Gui newProg=`expr "${newProg}" : ".* -> \(.*\)$"` 46*055d4590SKeyi Gui if expr "x${newProg}" : 'x/' >/dev/null; then 47*055d4590SKeyi Gui prog="${newProg}" 48*055d4590SKeyi Gui else 49*055d4590SKeyi Gui progdir=`dirname "${prog}"` 50*055d4590SKeyi Gui prog="${progdir}/${newProg}" 51*055d4590SKeyi Gui fi 52*055d4590SKeyi Guidone 53*055d4590SKeyi Guioldwd=`pwd` 54*055d4590SKeyi Guiprogdir=`dirname "${prog}"` 55*055d4590SKeyi Guicd "${progdir}" 56*055d4590SKeyi Guiprogdir=`pwd` 57*055d4590SKeyi Guiprog="${progdir}"/`basename "${prog}"` 58*055d4590SKeyi Guicd "${oldwd}" 59*055d4590SKeyi Gui 60*055d4590SKeyi Guibaserules="${progdir}"/mainDexClasses.rules 61*055d4590SKeyi Guiif [ ! -r "${baserules}" ]; then 62*055d4590SKeyi Gui echo `basename "$prog"`": can't find mainDexClasses.rules" 1>&2 63*055d4590SKeyi Gui exit 1 64*055d4590SKeyi Guifi 65*055d4590SKeyi Gui 66*055d4590SKeyi Guiextrarules="${progdir}"/mainDexClassesNoAapt.rules 67*055d4590SKeyi Guiif [ ! -r ${extrarules} ]; then 68*055d4590SKeyi Gui echo `basename "$prog"`": can't find mainDexClassesNoAapt.rules" 1>&2 69*055d4590SKeyi Gui exit 1 70*055d4590SKeyi Guifi 71*055d4590SKeyi Gui 72*055d4590SKeyi Guijarfile=dx.jar 73*055d4590SKeyi Guilibdir="$progdir" 74*055d4590SKeyi Gui 75*055d4590SKeyi Guiif [ ! -r "$libdir/$jarfile" ]; then 76*055d4590SKeyi Gui # set dx.jar location for the SDK case 77*055d4590SKeyi Gui libdir="$libdir/lib" 78*055d4590SKeyi Guifi 79*055d4590SKeyi Gui 80*055d4590SKeyi Gui 81*055d4590SKeyi Guiif [ ! -r "$libdir/$jarfile" ]; then 82*055d4590SKeyi Gui # set dx.jar location for the Android tree case 83*055d4590SKeyi Gui libdir=`dirname "$progdir"`/framework 84*055d4590SKeyi Guifi 85*055d4590SKeyi Gui 86*055d4590SKeyi Guiif [ ! -r "$libdir/$jarfile" ]; then 87*055d4590SKeyi Gui echo `basename "$prog"`": can't find $jarfile" 1>&2 88*055d4590SKeyi Gui exit 1 89*055d4590SKeyi Guifi 90*055d4590SKeyi Gui 91*055d4590SKeyi GuiproguardExec="proguard.sh" 92*055d4590SKeyi Guiproguard=${PROGUARD_HOME}/bin/${proguardExec} 93*055d4590SKeyi Gui 94*055d4590SKeyi Guiif [ ! -r "${proguard}" ]; then 95*055d4590SKeyi Gui # set proguard location for the SDK case 96*055d4590SKeyi Gui proguardBaseDir=`dirname "$progdir"` 97*055d4590SKeyi Gui # "${progdir}"/../.. 98*055d4590SKeyi Gui proguardBaseDir=`dirname "$proguardBaseDir"` 99*055d4590SKeyi Gui proguard="${proguardBaseDir}"/tools/proguard/bin/${proguardExec} 100*055d4590SKeyi Guifi 101*055d4590SKeyi Gui 102*055d4590SKeyi Guiif [ ! -r "${proguard}" ]; then 103*055d4590SKeyi Gui # set proguard location for the Android tree case 104*055d4590SKeyi Gui proguardBaseDir=`dirname "$proguardBaseDir"` 105*055d4590SKeyi Gui # "${progdir}"/../../../.. 106*055d4590SKeyi Gui proguardBaseDir=`dirname "$proguardBaseDir"` 107*055d4590SKeyi Gui proguard="${proguardBaseDir}"/external/proguard/bin/${proguardExec} 108*055d4590SKeyi Guifi 109*055d4590SKeyi Gui 110*055d4590SKeyi Guiif [ ! -r "${proguard}" ]; then 111*055d4590SKeyi Gui proguard="${ANDROID_BUILD_TOP}"/external/proguard/bin/${proguardExec} 112*055d4590SKeyi Guifi 113*055d4590SKeyi Gui 114*055d4590SKeyi Guiif [ ! -r "${proguard}" ]; then 115*055d4590SKeyi Gui proguard="`which proguard`" 116*055d4590SKeyi Guifi 117*055d4590SKeyi Gui 118*055d4590SKeyi Guiif [ -z "${proguard}" -o ! -r "${proguard}" ]; then 119*055d4590SKeyi Gui proguard="`which ${proguardExec}`" 120*055d4590SKeyi Guifi 121*055d4590SKeyi Gui 122*055d4590SKeyi Guiif [ -z "${proguard}" -o ! -r "${proguard}" ]; then 123*055d4590SKeyi Gui echo `basename "$prog"`": can't find ${proguardExec}" 1>&2 124*055d4590SKeyi Gui exit 1 125*055d4590SKeyi Guifi 126*055d4590SKeyi Gui 127*055d4590SKeyi GuishrinkedAndroidJar="${SHRINKED_ANDROID_JAR}" 128*055d4590SKeyi Guiif [ -z "${shrinkedAndroidJar}" ]; then 129*055d4590SKeyi Gui shrinkedAndroidJar=shrinkedAndroid.jar 130*055d4590SKeyi Guifi 131*055d4590SKeyi Gui 132*055d4590SKeyi Guiif [ ! -r "${shrinkedAndroidJar}" ]; then 133*055d4590SKeyi Gui shrinkedAndroidJar=${libdir}/${shrinkedAndroidJar} 134*055d4590SKeyi Guifi 135*055d4590SKeyi Gui 136*055d4590SKeyi Guiif [ ! -r "${shrinkedAndroidJar}" ]; then 137*055d4590SKeyi Gui echo `basename "$prog"`": can't find shrinkedAndroid.jar" 1>&2 138*055d4590SKeyi Gui exit 1 139*055d4590SKeyi Guifi 140*055d4590SKeyi Gui 141*055d4590SKeyi Guiif [ "$OSTYPE" = "cygwin" ]; then 142*055d4590SKeyi Gui # For Cygwin, convert the jarfile path into native Windows style. 143*055d4590SKeyi Gui jarpath=`cygpath -w "$libdir/$jarfile"` 144*055d4590SKeyi Gui proguard=`cygpath -w "${proguard}"` 145*055d4590SKeyi Gui shrinkedAndroidJar=`cygpath -w "${shrinkedAndroidJar}"` 146*055d4590SKeyi Guielse 147*055d4590SKeyi Gui jarpath="$libdir/$jarfile" 148*055d4590SKeyi Guifi 149*055d4590SKeyi Gui 150*055d4590SKeyi GuidisableKeepAnnotated= 151*055d4590SKeyi Gui 152*055d4590SKeyi Guiwhile true; do 153*055d4590SKeyi Guiif expr "x$1" : 'x--output' >/dev/null; then 154*055d4590SKeyi Gui exec 1>$2 155*055d4590SKeyi Gui shift 2 156*055d4590SKeyi Guielif expr "x$1" : 'x--disable-annotation-resolution-workaround' >/dev/null; then 157*055d4590SKeyi Gui disableKeepAnnotated=$1 158*055d4590SKeyi Gui shift 1 159*055d4590SKeyi Guielif expr "x$1" : "x--aapt-rules" >/dev/null; then 160*055d4590SKeyi Gui extrarules=$2 161*055d4590SKeyi Gui shift 2 162*055d4590SKeyi Guielse 163*055d4590SKeyi Gui break 164*055d4590SKeyi Guifi 165*055d4590SKeyi Guidone 166*055d4590SKeyi Gui 167*055d4590SKeyi Guiif [ $# -ne 1 ]; then 168*055d4590SKeyi Gui echo "Usage : $0 [--output <output file>] <application path>" 1>&2 169*055d4590SKeyi Gui exit 2 170*055d4590SKeyi Guifi 171*055d4590SKeyi Gui 172*055d4590SKeyi GuitmpOut=`makeTempJar` 173*055d4590SKeyi Gui 174*055d4590SKeyi Guitrap cleanTmp 0 175*055d4590SKeyi Gui 176*055d4590SKeyi Gui"${proguard}" -injars ${@} -dontwarn -forceprocessing -outjars "${tmpOut}" \ 177*055d4590SKeyi Gui -libraryjars "${shrinkedAndroidJar}" -dontoptimize -dontobfuscate -dontpreverify \ 178*055d4590SKeyi Gui -include "${baserules}" -include "${extrarules}" 1>/dev/null || exit 10 179*055d4590SKeyi Gui 180*055d4590SKeyi Gui${JAVA} -cp "$jarpath" com.android.multidex.MainDexListBuilder ${disableKeepAnnotated} "${tmpOut}" ${@} || exit 11 181