diff options
| -rw-r--r-- | dx/src/com/android/dx/io/DexBuffer.java | 10 | ||||
| -rw-r--r-- | dx/src/com/android/dx/merge/DexMerger.java | 41 |
2 files changed, 25 insertions, 26 deletions
diff --git a/dx/src/com/android/dx/io/DexBuffer.java b/dx/src/com/android/dx/io/DexBuffer.java index 217de725b..2420cfd9f 100644 --- a/dx/src/com/android/dx/io/DexBuffer.java +++ b/dx/src/com/android/dx/io/DexBuffer.java @@ -304,10 +304,11 @@ public final class DexBuffer { private final String name; private int position; private final int limit; + private final int initialPosition; private Section(String name, int position, int limit) { this.name = name; - this.position = position; + this.position = this.initialPosition = position; this.limit = limit; } @@ -645,5 +646,12 @@ public final class DexBuffer { public int remaining() { return limit - position; } + + /** + * Returns the number of bytes used by this section. + */ + public int used () { + return position - initialPosition; + } } } diff --git a/dx/src/com/android/dx/merge/DexMerger.java b/dx/src/com/android/dx/merge/DexMerger.java index 1ba876aef..cd7f07ffa 100644 --- a/dx/src/com/android/dx/merge/DexMerger.java +++ b/dx/src/com/android/dx/merge/DexMerger.java @@ -192,8 +192,7 @@ public final class DexMerger { * result in too many bytes wasted, compact the result. To compact, * simply merge the result with itself. */ - WriterSizes compactedSizes = writerSizes.clone(); - compactedSizes.minusWaste(this); + WriterSizes compactedSizes = new WriterSizes(this); int wastedByteCount = writerSizes.size() - compactedSizes.size(); if (wastedByteCount > + compactWasteThreshold) { DexMerger compacter = new DexMerger( @@ -862,7 +861,7 @@ public final class DexMerger { * <li>By exactly measuring an existing dex. * </ul> */ - private static class WriterSizes implements Cloneable { + private static class WriterSizes { private int header = SizeOf.HEADER_ITEM; private int idsDefs; private int mapList; @@ -885,12 +884,20 @@ public final class DexMerger { plus(b.getTableOfContents(), false); } - @Override public WriterSizes clone() { - try { - return (WriterSizes) super.clone(); - } catch (CloneNotSupportedException e) { - throw new AssertionError(); - } + public WriterSizes(DexMerger dexMerger) { + header = dexMerger.headerOut.used(); + idsDefs = dexMerger.idsDefsOut.used(); + mapList = dexMerger.mapListOut.used(); + typeList = dexMerger.typeListOut.used(); + classData = dexMerger.classDataOut.used(); + code = dexMerger.codeOut.used(); + stringData = dexMerger.stringDataOut.used(); + debugInfo = dexMerger.debugInfoOut.used(); + encodedArray = dexMerger.encodedArrayOut.used(); + annotationsDirectory = dexMerger.annotationsDirectoryOut.used(); + annotationsSet = dexMerger.annotationSetOut.used(); + annotationsSetRefList = dexMerger.annotationSetRefListOut.used(); + annotation = dexMerger.annotationOut.used(); } public void plus(TableOfContents contents, boolean exact) { @@ -928,22 +935,6 @@ public final class DexMerger { code = DexBuffer.fourByteAlign(code); } - public void minusWaste(DexMerger dexMerger) { - header -= dexMerger.headerOut.remaining(); - idsDefs -= dexMerger.idsDefsOut.remaining(); - mapList -= dexMerger.mapListOut.remaining(); - typeList -= dexMerger.typeListOut.remaining(); - classData -= dexMerger.classDataOut.remaining(); - code -= dexMerger.codeOut.remaining(); - stringData -= dexMerger.stringDataOut.remaining(); - debugInfo -= dexMerger.debugInfoOut.remaining(); - encodedArray -= dexMerger.encodedArrayOut.remaining(); - annotationsDirectory -= dexMerger.annotationsDirectoryOut.remaining(); - annotationsSet -= dexMerger.annotationSetOut.remaining(); - annotationsSetRefList -= dexMerger.annotationSetRefListOut.remaining(); - annotation -= dexMerger.annotationOut.remaining(); - } - public int size() { return header + idsDefs + mapList + typeList + classData + code + stringData + debugInfo + encodedArray + annotationsDirectory + annotationsSet + annotationsSetRefList |
