| #!/bin/bash |
| # |
| # Copyright (C) 2013 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| function makeTempJar () |
| { |
| local tempDir=/tmp |
| if [ ! -e "${tempDir}" ]; then |
| tempDir=. |
| fi |
| local tempfile="${tempDir}/mainDexClasses-$$.tmp.jar" |
| if [ -e "${tempfile}" ]; then |
| echo "Failed to create temporary file" >2 |
| exit 6 |
| fi |
| echo "${tempfile}" |
| } |
| |
| function cleanTmp () |
| { |
| if [ -e "${tmpOut}" ] ; then |
| rm "${tmpOut}" |
| fi |
| } |
| |
| |
| # Set up prog to be the path of this script, including following symlinks, |
| # and set up progdir to be the fully-qualified pathname of its directory. |
| prog="$0" |
| |
| while [ -h "${prog}" ]; do |
| newProg=`/bin/ls -ld "${prog}"` |
| newProg=`expr "${newProg}" : ".* -> \(.*\)$"` |
| if expr "x${newProg}" : 'x/' >/dev/null; then |
| prog="${newProg}" |
| else |
| progdir=`dirname "${prog}"` |
| prog="${progdir}/${newProg}" |
| fi |
| done |
| oldwd=`pwd` |
| progdir=`dirname "${prog}"` |
| cd "${progdir}" |
| progdir=`pwd` |
| prog="${progdir}"/`basename "${prog}"` |
| cd "${oldwd}" |
| |
| baserules="${progdir}"/mainDexClasses.rules |
| if [ ! -r "${baserules}" ]; then |
| echo `basename "$prog"`": can't find mainDexClasses.rules" 1>&2 |
| exit 1 |
| fi |
| |
| extrarules="${progdir}"/mainDexClassesNoAapt.rules |
| if [ ! -r ${extrarules} ]; then |
| echo `basename "$prog"`": can't find mainDexClassesNoAapt.rules" 1>&2 |
| exit 1 |
| fi |
| |
| jarfile=dx.jar |
| libdir="$progdir" |
| |
| if [ ! -r "$libdir/$jarfile" ]; then |
| # set dx.jar location for the SDK case |
| libdir="$libdir/lib" |
| fi |
| |
| |
| if [ ! -r "$libdir/$jarfile" ]; then |
| # set dx.jar location for the Android tree case |
| libdir=`dirname "$progdir"`/framework |
| fi |
| |
| if [ ! -r "$libdir/$jarfile" ]; then |
| echo `basename "$prog"`": can't find $jarfile" 1>&2 |
| exit 1 |
| fi |
| |
| proguardExec="proguard.sh" |
| proguard=${PROGUARD_HOME}/bin/${proguardExec} |
| |
| if [ ! -r "${proguard}" ]; then |
| # set proguard location for the SDK case |
| proguardBaseDir=`dirname "$progdir"` |
| # "${progdir}"/../.. |
| proguardBaseDir=`dirname "$proguardBaseDir"` |
| proguard="${proguardBaseDir}"/tools/proguard/bin/${proguardExec} |
| fi |
| |
| if [ ! -r "${proguard}" ]; then |
| # set proguard location for the Android tree case |
| proguardBaseDir=`dirname "$proguardBaseDir"` |
| # "${progdir}"/../../../.. |
| proguardBaseDir=`dirname "$proguardBaseDir"` |
| proguard="${proguardBaseDir}"/external/proguard/bin/${proguardExec} |
| fi |
| |
| if [ ! -r "${proguard}" ]; then |
| proguard="${ANDROID_BUILD_TOP}"/external/proguard/bin/${proguardExec} |
| fi |
| |
| if [ ! -r "${proguard}" ]; then |
| proguard="`which proguard`" |
| fi |
| |
| if [ -z "${proguard}" -o ! -r "${proguard}" ]; then |
| proguard="`which ${proguardExec}`" |
| fi |
| |
| if [ -z "${proguard}" -o ! -r "${proguard}" ]; then |
| echo `basename "$prog"`": can't find ${proguardExec}" 1>&2 |
| exit 1 |
| fi |
| |
| shrinkedAndroidJar="${SHRINKED_ANDROID_JAR}" |
| if [ -z "${shrinkedAndroidJar}" ]; then |
| shrinkedAndroidJar=shrinkedAndroid.jar |
| fi |
| |
| if [ ! -r "${shrinkedAndroidJar}" ]; then |
| shrinkedAndroidJar=${libdir}/${shrinkedAndroidJar} |
| fi |
| |
| if [ ! -r "${shrinkedAndroidJar}" ]; then |
| echo `basename "$prog"`": can't find shrinkedAndroid.jar" 1>&2 |
| exit 1 |
| fi |
| |
| if [ "$OSTYPE" = "cygwin" ]; then |
| # For Cygwin, convert the jarfile path into native Windows style. |
| jarpath=`cygpath -w "$libdir/$jarfile"` |
| proguard=`cygpath -w "${proguard}"` |
| shrinkedAndroidJar=`cygpath -w "${shrinkedAndroidJar}"` |
| else |
| jarpath="$libdir/$jarfile" |
| fi |
| |
| disableKeepAnnotated= |
| |
| while true; do |
| if expr "x$1" : 'x--output' >/dev/null; then |
| exec 1>$2 |
| shift 2 |
| elif expr "x$1" : 'x--disable-annotation-resolution-workaround' >/dev/null; then |
| disableKeepAnnotated=$1 |
| shift 1 |
| elif expr "x$1" : "x--aapt-rules" >/dev/null; then |
| extrarules=$2 |
| shift 2 |
| else |
| break |
| fi |
| done |
| |
| if [ $# -ne 1 ]; then |
| echo "Usage : $0 [--output <output file>] <application path>" 1>&2 |
| exit 2 |
| fi |
| |
| tmpOut=`makeTempJar` |
| |
| trap cleanTmp 0 |
| |
| "${proguard}" -injars ${@} -dontwarn -forceprocessing -outjars "${tmpOut}" \ |
| -libraryjars "${shrinkedAndroidJar}" -dontoptimize -dontobfuscate -dontpreverify \ |
| -include "${baserules}" -include "${extrarules}" 1>/dev/null || exit 10 |
| |
| java -cp "$jarpath" com.android.multidex.MainDexListBuilder ${disableKeepAnnotated} "${tmpOut}" ${@} || exit 11 |