12bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel#!/bin/bash 22bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# 32bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# Copyright (C) 2013 The Android Open Source Project 42bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# 52bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# Licensed under the Apache License, Version 2.0 (the "License"); 62bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# you may not use this file except in compliance with the License. 72bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# You may obtain a copy of the License at 82bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# 92bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# http://www.apache.org/licenses/LICENSE-2.0 102bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# 112bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# Unless required by applicable law or agreed to in writing, software 122bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# distributed under the License is distributed on an "AS IS" BASIS, 132bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# See the License for the specific language governing permissions and 152bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# limitations under the License. 162bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 172bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfunction makeTempJar () 182bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel{ 192bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel local tempDir=/tmp 2098353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel if [ ! -e "${tempDir}" ]; then 212bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel tempDir=. 222bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel fi 232bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel local tempfile="${tempDir}/mainDexClasses-$$.tmp.jar" 2498353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel if [ -e "${tempfile}" ]; then 252bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo "Failed to create temporary file" >2 262bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 6 272bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel fi 2898353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel echo "${tempfile}" 292bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel} 302bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 312bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfunction cleanTmp () 322bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel{ 3398353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel if [ -e "${tmpOut}" ] ; then 3498353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel rm "${tmpOut}" 352bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel fi 362bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel} 372bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 382bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 392bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# Set up prog to be the path of this script, including following symlinks, 402bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel# and set up progdir to be the fully-qualified pathname of its directory. 412bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselprog="$0" 422bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 432bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselwhile [ -h "${prog}" ]; do 442bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel newProg=`/bin/ls -ld "${prog}"` 452bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel newProg=`expr "${newProg}" : ".* -> \(.*\)$"` 462bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel if expr "x${newProg}" : 'x/' >/dev/null; then 472bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel prog="${newProg}" 482bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel else 492bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel progdir=`dirname "${prog}"` 502bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel prog="${progdir}/${newProg}" 512bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel fi 522bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousseldone 532bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousseloldwd=`pwd` 542bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselprogdir=`dirname "${prog}"` 552bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselcd "${progdir}" 562bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselprogdir=`pwd` 572bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselprog="${progdir}"/`basename "${prog}"` 582bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselcd "${oldwd}" 592bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 602bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselbaserules="${progdir}"/mainDexClasses.rules 615a4dc378e2ae9e7a2d8e40fbabf9c66c162bc294Yohann Rousselif [ ! -r "${baserules}" ]; then 622bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo `basename "$prog"`": can't find mainDexClasses.rules" 1>&2 632bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 1 642bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 652bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 668580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawalextrarules="${progdir}"/mainDexClassesNoAapt.rules 678580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawalif [ ! -r ${extrarules} ]; then 688580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawal echo `basename "$prog"`": can't find mainDexClassesNoAapt.rules" 1>&2 698580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawal exit 1 708580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawalfi 718580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawal 722bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousseljarfile=dx.jar 732bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussellibdir="$progdir" 742bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 752bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif [ ! -r "$libdir/$jarfile" ]; then 762bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel # set dx.jar location for the SDK case 7798353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel libdir="$libdir/lib" 782bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 792bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 802bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 812bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif [ ! -r "$libdir/$jarfile" ]; then 822bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel # set dx.jar location for the Android tree case 832bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel libdir=`dirname "$progdir"`/framework 842bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 852bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 862bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif [ ! -r "$libdir/$jarfile" ]; then 872bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo `basename "$prog"`": can't find $jarfile" 1>&2 882bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 1 892bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 902bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 912bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann RousselproguardExec="proguard.sh" 9298353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselproguard=${PROGUARD_HOME}/bin/${proguardExec} 932bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 9498353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ ! -r "${proguard}" ]; then 952bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel # set proguard location for the SDK case 962bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguardBaseDir=`dirname "$progdir"` 9798353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel # "${progdir}"/../.. 982bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguardBaseDir=`dirname "$proguardBaseDir"` 992bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguard="${proguardBaseDir}"/tools/proguard/bin/${proguardExec} 1002bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1012bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 10298353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ ! -r "${proguard}" ]; then 1032bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel # set proguard location for the Android tree case 1042bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguardBaseDir=`dirname "$proguardBaseDir"` 10598353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel # "${progdir}"/../../../.. 1062bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguardBaseDir=`dirname "$proguardBaseDir"` 1072bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguard="${proguardBaseDir}"/external/proguard/bin/${proguardExec} 1082bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1092bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 11098353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ ! -r "${proguard}" ]; then 1116983ab835c365b8576868f5bc94ba28824575a04Andreas Gampe proguard="${ANDROID_BUILD_TOP}"/external/proguard/bin/${proguardExec} 1126983ab835c365b8576868f5bc94ba28824575a04Andreas Gampefi 1136983ab835c365b8576868f5bc94ba28824575a04Andreas Gampe 1146983ab835c365b8576868f5bc94ba28824575a04Andreas Gampeif [ ! -r "${proguard}" ]; then 11598353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel proguard="`which proguard`" 11698353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselfi 11798353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel 11898353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ -z "${proguard}" -o ! -r "${proguard}" ]; then 11998353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel proguard="`which ${proguardExec}`" 12098353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselfi 12198353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Roussel 12298353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ -z "${proguard}" -o ! -r "${proguard}" ]; then 1232bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo `basename "$prog"`": can't find ${proguardExec}" 1>&2 1242bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 1 1252bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1262bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 12798353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann RousselshrinkedAndroidJar="${SHRINKED_ANDROID_JAR}" 12898353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ -z "${shrinkedAndroidJar}" ]; then 1292bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel shrinkedAndroidJar=shrinkedAndroid.jar 1302bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1312bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 13298353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ ! -r "${shrinkedAndroidJar}" ]; then 1332bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel shrinkedAndroidJar=${libdir}/${shrinkedAndroidJar} 1342bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1352bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 13698353f0b5c85d6c957c3c50f2bc327188b61c6e4Yohann Rousselif [ ! -r "${shrinkedAndroidJar}" ]; then 1372bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo `basename "$prog"`": can't find shrinkedAndroid.jar" 1>&2 1382bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 1 1392bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1402bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 1412bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif [ "$OSTYPE" = "cygwin" ]; then 1422bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel # For Cygwin, convert the jarfile path into native Windows style. 1432bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel jarpath=`cygpath -w "$libdir/$jarfile"` 1442bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel proguard=`cygpath -w "${proguard}"` 1452bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel shrinkedAndroidJar=`cygpath -w "${shrinkedAndroidJar}"` 1462bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselelse 1472bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel jarpath="$libdir/$jarfile" 1482bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1492bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 150a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann RousseldisableKeepAnnotated= 151a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Roussel 152a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Rousselwhile true; do 1532bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif expr "x$1" : 'x--output' >/dev/null; then 1542bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exec 1>$2 1552bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel shift 2 156a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Rousselelif expr "x$1" : 'x--disable-annotation-resolution-workaround' >/dev/null; then 157a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Roussel disableKeepAnnotated=$1 158a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Roussel shift 1 1598580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawalelif expr "x$1" : "x--aapt-rules" >/dev/null; then 1608580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawal extrarules=$2 1618580bee2e934d0764324e746a092d2aa4f9330f5Rohit Agrawal shift 2 162a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Rousselelse 163a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Roussel break 1642bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 165a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Rousseldone 1662bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 1672bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselif [ $# -ne 1 ]; then 1682bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel echo "Usage : $0 [--output <output file>] <application path>" 1>&2 1692bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel exit 2 1702bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousselfi 1712bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 1722bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann RousseltmpOut=`makeTempJar` 1732bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 1742bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Rousseltrap cleanTmp 0 1752bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 1765a4dc378e2ae9e7a2d8e40fbabf9c66c162bc294Yohann Roussel"${proguard}" -injars ${@} -dontwarn -forceprocessing -outjars "${tmpOut}" \ 1772bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel -libraryjars "${shrinkedAndroidJar}" -dontoptimize -dontobfuscate -dontpreverify \ 17802c20f306c45f0f077416c4271e2ae4410874292Colin Cross -include "${baserules}" -include "${extrarules}" 1>/dev/null || exit 10 1792bb6fe45bf620525ba34bd7303d7ecb597aa0689Yohann Roussel 180a4a5e989c6baa8d8cac17483044f2076bf55ec80Yohann Rousseljava -cp "$jarpath" com.android.multidex.MainDexListBuilder ${disableKeepAnnotated} "${tmpOut}" ${@} || exit 11 181