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