diff options
author | 2017-08-08 20:29:05 +0200 | |
---|---|---|
committer | 2017-08-09 11:33:34 +0200 | |
commit | cf439f2fc1fb6b0da898e67ffecc604b3dcd5504 (patch) | |
tree | 3422e2cd1572a36fe3905b1e3260e82757c286ed /src/tools/android/java/com/google/devtools/build/android/dexer/DexConversionEnqueuer.java | |
parent | 3562525a795b41c6e69cab5afdb1c92a48528f7d (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.java | 25 |
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); } } } |