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