Home | History | Annotate | Download | only in etc
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2008 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 
     17 # Stop if something fails.
     18 set -e
     19 
     20 if [[ $# -le 0 ]]; then
     21   echo 'Error:' '$0 should have the parameters from the "build" script forwarded to it' >&2
     22   echo 'Error: An example of how do it correctly is ./default-build "$@"'
     23   exit 1
     24 fi
     25 
     26 # Set default values for directories.
     27 if [ -d smali ]; then
     28   HAS_SMALI=true
     29 else
     30   HAS_SMALI=false
     31 fi
     32 
     33 # .j files in jasmin get compiled into classes.jar
     34 if [ -d jasmin ]; then
     35   HAS_JASMIN=true
     36 else
     37   HAS_JASMIN=false
     38 fi
     39 
     40 if [ -d src ]; then
     41   HAS_SRC=true
     42 else
     43   HAS_SRC=false
     44 fi
     45 
     46 # .java files in src-art get compiled with libcore on the bootclasspath
     47 if [ -d src-art ]; then
     48   HAS_SRC_ART=true
     49 else
     50   HAS_SRC_ART=false
     51 fi
     52 
     53 if [ -d src2 ]; then
     54   HAS_SRC2=true
     55 else
     56   HAS_SRC2=false
     57 fi
     58 
     59 if [ -d src-multidex ]; then
     60   HAS_SRC_MULTIDEX=true
     61 else
     62   HAS_SRC_MULTIDEX=false
     63 fi
     64 
     65 if [ -d smali-multidex ]; then
     66   HAS_SMALI_MULTIDEX=true
     67 else
     68   HAS_SMALI_MULTIDEX=false
     69 fi
     70 
     71 # .j files in jasmin-multidex get compiled into classes2.jar
     72 if [ -d jasmin-multidex ]; then
     73   HAS_JASMIN_MULTIDEX=true
     74 else
     75   HAS_JASMIN_MULTIDEX=false
     76 fi
     77 
     78 if [ -d src-ex ]; then
     79   HAS_SRC_EX=true
     80 else
     81   HAS_SRC_EX=false
     82 fi
     83 
     84 if [ -d src-dex2oat-unresolved ]; then
     85   HAS_SRC_DEX2OAT_UNRESOLVED=true
     86 else
     87   HAS_SRC_DEX2OAT_UNRESOLVED=false
     88 fi
     89 
     90 if [ -f api-light-greylist.txt -o -f api-dark-greylist.txt -o -f api-blacklist.txt ]; then
     91   HAS_HIDDENAPI_SPEC=true
     92 else
     93   HAS_HIDDENAPI_SPEC=false
     94 fi
     95 
     96 # USE_HIDDENAPI=false run-test... will disable hiddenapi.
     97 if [ -z "${USE_HIDDENAPI}" ]; then
     98   USE_HIDDENAPI=true
     99 fi
    100 
    101 # DESUGAR=false run-test... will disable desugar.
    102 if [[ "$DESUGAR" == false ]]; then
    103   USE_DESUGAR=false
    104 fi
    105 
    106 # Allow overriding ZIP_COMPRESSION_METHOD with e.g. 'store'
    107 ZIP_COMPRESSION_METHOD="deflate"
    108 # Align every ZIP file made by calling $ZIPALIGN command?
    109 WITH_ZIP_ALIGN=false
    110 ZIP_ALIGN_BYTES="-1"
    111 
    112 DX_FLAGS="--min-sdk-version=24"
    113 DX_VM_FLAGS=""
    114 EXPERIMENTAL=""
    115 
    116 BUILD_MODE="target"
    117 DEV_MODE="no"
    118 
    119 # The key for default arguments if no experimental things are enabled.
    120 DEFAULT_EXPERIMENT="no-experiment"
    121 
    122 # Setup experimental flag mappings in a bash associative array.
    123 declare -A JACK_EXPERIMENTAL_ARGS
    124 JACK_EXPERIMENTAL_ARGS["agents"]="-D jack.java.source.version=1.8 -D jack.android.min-api-level=24"
    125 JACK_EXPERIMENTAL_ARGS["default-methods"]="-D jack.java.source.version=1.8 -D jack.android.min-api-level=24"
    126 JACK_EXPERIMENTAL_ARGS["lambdas"]="-D jack.java.source.version=1.8 -D jack.android.min-api-level=24"
    127 JACK_EXPERIMENTAL_ARGS["method-handles"]="-D jack.java.source.version=1.7 -D jack.android.min-api-level=o-b1"
    128 JACK_EXPERIMENTAL_ARGS[${DEFAULT_EXPERIMENT}]="-D jack.java.source.version=1.8 -D jack.android.min-api-level=24"
    129 
    130 declare -A SMALI_EXPERIMENTAL_ARGS
    131 SMALI_EXPERIMENTAL_ARGS["default-methods"]="--api 24"
    132 SMALI_EXPERIMENTAL_ARGS["method-handles"]="--api 26"
    133 SMALI_EXPERIMENTAL_ARGS["var-handles"]="--api 26"
    134 SMALI_EXPERIMENTAL_ARGS["agents"]="--api 26"
    135 
    136 declare -A JAVAC_EXPERIMENTAL_ARGS
    137 JAVAC_EXPERIMENTAL_ARGS["default-methods"]="-source 1.8 -target 1.8"
    138 JAVAC_EXPERIMENTAL_ARGS["lambdas"]="-source 1.8 -target 1.8"
    139 JAVAC_EXPERIMENTAL_ARGS["method-handles"]="-source 1.8 -target 1.8"
    140 JAVAC_EXPERIMENTAL_ARGS["parameter-annotations"]="-source 1.8 -target 1.8"
    141 JAVAC_EXPERIMENTAL_ARGS["var-handles"]="-source 1.8 -target 1.8"
    142 JAVAC_EXPERIMENTAL_ARGS[${DEFAULT_EXPERIMENT}]="-source 1.8 -target 1.8"
    143 JAVAC_EXPERIMENTAL_ARGS["agents"]="-source 1.8 -target 1.8"
    144 
    145 declare -A DX_EXPERIMENTAL_ARGS
    146 DX_EXPERIMENTAL_ARGS["method-handles"]="--min-sdk-version=26"
    147 DX_EXPERIMENTAL_ARGS["parameter-annotations"]="--min-sdk-version=25"
    148 DX_EXPERIMENTAL_ARGS["var-handles"]="--min-sdk-version=26"
    149 
    150 while true; do
    151   if [ "x$1" = "x--dx-option" ]; then
    152     shift
    153     option="$1"
    154     DX_FLAGS="${DX_FLAGS} $option"
    155     shift
    156   elif [ "x$1" = "x--dx-vm-option" ]; then
    157     shift
    158     option="$1"
    159     DX_VM_FLAGS="${DX_VM_FLAGS} $option"
    160     shift
    161   elif [ "x$1" = "x--no-src" ]; then
    162     HAS_SRC=false
    163     shift
    164   elif [ "x$1" = "x--no-src2" ]; then
    165     HAS_SRC2=false
    166     shift
    167   elif [ "x$1" = "x--no-src-multidex" ]; then
    168     HAS_SRC_MULTIDEX=false
    169     shift
    170   elif [ "x$1" = "x--no-smali-multidex" ]; then
    171     HAS_SMALI_MULTIDEX=false
    172     shift
    173   elif [ "x$1" = "x--no-src-ex" ]; then
    174     HAS_SRC_EX=false
    175     shift
    176   elif [ "x$1" = "x--no-smali" ]; then
    177     HAS_SMALI=false
    178     shift
    179   elif [ "x$1" = "x--experimental" ]; then
    180     shift
    181     # We have a specific experimental configuration so don't use the default.
    182     DEFAULT_EXPERIMENT=""
    183     EXPERIMENTAL="${EXPERIMENTAL} $1"
    184     shift
    185   elif [ "x$1" = "x--zip-compression-method" ]; then
    186     # Allow using different zip compression method, e.g. 'store'
    187     shift
    188     ZIP_COMPRESSION_METHOD="$1"
    189     shift
    190   elif [ "x$1" = "x--zip-align" ]; then
    191     # Align ZIP entries to some # of bytes.
    192     shift
    193     WITH_ZIP_ALIGN=true
    194     ZIP_ALIGN_BYTES="$1"
    195     shift
    196   elif [ "x$1" = "x--host" ]; then
    197     BUILD_MODE="host"
    198     shift
    199   elif [ "x$1" = "x--target" ]; then
    200     BUILD_MODE="target"
    201     shift
    202   elif [ "x$1" = "x--jvm" ]; then
    203     BUILD_MODE="jvm"
    204     shift
    205   elif [ "x$1" = "x--dev" ]; then
    206     DEV_MODE="yes"
    207     shift
    208   elif expr "x$1" : "x--" >/dev/null 2>&1; then
    209     echo "unknown $0 option: $1" 1>&2
    210     exit 1
    211   else
    212     break
    213   fi
    214 done
    215 
    216 if [[ $BUILD_MODE == jvm ]]; then
    217   # Does not need desugar on jvm because it supports the latest functionality.
    218   USE_DESUGAR=false
    219   # Do not attempt to build src-art directories on jvm, it would fail without libcore.
    220   HAS_SRC_ART=false
    221 fi
    222 
    223 # Be sure to get any default arguments if not doing any experiments.
    224 EXPERIMENTAL="${EXPERIMENTAL} ${DEFAULT_EXPERIMENT}"
    225 
    226 if [ "${JACK_SERVER}" = "false" ]; then
    227   # Run in single-threaded mode for the continuous buildbot.
    228   JACK_ARGS="${JACK_ARGS} -D sched.runner=single-threaded"
    229 else
    230   # Run with 4 threads to reduce memory footprint and thread contention.
    231   JACK_ARGS="${JACK_ARGS} -D sched.runner=multi-threaded"
    232   JACK_ARGS="${JACK_ARGS} -D sched.runner.thread.kind=fixed"
    233   JACK_ARGS="${JACK_ARGS} -D sched.runner.thread.fixed.count=4"
    234 fi
    235 
    236 # Add args from the experimental mappings.
    237 for experiment in ${EXPERIMENTAL}; do
    238   JACK_ARGS="${JACK_ARGS} ${JACK_EXPERIMENTAL_ARGS[${experiment}]}"
    239   SMALI_ARGS="${SMALI_ARGS} ${SMALI_EXPERIMENTAL_ARGS[${experiment}]}"
    240   JAVAC_ARGS="${JAVAC_ARGS} ${JAVAC_EXPERIMENTAL_ARGS[${experiment}]}"
    241   DX_FLAGS="${DX_FLAGS} ${DX_EXPERIMENTAL_ARGS[${experiment}]}"
    242 done
    243 
    244 #########################################
    245 
    246 # Catch all commands to 'ZIP' and prepend extra flags.
    247 # Optionally, zipalign results to some alignment.
    248 function zip() {
    249   local zip_target="$1"
    250   local entry_src="$2"
    251   shift 2
    252 
    253   command zip --compression-method "$ZIP_COMPRESSION_METHOD" "$zip_target" "$entry_src" "$@"
    254 
    255   if "$WITH_ZIP_ALIGN"; then
    256     # zipalign does not operate in-place, so write results to a temp file.
    257     local tmp_file="$(mktemp)"
    258     "$ZIPALIGN" -f "$ZIP_ALIGN_BYTES" "$zip_target" "$tmp_file"
    259     # replace original zip target with our temp file.
    260     mv "$tmp_file" "$zip_target"
    261   fi
    262 }
    263 
    264 function make_jasmin() {
    265   local out_directory="$1"
    266   shift
    267   local jasmin_sources=("$@")
    268 
    269   mkdir -p "$out_directory"
    270 
    271   if [[ $DEV_MODE == yes ]]; then
    272     echo ${JASMIN} -d "$out_directory" "${jasmin_sources[@]}"
    273     ${JASMIN} -d "$out_directory" "${jasmin_sources[@]}"
    274   else
    275     ${JASMIN} -d "$out_directory" "${jasmin_sources[@]}" >/dev/null
    276   fi
    277 }
    278 
    279 function desugar() {
    280   local desugar_args="--mode=$BUILD_MODE"
    281 
    282   if [[ $DEV_MODE == yes ]]; then
    283     desugar_args="$desugar_args --show-commands"
    284   fi
    285 
    286   "$DESUGAR" --core-only $desugar_args "$@"
    287 }
    288 
    289 # Like regular javac but may include libcore on the bootclasspath.
    290 function javac_with_bootclasspath {
    291   local helper_args="--mode=$BUILD_MODE"
    292 
    293   if [[ $DEV_MODE == yes ]]; then
    294     helper_args="$helper_args --show-commands"
    295   fi
    296 
    297   # build with libcore for host and target, or openjdk for jvm
    298   "$ANDROID_BUILD_TOP/art/tools/javac-helper.sh" --core-only $helper_args ${JAVAC_ARGS} "$@"
    299 }
    300 
    301 # Make a "dex" file given a directory of classes in $1.
    302 # Also calls desugar on the classes first to convert lambdas.
    303 function make_dex() {
    304   local name="$1"
    305 
    306   local dx_input
    307   if [[ "$USE_DESUGAR" == "true" ]]; then
    308     # Make a jar first so desugar doesn't need every .class file individually.
    309     jar cf "$name.before-desugar.jar" -C "$name" .
    310 
    311     dx_input="${name}.desugar.jar"
    312 
    313     # Make desugared JAR.
    314     desugar --input "$name.before-desugar.jar" --output "$dx_input"
    315   else
    316     dx_input="${name}"
    317   fi
    318 
    319   local dexer="${DX}"
    320   if [ ${USE_D8} = "true" ]; then
    321     dexer="${ANDROID_HOST_OUT}/bin/d8-compat-dx"
    322   fi
    323 
    324   # Make dex file from desugared JAR.
    325   ${dexer} -JXmx256m ${DX_VM_FLAGS} --debug --dex --dump-to=${name}.lst --output=${name}.dex --dump-width=1000 ${DX_FLAGS} "${dx_input}"
    326 }
    327 
    328 # Merge all the dex files in $1..$N into $1. Skip non-existing files, but at least 1 file must exist.
    329 function make_dexmerge() {
    330   # Dex file that acts as the destination.
    331   local dst_file="$1"
    332 
    333   # Dex files that act as the source.
    334   local dex_files_to_merge=()
    335 
    336   # Skip any non-existing files.
    337   while [[ $# -gt 0 ]]; do
    338     if [[ -e "$1" ]]; then
    339       dex_files_to_merge+=("$1")
    340     fi
    341     shift
    342   done
    343 
    344   # Should have at least 1 dex_files_to_merge here, otherwise dxmerger will print the help.
    345   ${DXMERGER} "$dst_file" "${dex_files_to_merge[@]}"
    346 }
    347 
    348 function make_hiddenapi() {
    349   local args=()
    350   while [[ $# -gt 0 ]]; do
    351     args+=("--dex=$1")
    352     shift
    353   done
    354   if [ -f api-light-greylist.txt ]; then
    355     args+=("--light-greylist=api-light-greylist.txt")
    356   fi
    357   if [ -f api-dark-greylist.txt ]; then
    358     args+=("--dark-greylist=api-dark-greylist.txt")
    359   fi
    360   if [ -f api-blacklist.txt ]; then
    361     args+=("--blacklist=api-blacklist.txt")
    362   fi
    363   ${HIDDENAPI} "${args[@]}"
    364 }
    365 
    366 # Print the directory name only if it exists.
    367 function maybe_dir() {
    368   local dirname="$1"
    369   if [[ -d "$dirname" ]]; then
    370     echo "$dirname"
    371   fi
    372 }
    373 
    374 if [ -e classes.dex ]; then
    375   zip $TEST_NAME.jar classes.dex
    376   exit 0
    377 fi
    378 
    379 # Helper function for a common test. Evaluate with $(has_mutlidex).
    380 function has_multidex() {
    381   echo [ ${HAS_SRC_MULTIDEX} = "true" \
    382          -o ${HAS_JASMIN_MULTIDEX} = "true" \
    383          -o ${HAS_SMALI_MULTIDEX} = "true" ]
    384 }
    385 
    386 if [ ${HAS_SRC_DEX2OAT_UNRESOLVED} = "true" ]; then
    387   mkdir -p classes
    388   mkdir classes-ex
    389   javac_with_bootclasspath -implicit:none -sourcepath src-dex2oat-unresolved -d classes `find src -name '*.java'`
    390   javac_with_bootclasspath -implicit:none -sourcepath src -d classes-ex `find src-dex2oat-unresolved -name '*.java'`
    391   if [ ${USE_JACK} = "true" ]; then
    392     jar cf classes.jill.jar -C classes .
    393     jar cf classes-ex.jill.jar -C classes-ex .
    394 
    395     ${JACK} --import classes-ex.jill.jar --output-dex .
    396     zip ${TEST_NAME}-ex.jar classes.dex
    397     ${JACK} --import classes.jill.jar --output-dex .
    398   else
    399     if [ ${NEED_DEX} = "true" ]; then
    400       make_dex classes-ex
    401       mv classes-ex.dex classes.dex   # rename it so it shows up as "classes.dex" in the zip file.
    402       zip ${TEST_NAME}-ex.jar classes.dex
    403       make_dex classes
    404     fi
    405   fi
    406 else
    407   if [ ${USE_JACK} = "true" ]; then
    408     # Jack toolchain
    409     if [[ "$HAS_SRC" == true || "$HAS_SRC_ART" == true ]]; then
    410       if [ "${HAS_SRC_MULTIDEX}" = "true" ]; then
    411         # Compile src and src-multidex in the same .jack file. We will apply multidex partitioning
    412         # when creating the output .dex file.
    413         ${JACK} ${JACK_ARGS} --output-jack src.jack $(maybe_dir src) src-multidex $(maybe_dir src-art)
    414         jack_extra_args="${jack_extra_args} -D jack.dex.output.policy=minimal-multidex"
    415         jack_extra_args="${jack_extra_args} -D jack.preprocessor=true"
    416         jack_extra_args="${jack_extra_args} -D jack.preprocessor.file=multidex.jpp"
    417       else
    418         ${JACK} ${JACK_ARGS} --output-jack src.jack $(maybe_dir src) $(maybe_dir src-art)
    419       fi
    420       jack_extra_args="${jack_extra_args} --import src.jack"
    421     fi
    422 
    423     if [ "${HAS_SRC2}" = "true" ]; then
    424       ${JACK} ${JACK_ARGS} --output-jack src2.jack src2
    425       # In case of duplicate classes, we want to take into account the classes from src2. Therefore
    426       # we apply the 'keep-first' policy and import src2.jack file *before* the src.jack file.
    427       jack_extra_args="${jack_extra_args} -D jack.import.type.policy=keep-first"
    428       jack_extra_args="--import src2.jack ${jack_extra_args}"
    429     fi
    430 
    431     # Compile jack files into a DEX file.
    432     if [ "${HAS_SRC}" = "true" ] || [ "${HAS_SRC2}" = "true" ] || [ "${HAS_SRC_ART}" = "true" ]; then
    433       ${JACK} ${JACK_ARGS} ${jack_extra_args} --output-dex .
    434     fi
    435   else
    436     # Legacy toolchain with javac+dx
    437     if [ "${HAS_SRC}" = "true" ]; then
    438       mkdir -p classes
    439       javac_with_bootclasspath -implicit:none -classpath src-multidex -d classes `find src -name '*.java'`
    440     fi
    441 
    442     if [ "${HAS_SRC_ART}" = "true" ]; then
    443       mkdir -p classes
    444       javac_with_bootclasspath -implicit:none -classpath src-multidex -d classes `find src-art -name '*.java'`
    445     fi
    446 
    447     if [ "${HAS_SRC_MULTIDEX}" = "true" ]; then
    448       mkdir classes2
    449       javac_with_bootclasspath -implicit:none -classpath src -d classes2 `find src-multidex -name '*.java'`
    450       if [ ${NEED_DEX} = "true" ]; then
    451         make_dex classes2
    452       fi
    453     fi
    454 
    455     if [ "${HAS_SRC2}" = "true" ]; then
    456       mkdir -p classes
    457       javac_with_bootclasspath -classpath classes -d classes `find src2 -name '*.java'`
    458     fi
    459 
    460     if [[ "${HAS_SRC}" == "true" || "${HAS_SRC2}" == "true" || "${HAS_SRC_ART}" == "true" ]]; then
    461       if [ ${NEED_DEX} = "true" ]; then
    462         make_dex classes
    463       fi
    464     fi
    465   fi
    466 fi
    467 
    468 if [[ "${HAS_JASMIN}" == true ]]; then
    469   # Compile Jasmin classes as if they were part of the classes.dex file.
    470   make_jasmin jasmin_classes $(find 'jasmin' -name '*.j')
    471   if [[ "${NEED_DEX}" == "true" ]]; then
    472     # Disable desugar because it won't handle intentional linkage errors.
    473     USE_DESUGAR=false make_dex jasmin_classes
    474     make_dexmerge classes.dex jasmin_classes.dex
    475   else
    476     # Move jasmin classes into classes directory so that they are picked up with -cp classes.
    477     mkdir -p classes
    478     mv jasmin_classes/* classes
    479   fi
    480 fi
    481 
    482 if [ "${HAS_SMALI}" = "true" -a ${NEED_DEX} = "true" ]; then
    483   # Compile Smali classes
    484   ${SMALI} -JXmx512m assemble ${SMALI_ARGS} --output smali_classes.dex `find smali -name '*.smali'`
    485 
    486   # Merge smali files into classes.dex, this takes priority over any jasmin files.
    487   make_dexmerge classes.dex smali_classes.dex
    488 fi
    489 
    490 # Compile Jasmin classes in jasmin-multidex as if they were part of the classes2.jar
    491 if [[ "$HAS_JASMIN_MULTIDEX" == true ]]; then
    492   make_jasmin jasmin_classes2 $(find 'jasmin-multidex' -name '*.j')
    493 
    494   if [[ "${NEED_DEX}" == "true" ]]; then
    495     # Disable desugar because it won't handle intentional linkage errors.
    496     USE_DESUGAR=false make_dex jasmin_classes2
    497 
    498     # Merge jasmin_classes2.dex into classes2.dex
    499     make_dexmerge classes2.dex jasmin_classes2.dex
    500   else
    501     # Move jasmin classes into classes2 directory so that they are picked up with -cp classes2.
    502     mkdir -p classes2
    503     mv jasmin_classes2/* classes2
    504   fi
    505 fi
    506 
    507 if [ "${HAS_SMALI_MULTIDEX}" = "true" -a ${NEED_DEX} = "true" ]; then
    508   # Compile Smali classes
    509   ${SMALI} -JXmx512m assemble ${SMALI_ARGS} --output smali_classes2.dex `find smali-multidex -name '*.smali'`
    510 
    511   # Merge smali_classes2.dex into classes2.dex
    512   make_dexmerge classes2.dex smali_classes2.dex
    513 fi
    514 
    515 
    516 if [ ${HAS_SRC_EX} = "true" ]; then
    517   if [ ${USE_JACK} = "true" ]; then
    518       # Rename previous "classes.dex" so it is not overwritten.
    519       mv classes.dex classes-1.dex
    520       #TODO find another way to append src.jack to the jack classpath
    521       ${JACK}:src.jack ${JACK_ARGS} --output-dex . src-ex
    522       zip $TEST_NAME-ex.jar classes.dex
    523       # Restore previous "classes.dex" so it can be zipped.
    524       mv classes-1.dex classes.dex
    525   else
    526     # Build src-ex into classes-ex.
    527     # Includes 'src', 'src-art' source when compiling classes-ex, but exclude their .class files.
    528     if [[ "${HAS_SRC}" == "true" ]]; then
    529       mkdir -p classes-tmp-for-ex
    530       javac_with_bootclasspath -d classes-tmp-for-ex `find src -name '*.java'`
    531       src_tmp_for_ex="-cp classes-tmp-for-ex"
    532     fi
    533     if [[ "${HAS_SRC_ART}" == "true" ]]; then
    534       mkdir -p classes-tmp-for-ex
    535       javac_with_bootclasspath -d classes-tmp-for-ex `find src-art -name '*.java'`
    536       src_tmp_for_ex="-cp classes-tmp-for-ex"
    537     fi
    538     mkdir classes-ex
    539     javac_with_bootclasspath -d classes-ex $src_tmp_for_ex `find src-ex -name '*.java'`
    540   fi
    541 fi
    542 
    543 if [[ -d classes-ex ]] && [ ${NEED_DEX} = "true" ]; then
    544   make_dex classes-ex
    545 
    546   # Apply hiddenapi on the dex files if the test has API list file(s).
    547   if [ ${USE_HIDDENAPI} = "true" -a ${HAS_HIDDENAPI_SPEC} = "true" ]; then
    548     make_hiddenapi classes-ex.dex
    549   fi
    550 
    551   # quick shuffle so that the stored name is "classes.dex"
    552   mv classes.dex classes-1.dex
    553   mv classes-ex.dex classes.dex
    554   zip $TEST_NAME-ex.jar classes.dex
    555   mv classes.dex classes-ex.dex
    556   mv classes-1.dex classes.dex
    557 fi
    558 
    559 # Apply hiddenapi on the dex files if the test has API list file(s).
    560 if [ ${NEED_DEX} = "true" -a ${USE_HIDDENAPI} = "true" -a ${HAS_HIDDENAPI_SPEC} = "true" ]; then
    561   if $(has_multidex); then
    562     make_hiddenapi classes.dex classes2.dex
    563   else
    564     make_hiddenapi classes.dex
    565   fi
    566 fi
    567 
    568 # Create a single dex jar with two dex files for multidex.
    569 if [ ${NEED_DEX} = "true" ]; then
    570   if $(has_multidex); then
    571     zip $TEST_NAME.jar classes.dex classes2.dex
    572   else
    573     zip $TEST_NAME.jar classes.dex
    574   fi
    575 fi
    576