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