#!/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 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 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}" 1>/dev/null || exit 10 java -cp "$jarpath" com.android.multidex.MainDexListBuilder ${disableKeepAnnotated} "${tmpOut}" ${@} || exit 11