1*055d4590SKeyi Gui@echo off 2*055d4590SKeyi GuiREM Copyright (C) 2013 The Android Open Source Project 3*055d4590SKeyi GuiREM 4*055d4590SKeyi GuiREM Licensed under the Apache License, Version 2.0 (the "License"); 5*055d4590SKeyi GuiREM you may not use this file except in compliance with the License. 6*055d4590SKeyi GuiREM You may obtain a copy of the License at 7*055d4590SKeyi GuiREM 8*055d4590SKeyi GuiREM http://www.apache.org/licenses/LICENSE-2.0 9*055d4590SKeyi GuiREM 10*055d4590SKeyi GuiREM Unless required by applicable law or agreed to in writing, software 11*055d4590SKeyi GuiREM distributed under the License is distributed on an "AS IS" BASIS, 12*055d4590SKeyi GuiREM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*055d4590SKeyi GuiREM See the License for the specific language governing permissions and 14*055d4590SKeyi GuiREM limitations under the License. 15*055d4590SKeyi Gui 16*055d4590SKeyi GuiREM don't modify the caller's environment 17*055d4590SKeyi Guisetlocal 18*055d4590SKeyi Gui 19*055d4590SKeyi Gui@rem Find java.exe 20*055d4590SKeyi Guiif defined JAVA_HOME goto findJavaFromJavaHome 21*055d4590SKeyi Gui 22*055d4590SKeyi Guiset JAVA_EXE=java.exe 23*055d4590SKeyi Gui%JAVA_EXE% -version >NUL 2>&1 24*055d4590SKeyi Guiif "%ERRORLEVEL%" == "0" goto init 25*055d4590SKeyi Gui 26*055d4590SKeyi Guiecho. 27*055d4590SKeyi Guiecho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28*055d4590SKeyi Guiecho. 29*055d4590SKeyi Guiecho Please set the JAVA_HOME variable in your environment to match the 30*055d4590SKeyi Guiecho location of your Java installation. 31*055d4590SKeyi Guiexit /b 1 32*055d4590SKeyi Gui 33*055d4590SKeyi Gui:findJavaFromJavaHome 34*055d4590SKeyi Guiset JAVA_HOME=%JAVA_HOME:"=% 35*055d4590SKeyi Guiset JAVA_EXE=%JAVA_HOME%/bin/java.exe 36*055d4590SKeyi Gui 37*055d4590SKeyi Guiif exist "%JAVA_EXE%" goto init 38*055d4590SKeyi Gui 39*055d4590SKeyi Guiecho. 40*055d4590SKeyi Guiecho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 41*055d4590SKeyi Guiecho. 42*055d4590SKeyi Guiecho Please set the JAVA_HOME variable in your environment to match the 43*055d4590SKeyi Guiecho location of your Java installation. 44*055d4590SKeyi Guiexit /b 1 45*055d4590SKeyi Gui 46*055d4590SKeyi Gui:init 47*055d4590SKeyi Guiset baserules="%~dp0\mainDexClasses.rules" 48*055d4590SKeyi Guiset extrarules="%~dp0\mainDexClassesNoAapt.rules" 49*055d4590SKeyi Gui 50*055d4590SKeyi GuiREM Locate dx.jar in the directory where dx.bat was found. 51*055d4590SKeyi Guiset jarfile=dx.jar 52*055d4590SKeyi Guiset "frameworkdir=%~dp0" 53*055d4590SKeyi Guirem frameworkdir must not end with a dir sep. 54*055d4590SKeyi Guiset "frameworkdir=%frameworkdir:~0,-1%" 55*055d4590SKeyi Guiif exist "%frameworkdir%\%jarfile%" goto JarFileOk 56*055d4590SKeyi Gui set "frameworkdir=%~dp0lib" 57*055d4590SKeyi Gui 58*055d4590SKeyi Guiif exist "%frameworkdir%\%jarfile%" goto JarFileOk 59*055d4590SKeyi Gui set "frameworkdir=%~dp0..\framework" 60*055d4590SKeyi Gui:JarFileOk 61*055d4590SKeyi Gui 62*055d4590SKeyi Guiset "jarpath=%frameworkdir%\%jarfile%" 63*055d4590SKeyi Gui 64*055d4590SKeyi Guiset "shrinkedAndroidJar=%SHRINKED_ANDROID_JAR% 65*055d4590SKeyi Guiif exist "%shrinkedAndroidJar%" goto shrinkedAndroidOk 66*055d4590SKeyi Gui set "shrinkedAndroidJar=shrinkedAndroid.jar" 67*055d4590SKeyi Gui 68*055d4590SKeyi Guiif exist "%shrinkedAndroidJar%" goto shrinkedAndroidOk 69*055d4590SKeyi Gui set "shrinkedAndroidJar=%frameworkdir%\%shrinkedAndroidJar%" 70*055d4590SKeyi Gui 71*055d4590SKeyi Gui:shrinkedAndroidOk 72*055d4590SKeyi Guiset "proguardExec=proguard.bat" 73*055d4590SKeyi Guiset "proguard=%PROGUARD_HOME%\bin\%proguardExec%" 74*055d4590SKeyi Gui 75*055d4590SKeyi Guiif exist "%proguard%" goto proguardOk 76*055d4590SKeyi GuiREM set proguard location for the SDK case 77*055d4590SKeyi Gui set "PROGUARD_HOME=%~dp0\..\..\tools\proguard" 78*055d4590SKeyi Gui set "proguard=%PROGUARD_HOME%\bin\%proguardExec%" 79*055d4590SKeyi Gui 80*055d4590SKeyi Guiif exist "%proguard%" goto proguardOk 81*055d4590SKeyi GuiREM set proguard location for the Android tree case 82*055d4590SKeyi Gui set "PROGUARD_HOME=%~dp0\..\..\..\..\external\proguard" 83*055d4590SKeyi Gui set "proguard=%PROGUARD_HOME%\bin\%proguardExec%" 84*055d4590SKeyi Gui 85*055d4590SKeyi Gui:proguardOk 86*055d4590SKeyi GuiREM Capture all arguments. 87*055d4590SKeyi GuiREM Note that when reading the input arguments with %1, the cmd.exe 88*055d4590SKeyi GuiREM automagically converts --name=value arguments into 2 arguments "--name" 89*055d4590SKeyi GuiREM followed by "value". Dx has been changed to know how to deal with that. 90*055d4590SKeyi Guiset params= 91*055d4590SKeyi Gui 92*055d4590SKeyi Guiset output= 93*055d4590SKeyi Guiset disableKeepAnnotated= 94*055d4590SKeyi Gui 95*055d4590SKeyi Gui:firstArg 96*055d4590SKeyi Guiif [%1]==[] goto endArgs 97*055d4590SKeyi Gui 98*055d4590SKeyi Gui if %1 NEQ --output goto notOut 99*055d4590SKeyi Gui set "output=%2" 100*055d4590SKeyi Gui shift 101*055d4590SKeyi Gui shift 102*055d4590SKeyi Gui goto firstArg 103*055d4590SKeyi Gui 104*055d4590SKeyi Gui:notOut 105*055d4590SKeyi Gui 106*055d4590SKeyi Gui if %1 NEQ --disable-annotation-resolution-workaround goto notDisable 107*055d4590SKeyi Gui set "disableKeepAnnotated=%1" 108*055d4590SKeyi Gui shift 109*055d4590SKeyi Gui goto firstArg 110*055d4590SKeyi Gui 111*055d4590SKeyi Gui:notDisable 112*055d4590SKeyi Gui 113*055d4590SKeyi Gui if %1 NEQ --aapt-rules goto notAapt 114*055d4590SKeyi Gui set "extrarules=%2" 115*055d4590SKeyi Gui shift 116*055d4590SKeyi Gui shift 117*055d4590SKeyi Gui goto firstArg 118*055d4590SKeyi Gui 119*055d4590SKeyi Gui:notAapt 120*055d4590SKeyi Gui if defined params goto usage 121*055d4590SKeyi Gui set params=%1 122*055d4590SKeyi Gui shift 123*055d4590SKeyi Gui goto firstArg 124*055d4590SKeyi Gui 125*055d4590SKeyi Gui:endArgs 126*055d4590SKeyi Guiif defined params ( goto makeTmpJar ) else ( goto usage ) 127*055d4590SKeyi Gui 128*055d4590SKeyi Gui:makeTmpJar 129*055d4590SKeyi Guiset "tmpJar=%TMP%\mainDexClasses-%RANDOM%.tmp.jar" 130*055d4590SKeyi Guiif exist "%tmpJar%" goto makeTmpJar 131*055d4590SKeyi Guiecho "" > "%tmpJar%" 132*055d4590SKeyi Guiset "exitStatus=0" 133*055d4590SKeyi Gui 134*055d4590SKeyi Gui 135*055d4590SKeyi Guicall "%proguard%" -injars %params% -dontwarn -forceprocessing -outjars "%tmpJar%" -libraryjars "%shrinkedAndroidJar%" -dontoptimize -dontobfuscate -dontpreverify -include "%baserules%" -include "%extrarules%" 1>nul 136*055d4590SKeyi Gui 137*055d4590SKeyi Guiif DEFINED output goto redirect 138*055d4590SKeyi Guicall "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" "%params%" 139*055d4590SKeyi Guigoto afterClassReferenceListBuilder 140*055d4590SKeyi Gui:redirect 141*055d4590SKeyi Guicall "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" "%params%" 1>"%output%" 142*055d4590SKeyi Gui:afterClassReferenceListBuilder 143*055d4590SKeyi Gui 144*055d4590SKeyi Guidel %tmpJar% 145*055d4590SKeyi Guiexit /b 146*055d4590SKeyi Gui 147*055d4590SKeyi Gui:usage 148*055d4590SKeyi Guiecho "Usage : %0 [--output <output file>] <application path>" 149*055d4590SKeyi Guiexit /b 1 150