summaryrefslogtreecommitdiffstats
path: root/dx/src/com/android/dx/dex/file/MemberIdsSection.java
diff options
context:
space:
mode:
Diffstat (limited to 'dx/src/com/android/dx/dex/file/MemberIdsSection.java')
-rw-r--r--dx/src/com/android/dx/dex/file/MemberIdsSection.java36
1 files changed, 35 insertions, 1 deletions
diff --git a/dx/src/com/android/dx/dex/file/MemberIdsSection.java b/dx/src/com/android/dx/dex/file/MemberIdsSection.java
index 6c6eb49f5..bd15df765 100644
--- a/dx/src/com/android/dx/dex/file/MemberIdsSection.java
+++ b/dx/src/com/android/dx/dex/file/MemberIdsSection.java
@@ -20,6 +20,11 @@ import com.android.dex.DexException;
import com.android.dex.DexFormat;
import com.android.dx.command.dexer.Main;
+import java.util.Formatter;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
/**
* Member (field or method) refs list section of a {@code .dex} file.
*/
@@ -42,7 +47,7 @@ public abstract class MemberIdsSection extends UniformItemSection {
int idx = 0;
if (items().size() > DexFormat.MAX_MEMBER_IDX + 1) {
- throw new DexException(Main.TO_MANY_ID_ERROR_MESSAGE);
+ throw new DexException(getTooManyMembersMessage());
}
for (Object i : items()) {
@@ -50,4 +55,33 @@ public abstract class MemberIdsSection extends UniformItemSection {
idx++;
}
}
+
+ private String getTooManyMembersMessage() {
+ Map<String, AtomicInteger> membersByPackage = new TreeMap<String, AtomicInteger>();
+ for (Object member : items()) {
+ String packageName = ((MemberIdItem) member).getDefiningClass().getPackageName();
+ AtomicInteger count = membersByPackage.get(packageName);
+ if (count == null) {
+ count = new AtomicInteger();
+ membersByPackage.put(packageName, count);
+ }
+ count.incrementAndGet();
+ }
+
+ Formatter formatter = new Formatter();
+ try {
+ String memberType = this instanceof MethodIdsSection ? "method" : "field";
+ formatter.format("Too many %s references: %d; max is %d.%n" +
+ Main.getTooManyIdsErrorMessage() + "%n" +
+ "References by package:",
+ memberType, items().size(), DexFormat.MAX_MEMBER_IDX + 1);
+ for (Map.Entry<String, AtomicInteger> entry : membersByPackage.entrySet()) {
+ formatter.format("%n%6d %s", entry.getValue().get(), entry.getKey());
+ }
+ return formatter.toString();
+ } finally {
+ formatter.close();
+ }
+ }
+
}