aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java
diff options
context:
space:
mode:
authorGravatar kmb <kmb@google.com>2017-08-08 20:29:05 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-08-09 11:33:34 +0200
commitcf439f2fc1fb6b0da898e67ffecc604b3dcd5504 (patch)
tree3422e2cd1572a36fe3905b1e3260e82757c286ed /src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java
parent3562525a795b41c6e69cab5afdb1c92a48528f7d (diff)
write dex archives uncompressed
RELNOTES: none PiperOrigin-RevId: 164620306
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java b/src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java
index b66e725dc3..9e94b47cad 100644
--- a/src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java
+++ b/src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java
@@ -28,6 +28,7 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.annotation.Nullable;
@@ -108,7 +109,7 @@ class DexConversionEnqueuer implements Callable<Void> {
private Future<ZipEntryContent> toDex(ZipEntry entry, byte[] content) {
byte[] cached = dexCache != null ? dexCache.getIfPresent(dexer.getDexingKey(content)) : null;
return cached != null
- ? immediateFuture(newDexEntry(entry, cached))
+ ? immediateFuture(storedDexEntry(entry, cached))
: executor.submit(new ClassToDex(entry, content, dexer, dexCache));
}
@@ -126,13 +127,25 @@ class DexConversionEnqueuer implements Callable<Void> {
return files;
}
- private static ZipEntryContent newDexEntry(ZipEntry classfile, byte[] dexed) {
- return new ZipEntryContent(withFileName(classfile, classfile.getName() + ".dex"), dexed);
+ private static ZipEntryContent storedDexEntry(ZipEntry classfile, byte[] dexed) {
+ return new ZipEntryContent(
+ storedEntry(classfile.getName() + ".dex", classfile.getTime(), dexed),
+ dexed);
}
- private static ZipEntry withFileName(ZipEntry orig, String filename) {
+ private static ZipEntry storedEntry(String filename, long time, byte[] content) {
+ // Need to pre-compute checksum for STORED (uncompressed) entries)
+ CRC32 checksum = new CRC32();
+ checksum.update(content);
+
ZipEntry result = new ZipEntry(filename);
- result.setTime(orig.getTime());
+ result.setTime(time);
+ result.setCrc(checksum.getValue());
+ result.setSize(content.length);
+ result.setCompressedSize(content.length);
+ // Write uncompressed, since this is just an intermediary artifact that
+ // we will convert to .dex
+ result.setMethod(ZipEntry.STORED);
return result;
}
@@ -162,7 +175,7 @@ class DexConversionEnqueuer implements Callable<Void> {
dexCache.put(dexer.getDexingKey(content), dexed);
}
// Use .class.dex suffix expected by SplitZip
- return newDexEntry(entry, dexed);
+ return storedDexEntry(entry, dexed);
}
}
}