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
17# NB This test is likely to be flakey. It attempts to merge random
18# DEX files from the Android build tree.
19
20# Find dx.jar from dx in the android dev tree
21prog=`which dx`
22progdir=`dirname "${prog}"`
23dxjar=$progdir/../framework/dx.jar
24
25for i in "$dxjar"; do
26    if [ ! -r $i ]; then
27        echo Missing dependency $i. Build dx-tests.
28        exit 1
29    fi
30done
31
32# Find all files that could contain dex bytecode.
33candidates=`find "$ANDROID_BUILD_TOP/out" -name '*.dex' -o -name '*.jar' -o -name '*.apk'`
34validdexes=()
35checksums=()
36for dex in $candidates; do
37  if [[ "$dex" = *"core"* ]]; then
38    # Ignoring core files as hit limits of merging capability.
39    continue
40  fi
41
42  # Filter out jar files and apks that do not unzip or contain a
43  # classes.dex file. DexMerger assumes file contents based on the
44  # file extension. Android build names some DEX files with a .jar
45  # extension and this raises an exception in DexMerger as it fails
46  # to unzip them.
47  if [[ "$dex" == *"jar" || "$dex" == *"apk" ]]; then
48    unzip -l "$dex" 2>&1 | grep -q -m 1 classes.dex
49    if [[ $? != 0 ]]; then
50      continue
51    fi
52  fi
53
54  # Skip duplicate files
55  checksum=`shasum "$dex" | sed -e 's/ .*//' -e 's/^/_/'`
56  if [[ "$checksums[$checksum]" == "$checksum" ]]; then
57    continue
58  fi
59  checksums[$checksum]=$checksum
60
61  dexdump -c $dex >/dev/null 2>&1
62  if [ $? -eq 0 ]; then
63    validdexes+=("$dex")
64  fi
65done
66
67if [ ${#validdexes[@]} -eq 0 ]; then
68  echo No valid DEX files found.
69  exit 1
70fi
71
72java -cp .:$dxjar -ea -esa com.android.dx.merge.MergeTest "${validdexes[@]}" > /dev/null
73