diff options
| -rw-r--r-- | tools/class2greylist/src/com/android/class2greylist/Class2Greylist.java | 45 | ||||
| -rw-r--r-- | tools/class2greylist/src/com/android/class2greylist/MemberDumpingVisitor.java | 47 |
2 files changed, 82 insertions, 10 deletions
diff --git a/tools/class2greylist/src/com/android/class2greylist/Class2Greylist.java b/tools/class2greylist/src/com/android/class2greylist/Class2Greylist.java index 694a5f4a3f..92620760e7 100644 --- a/tools/class2greylist/src/com/android/class2greylist/Class2Greylist.java +++ b/tools/class2greylist/src/com/android/class2greylist/Class2Greylist.java @@ -86,6 +86,12 @@ public class Class2Greylist { .withDescription("Enable debug") .create("d")); options.addOption(OptionBuilder + .withLongOpt("dump-all-members") + .withDescription("Dump all members from jar files to stdout. Ignore annotations. " + + "Do not use in conjunction with any other arguments.") + .hasArgs(0) + .create('m')); + options.addOption(OptionBuilder .withLongOpt("help") .hasArgs(0) .withDescription("Show this help") @@ -113,16 +119,21 @@ public class Class2Greylist { } Status status = new Status(cmd.hasOption('d')); - try { - Class2Greylist c2gl = new Class2Greylist( - status, - cmd.getOptionValue('p', null), - cmd.getOptionValues('g'), - cmd.getOptionValue('w', null), - jarFiles); - c2gl.main(); - } catch (IOException e) { - status.error(e); + + if (cmd.hasOption('m')) { + dumpAllMembers(status, jarFiles); + } else { + try { + Class2Greylist c2gl = new Class2Greylist( + status, + cmd.getOptionValue('p', null), + cmd.getOptionValues('g'), + cmd.getOptionValue('w', null), + jarFiles); + c2gl.main(); + } catch (IOException e) { + status.error(e); + } } if (status.ok()) { @@ -221,6 +232,20 @@ public class Class2Greylist { return map; } + private static void dumpAllMembers(Status status, String[] jarFiles) { + for (String jarFile : jarFiles) { + status.debug("Processing jar file %s", jarFile); + try { + JarReader reader = new JarReader(status, jarFile); + reader.stream().forEach(clazz -> new MemberDumpingVisitor(clazz, status) + .visit()); + reader.close(); + } catch (IOException e) { + status.error(e); + } + } + } + private static void help(Options options) { new HelpFormatter().printHelp( "class2greylist path/to/classes.jar [classes2.jar ...]", diff --git a/tools/class2greylist/src/com/android/class2greylist/MemberDumpingVisitor.java b/tools/class2greylist/src/com/android/class2greylist/MemberDumpingVisitor.java new file mode 100644 index 0000000000..6677a3f3ab --- /dev/null +++ b/tools/class2greylist/src/com/android/class2greylist/MemberDumpingVisitor.java @@ -0,0 +1,47 @@ +package com.android.class2greylist; + +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.EmptyVisitor; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.FieldOrMethod; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; + +/** + * A class file visitor that simply prints to stdout the signature of every member within the class. + */ +public class MemberDumpingVisitor extends EmptyVisitor { + + private final Status mStatus; + private final DescendingVisitor mDescendingVisitor; + + /** + * Creates a visitor for a class. + * + * @param clazz Class to visit + */ + public MemberDumpingVisitor(JavaClass clazz, Status status) { + mStatus = status; + mDescendingVisitor = new DescendingVisitor(clazz, this); + } + + public void visit() { + mDescendingVisitor.visit(); + } + + @Override + public void visitMethod(Method method) { + visitMember(method, "L%s;->%s%s"); + } + + @Override + public void visitField(Field field) { + visitMember(field, "L%s;->%s:%s"); + } + + private void visitMember(FieldOrMethod member, String signatureFormatString) { + AnnotationContext context = new AnnotationContext(mStatus, member, + (JavaClass) mDescendingVisitor.predecessor(), signatureFormatString); + System.out.println(context.getMemberDescriptor()); + } +} |