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