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.java30
1 files changed, 27 insertions, 3 deletions
diff --git a/dx/src/com/android/dx/dex/file/MemberIdsSection.java b/dx/src/com/android/dx/dex/file/MemberIdsSection.java
index ec39b75cd..ee844d9de 100644
--- a/dx/src/com/android/dx/dex/file/MemberIdsSection.java
+++ b/dx/src/com/android/dx/dex/file/MemberIdsSection.java
@@ -17,6 +17,10 @@
package com.android.dx.dex.file;
import com.android.dx.util.DexException;
+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,9 +46,7 @@ public abstract class MemberIdsSection extends UniformItemSection {
int idx = 0;
if (items().size() > MAX_MEMBERS) {
- String memberType = this instanceof MethodIdsSection ? "methods" : "fields";
- throw new DexException("Too many " + memberType + ": " + items().size()
- + "; max is " + MAX_MEMBERS);
+ throw new DexException(tooManyMembersMessage());
}
for (Object i : items()) {
@@ -52,4 +54,26 @@ public abstract class MemberIdsSection extends UniformItemSection {
idx++;
}
}
+
+ private String tooManyMembersMessage() {
+ 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();
+ String memberType = this instanceof MethodIdsSection ? "methods" : "fields";
+ formatter.format("Too many %s: %d; max is %d. By package:",
+ memberType, items().size(), MAX_MEMBERS);
+ for (Map.Entry<String, AtomicInteger> entry : membersByPackage.entrySet()) {
+ formatter.format("%n%6d %s", entry.getValue().get(), entry.getKey());
+ }
+ return formatter.toString();
+ }
}