summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dx/src/com/android/dx/io/DexBuffer.java10
-rw-r--r--dx/src/com/android/dx/merge/DexMerger.java41
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