aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android
diff options
context:
space:
mode:
authorGravatar kmb <kmb@google.com>2017-10-10 04:45:04 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-10-10 11:24:29 +0200
commit43edc92ac185ee2f1b8d0db31943ec1655b43434 (patch)
tree184bc367f45a1ecb6a54a4ccf2af51ec1ba66f70 /src/tools/android
parentf5c0e96b3f3daa47d0f2bb7e3c1ee45462375a1d (diff)
Support --forceJumbo flag with incremental dexing
PiperOrigin-RevId: 171622639
Diffstat (limited to 'src/tools/android')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/dexer/DexFileAggregator.java57
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/dexer/DexFileMerger.java11
2 files changed, 45 insertions, 23 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileAggregator.java b/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileAggregator.java
index 2f860fcb46..aff159ec49 100644
--- a/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileAggregator.java
+++ b/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileAggregator.java
@@ -54,6 +54,7 @@ class DexFileAggregator implements Closeable {
private final ArrayList<Dex> currentShard = new ArrayList<>();
private final HashSet<FieldDescriptor> fieldsInCurrentShard = new HashSet<>();
private final HashSet<MethodDescriptor> methodsInCurrentShard = new HashSet<>();
+ private final boolean forceJumbo;
private final int maxNumberOfIdxPerDex;
private final int wasteThresholdPerDex;
private final MultidexStrategy multidex;
@@ -70,6 +71,7 @@ class DexFileAggregator implements Closeable {
DexFileArchive dest,
ListeningExecutorService executor,
MultidexStrategy multidex,
+ boolean forceJumbo,
int maxNumberOfIdxPerDex,
int wasteThresholdPerDex,
String dexPrefix) {
@@ -77,6 +79,7 @@ class DexFileAggregator implements Closeable {
this.dest = dest;
this.executor = executor;
this.multidex = multidex;
+ this.forceJumbo = forceJumbo;
this.maxNumberOfIdxPerDex = maxNumberOfIdxPerDex;
this.wasteThresholdPerDex = wasteThresholdPerDex;
this.dexPrefix = dexPrefix;
@@ -157,7 +160,7 @@ class DexFileAggregator implements Closeable {
checkState(multidex.isMultidexAllowed() || nextDexFileIndex == 0);
String filename = getDexFileName(nextDexFileIndex++);
ListenableFuture<Dex> merged =
- dexes.length == 1
+ dexes.length == 1 && !forceJumbo
? Futures.immediateFuture(dexes[0])
: executor.submit(new RunDexMerger(dexes));
lastWriter =
@@ -170,27 +173,36 @@ class DexFileAggregator implements Closeable {
case 0:
return new Dex(0);
case 1:
- return dexes[0];
- default:
- try {
- DexMerger dexMerger = new DexMerger(dexes, CollisionPolicy.FAIL, context);
- dexMerger.setCompactWasteThreshold(wasteThresholdPerDex);
- return dexMerger.merge();
- } catch (BufferOverflowException e) {
- if (dexes.length <= 2) {
- throw e;
- }
- // Bug in dx can cause this for ~1500 or more classes
- Dex[] left = Arrays.copyOf(dexes, dexes.length / 2);
- Dex[] right = Arrays.copyOfRange(dexes, left.length, dexes.length);
- System.err.printf("Couldn't merge %d classes, trying %d%n", dexes.length, left.length);
- try {
- return merge(merge(left), merge(right));
- } catch (RuntimeException e2) {
- e2.addSuppressed(e);
- throw e2;
- }
- }
+ // Need to actually process the single given file for forceJumbo :(
+ return forceJumbo ? merge(dexes[0], new Dex(0)) : dexes[0];
+ default: // fall out
+ }
+ DexMerger dexMerger = new DexMerger(dexes, CollisionPolicy.FAIL, context);
+ dexMerger.setCompactWasteThreshold(wasteThresholdPerDex);
+ if (forceJumbo) {
+ try {
+ DexMerger.class.getMethod("setForceJumbo", Boolean.TYPE).invoke(dexMerger, true);
+ } catch (ReflectiveOperationException e) {
+ throw new IllegalStateException("--forceJumbo flag not supported", e);
+ }
+ }
+
+ try {
+ return dexMerger.merge();
+ } catch (BufferOverflowException e) {
+ if (dexes.length <= 2) {
+ throw e;
+ }
+ // Bug in dx can cause this for ~1500 or more classes
+ Dex[] left = Arrays.copyOf(dexes, dexes.length / 2);
+ Dex[] right = Arrays.copyOfRange(dexes, left.length, dexes.length);
+ System.err.printf("Couldn't merge %d classes, trying %d%n", dexes.length, left.length);
+ try {
+ return merge(merge(left), merge(right));
+ } catch (RuntimeException e2) {
+ e2.addSuppressed(e);
+ throw e2;
+ }
}
}
@@ -246,7 +258,6 @@ class DexFileAggregator implements Closeable {
private final Dex[] dexes;
public RunDexMerger(Dex... dexes) {
- checkArgument(dexes.length >= 2, "Only got %s dex files to merge", dexes.length);
this.dexes = dexes;
}
diff --git a/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileMerger.java b/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileMerger.java
index a379fc6a36..658f95f46f 100644
--- a/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileMerger.java
+++ b/src/tools/android/java/com/google/devtools/build/android/dexer/DexFileMerger.java
@@ -161,6 +161,16 @@ class DexFileMerger {
public int maxNumberOfIdxPerDex;
@Option(
+ name = "forceJumbo",
+ defaultValue = "false", // dx's default
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.UNKNOWN},
+ allowMultiple = false,
+ help = "Typically not needed flag intended to imitate dx's --forceJumbo."
+ )
+ public boolean forceJumbo;
+
+ @Option(
name = "dex_prefix",
defaultValue = DEX_PREFIX, // dx's default
category = "misc",
@@ -278,6 +288,7 @@ class DexFileMerger {
new BufferedOutputStream(Files.newOutputStream(options.outputArchive)))),
executor,
options.multidexMode,
+ options.forceJumbo,
options.maxNumberOfIdxPerDex,
options.wasteThresholdPerDex,
options.dexPrefix);