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
66extrarules="${progdir}"/mainDexClassesNoAapt.rules
67if [ ! -r ${extrarules} ]; then
68    echo `basename "$prog"`": can't find mainDexClassesNoAapt.rules" 1>&2
69    exit 1
70fi
71
72jarfile=dx.jar
73libdir="$progdir"
74
75if [ ! -r "$libdir/$jarfile" ]; then
76    # set dx.jar location for the SDK case
77    libdir="$libdir/lib"
78fi
79
80
81if [ ! -r "$libdir/$jarfile" ]; then
82    # set dx.jar location for the Android tree case
83    libdir=`dirname "$progdir"`/framework
84fi
85
86if [ ! -r "$libdir/$jarfile" ]; then
87    echo `basename "$prog"`": can't find $jarfile" 1>&2
88    exit 1
89fi
90
91proguardExec="proguard.sh"
92proguard=${PROGUARD_HOME}/bin/${proguardExec}
93
94if [ ! -r "${proguard}" ]; then
95  # set proguard location for the SDK case
96  proguardBaseDir=`dirname "$progdir"`
97  # "${progdir}"/../..
98  proguardBaseDir=`dirname "$proguardBaseDir"`
99  proguard="${proguardBaseDir}"/tools/proguard/bin/${proguardExec}
100fi
101
102if [ ! -r "${proguard}" ]; then
103  # set proguard location for the Android tree case
104  proguardBaseDir=`dirname "$proguardBaseDir"`
105  # "${progdir}"/../../../..
106  proguardBaseDir=`dirname "$proguardBaseDir"`
107  proguard="${proguardBaseDir}"/external/proguard/bin/${proguardExec}
108fi
109
110if [ ! -r "${proguard}" ]; then
111  proguard="${ANDROID_BUILD_TOP}"/external/proguard/bin/${proguardExec}
112fi
113
114if [ ! -r "${proguard}" ]; then
115    proguard="`which proguard`"
116fi
117
118if [ -z "${proguard}" -o ! -r "${proguard}" ]; then
119    proguard="`which ${proguardExec}`"
120fi
121
122if [ -z "${proguard}" -o ! -r "${proguard}" ]; then
123    echo `basename "$prog"`": can't find ${proguardExec}" 1>&2
124    exit 1
125fi
126
127shrinkedAndroidJar="${SHRINKED_ANDROID_JAR}"
128if [ -z "${shrinkedAndroidJar}" ]; then
129  shrinkedAndroidJar=shrinkedAndroid.jar
130fi
131
132if [ ! -r "${shrinkedAndroidJar}" ]; then
133  shrinkedAndroidJar=${libdir}/${shrinkedAndroidJar}
134fi
135
136if [ ! -r "${shrinkedAndroidJar}" ]; then
137    echo `basename "$prog"`": can't find shrinkedAndroid.jar" 1>&2
138    exit 1
139fi
140
141if [ "$OSTYPE" = "cygwin" ]; then
142    # For Cygwin, convert the jarfile path into native Windows style.
143    jarpath=`cygpath -w "$libdir/$jarfile"`
144  proguard=`cygpath -w "${proguard}"`
145  shrinkedAndroidJar=`cygpath -w "${shrinkedAndroidJar}"`
146else
147    jarpath="$libdir/$jarfile"
148fi
149
150disableKeepAnnotated=
151
152while true; do
153if expr "x$1" : 'x--output' >/dev/null; then
154    exec 1>$2
155    shift 2
156elif expr "x$1" : 'x--disable-annotation-resolution-workaround' >/dev/null; then
157    disableKeepAnnotated=$1
158    shift 1
159elif expr "x$1" : "x--aapt-rules" >/dev/null; then
160    extrarules=$2
161    shift 2
162else
163    break
164fi
165done
166
167if [ $# -ne 1 ]; then
168  echo "Usage : $0 [--output <output file>] <application path>" 1>&2
169  exit 2
170fi
171
172tmpOut=`makeTempJar`
173
174trap cleanTmp 0
175
176"${proguard}" -injars ${@} -dontwarn -forceprocessing  -outjars "${tmpOut}" \
177  -libraryjars "${shrinkedAndroidJar}" -dontoptimize -dontobfuscate -dontpreverify \
178  -include "${baserules}" -include "${extrarules}" 1>/dev/null || exit 10
179
180java -cp "$jarpath" com.android.multidex.MainDexListBuilder ${disableKeepAnnotated} "${tmpOut}" ${@} ||  exit 11
181