Loading tools/layoutlib/Android.mk +4 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ built_core_classes := $(call java-lib-files,core) built_ext_dep := $(call java-lib-deps,ext) built_ext_classes := $(call java-lib-files,ext) built_ext_data := $(call intermediates-dir-for, \ JAVA_LIBRARIES,ext,,COMMON)/javalib.jar built_layoutlib_create_jar := $(call intermediates-dir-for, \ JAVA_LIBRARIES,layoutlib_create,HOST)/javalib.jar Loading Loading @@ -60,7 +62,8 @@ $(LOCAL_BUILT_MODULE): $(built_core_dep) \ $@ \ $(built_core_classes) \ $(built_framework_classes) \ $(built_ext_classes) $(built_ext_classes) \ $(built_ext_data) $(hide) ls -l $(built_framework_classes) Loading tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java +53 −16 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import org.objectweb.asm.signature.SignatureReader; import org.objectweb.asm.signature.SignatureVisitor; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; Loading Loading @@ -60,6 +61,9 @@ public class AsmAnalyzer { private final String[] mIncludeGlobs; /** The set of classes to exclude.*/ private final Set<String> mExcludedClasses; /** Glob patterns of files to keep as is. */ private final String[] mIncludeFileGlobs; /** Copy these files into the output as is. */ /** * Creates a new analyzer. Loading @@ -70,15 +74,19 @@ public class AsmAnalyzer { * @param deriveFrom Keep all classes that derive from these one (these included). * @param includeGlobs Glob patterns of classes to keep, e.g. "com.foo.*" * ("*" does not matches dots whilst "**" does, "." and "$" are interpreted as-is) * @param includeFileGlobs Glob patterns of files which are kept as is. This is only for files * not ending in .class. */ public AsmAnalyzer(Log log, List<String> osJarPath, AsmGenerator gen, String[] deriveFrom, String[] includeGlobs, Set<String> excludeClasses) { String[] deriveFrom, String[] includeGlobs, Set<String> excludeClasses, String[] includeFileGlobs) { mLog = log; mGen = gen; mOsSourceJar = osJarPath != null ? osJarPath : new ArrayList<String>(); mDeriveFrom = deriveFrom != null ? deriveFrom : new String[0]; mIncludeGlobs = includeGlobs != null ? includeGlobs : new String[0]; mExcludedClasses = excludeClasses; mIncludeFileGlobs = includeFileGlobs != null ? includeFileGlobs : new String[0]; } /** Loading @@ -86,7 +94,11 @@ public class AsmAnalyzer { * Fills the generator with classes & dependencies found. */ public void analyze() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = parseZip(mOsSourceJar); TreeMap<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); parseZip(mOsSourceJar, zipClasses, filesFound); mLog.info("Found %d classes in input JAR%s.", zipClasses.size(), mOsSourceJar.size() > 1 ? "s" : ""); Loading @@ -96,15 +108,29 @@ public class AsmAnalyzer { if (mGen != null) { mGen.setKeep(found); mGen.setDeps(deps); mGen.setCopyFiles(filesFound); } } /** * Parses a JAR file and returns a list of all classes founds using a map * class name => ASM ClassReader. Class names are in the form "android.view.View". * Parses a JAR file and adds all the classes found to <code>classes</code> * and all other files to <code>filesFound</code>. * * @param classes The map of class name => ASM ClassReader. Class names are * in the form "android.view.View". * @param fileFound The map of file name => InputStream. The file name is * in the form "android/data/dataFile". */ Map<String,ClassReader> parseZip(List<String> jarPathList) throws IOException { TreeMap<String, ClassReader> classes = new TreeMap<String, ClassReader>(); void parseZip(List<String> jarPathList, Map<String, ClassReader> classes, Map<String, InputStream> filesFound) throws IOException { if (classes == null || filesFound == null) { return; } Pattern[] includeFilePatterns = new Pattern[mIncludeFileGlobs.length]; for (int i = 0; i < mIncludeFileGlobs.length; ++i) { includeFilePatterns[i] = getPatternFromGlob(mIncludeFileGlobs[i]); } for (String jarPath : jarPathList) { ZipFile zip = new ZipFile(jarPath); Loading @@ -116,11 +142,17 @@ public class AsmAnalyzer { ClassReader cr = new ClassReader(zip.getInputStream(entry)); String className = classReaderToClassName(cr); classes.put(className, cr); } else { for (int i = 0; i < includeFilePatterns.length; ++i) { if (includeFilePatterns[i].matcher(entry.getName()).matches()) { filesFound.put(entry.getName(), zip.getInputStream(entry)); break; } } } } } return classes; } /** Loading Loading @@ -202,6 +234,18 @@ public class AsmAnalyzer { */ void findGlobs(String globPattern, Map<String, ClassReader> zipClasses, Map<String, ClassReader> inOutFound) throws LogAbortException { Pattern regexp = getPatternFromGlob(globPattern); for (Entry<String, ClassReader> entry : zipClasses.entrySet()) { String class_name = entry.getKey(); if (regexp.matcher(class_name).matches()) { findClass(class_name, zipClasses, inOutFound); } } } Pattern getPatternFromGlob(String globPattern) { // transforms the glob pattern in a regexp: // - escape "." with "\." // - replace "*" by "[^.]*" Loading @@ -216,14 +260,7 @@ public class AsmAnalyzer { globPattern = globPattern.replaceAll("@", ".*"); globPattern += "$"; Pattern regexp = Pattern.compile(globPattern); for (Entry<String, ClassReader> entry : zipClasses.entrySet()) { String class_name = entry.getKey(); if (regexp.matcher(class_name).matches()) { findClass(class_name, zipClasses, inOutFound); } } return Pattern.compile(globPattern); } /** Loading tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java +31 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; Loading Loading @@ -52,6 +53,8 @@ public class AsmGenerator { private Map<String, ClassReader> mKeep; /** All dependencies that must be completely stubbed. */ private Map<String, ClassReader> mDeps; /** All files that are to be copied as-is. */ private Map<String, InputStream> mCopyFiles; /** Counter of number of classes renamed during transform. */ private int mRenameCount; /** FQCN Names of the classes to rename: map old-FQCN => new-FQCN */ Loading Loading @@ -195,6 +198,11 @@ public class AsmGenerator { mDeps = deps; } /** Sets the map of files to output as-is. */ public void setCopyFiles(Map<String, InputStream> copyFiles) { mCopyFiles = copyFiles; } /** Gets the map of classes to output as-is, except if they have native methods */ public Map<String, ClassReader> getKeep() { return mKeep; Loading @@ -205,6 +213,11 @@ public class AsmGenerator { return mDeps; } /** Gets the map of files to output as-is. */ public Map<String, InputStream> getCopyFiles() { return mCopyFiles; } /** Generates the final JAR */ public void generate() throws FileNotFoundException, IOException { TreeMap<String, byte[]> all = new TreeMap<String, byte[]>(); Loading Loading @@ -232,6 +245,15 @@ public class AsmGenerator { all.put(name, b); } for (Entry<String, InputStream> entry : mCopyFiles.entrySet()) { try { byte[] b = inputStreamToByteArray(entry.getValue()); all.put(entry.getKey(), b); } catch (IOException e) { // Ignore. } } mLog.info("# deps classes: %d", mDeps.size()); mLog.info("# keep classes: %d", mKeep.size()); mLog.info("# renamed : %d", mRenameCount); Loading Loading @@ -381,4 +403,13 @@ public class AsmGenerator { return cv.hasNativeMethods(); } private byte[] inputStreamToByteArray(InputStream is) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] data = new byte[8192]; // 8KB int n; while ((n = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, n); } return buffer.toByteArray(); } } tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java +4 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,10 @@ public class Main { "android.database.ContentObserver", // for Digital clock "com.android.i18n.phonenumbers.*", // for TextView with autolink attribute }, excludeClasses); excludeClasses, new String[] { "com/android/i18n/phonenumbers/data/*", }); aa.analyze(); agen.generate(); Loading tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java +32 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import org.junit.Test; import org.objectweb.asm.ClassReader; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; Loading @@ -55,8 +56,10 @@ public class AsmAnalyzerTest { Set<String> excludeClasses = new HashSet<String>(1); excludeClasses.add("java.lang.JavaClass"); mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */, null /* deriveFrom */, null /* includeGlobs */, excludeClasses); String[] includeFiles = new String[]{"mock_android/data/data*"}; mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */, null /* deriveFrom */, null /* includeGlobs */, excludeClasses, includeFiles); } @After Loading @@ -65,7 +68,11 @@ public class AsmAnalyzerTest { @Test public void testParseZip() throws IOException { Map<String, ClassReader> map = mAa.parseZip(mOsJarPath); Map<String, ClassReader> map = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, map, filesFound); assertArrayEquals(new String[] { "java.lang.JavaClass", Loading @@ -86,11 +93,17 @@ public class AsmAnalyzerTest { "mock_android.widget.TableLayout$LayoutParams" }, map.keySet().toArray()); assertArrayEquals(new String[] {"mock_android/data/dataFile"}, filesFound.keySet().toArray()); } @Test public void testFindClass() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams", Loading @@ -105,7 +118,11 @@ public class AsmAnalyzerTest { @Test public void testFindGlobs() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); // this matches classes, a package match returns nothing Loading Loading @@ -164,7 +181,11 @@ public class AsmAnalyzerTest { @Test public void testFindClassesDerivingFrom() throws LogAbortException, IOException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found); Loading @@ -186,7 +207,11 @@ public class AsmAnalyzerTest { @Test public void testDependencyVisitor() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> keep = new TreeMap<String, ClassReader>(); TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>(); TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>(); Loading Loading
tools/layoutlib/Android.mk +4 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ built_core_classes := $(call java-lib-files,core) built_ext_dep := $(call java-lib-deps,ext) built_ext_classes := $(call java-lib-files,ext) built_ext_data := $(call intermediates-dir-for, \ JAVA_LIBRARIES,ext,,COMMON)/javalib.jar built_layoutlib_create_jar := $(call intermediates-dir-for, \ JAVA_LIBRARIES,layoutlib_create,HOST)/javalib.jar Loading Loading @@ -60,7 +62,8 @@ $(LOCAL_BUILT_MODULE): $(built_core_dep) \ $@ \ $(built_core_classes) \ $(built_framework_classes) \ $(built_ext_classes) $(built_ext_classes) \ $(built_ext_data) $(hide) ls -l $(built_framework_classes) Loading
tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java +53 −16 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import org.objectweb.asm.signature.SignatureReader; import org.objectweb.asm.signature.SignatureVisitor; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; Loading Loading @@ -60,6 +61,9 @@ public class AsmAnalyzer { private final String[] mIncludeGlobs; /** The set of classes to exclude.*/ private final Set<String> mExcludedClasses; /** Glob patterns of files to keep as is. */ private final String[] mIncludeFileGlobs; /** Copy these files into the output as is. */ /** * Creates a new analyzer. Loading @@ -70,15 +74,19 @@ public class AsmAnalyzer { * @param deriveFrom Keep all classes that derive from these one (these included). * @param includeGlobs Glob patterns of classes to keep, e.g. "com.foo.*" * ("*" does not matches dots whilst "**" does, "." and "$" are interpreted as-is) * @param includeFileGlobs Glob patterns of files which are kept as is. This is only for files * not ending in .class. */ public AsmAnalyzer(Log log, List<String> osJarPath, AsmGenerator gen, String[] deriveFrom, String[] includeGlobs, Set<String> excludeClasses) { String[] deriveFrom, String[] includeGlobs, Set<String> excludeClasses, String[] includeFileGlobs) { mLog = log; mGen = gen; mOsSourceJar = osJarPath != null ? osJarPath : new ArrayList<String>(); mDeriveFrom = deriveFrom != null ? deriveFrom : new String[0]; mIncludeGlobs = includeGlobs != null ? includeGlobs : new String[0]; mExcludedClasses = excludeClasses; mIncludeFileGlobs = includeFileGlobs != null ? includeFileGlobs : new String[0]; } /** Loading @@ -86,7 +94,11 @@ public class AsmAnalyzer { * Fills the generator with classes & dependencies found. */ public void analyze() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = parseZip(mOsSourceJar); TreeMap<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); parseZip(mOsSourceJar, zipClasses, filesFound); mLog.info("Found %d classes in input JAR%s.", zipClasses.size(), mOsSourceJar.size() > 1 ? "s" : ""); Loading @@ -96,15 +108,29 @@ public class AsmAnalyzer { if (mGen != null) { mGen.setKeep(found); mGen.setDeps(deps); mGen.setCopyFiles(filesFound); } } /** * Parses a JAR file and returns a list of all classes founds using a map * class name => ASM ClassReader. Class names are in the form "android.view.View". * Parses a JAR file and adds all the classes found to <code>classes</code> * and all other files to <code>filesFound</code>. * * @param classes The map of class name => ASM ClassReader. Class names are * in the form "android.view.View". * @param fileFound The map of file name => InputStream. The file name is * in the form "android/data/dataFile". */ Map<String,ClassReader> parseZip(List<String> jarPathList) throws IOException { TreeMap<String, ClassReader> classes = new TreeMap<String, ClassReader>(); void parseZip(List<String> jarPathList, Map<String, ClassReader> classes, Map<String, InputStream> filesFound) throws IOException { if (classes == null || filesFound == null) { return; } Pattern[] includeFilePatterns = new Pattern[mIncludeFileGlobs.length]; for (int i = 0; i < mIncludeFileGlobs.length; ++i) { includeFilePatterns[i] = getPatternFromGlob(mIncludeFileGlobs[i]); } for (String jarPath : jarPathList) { ZipFile zip = new ZipFile(jarPath); Loading @@ -116,11 +142,17 @@ public class AsmAnalyzer { ClassReader cr = new ClassReader(zip.getInputStream(entry)); String className = classReaderToClassName(cr); classes.put(className, cr); } else { for (int i = 0; i < includeFilePatterns.length; ++i) { if (includeFilePatterns[i].matcher(entry.getName()).matches()) { filesFound.put(entry.getName(), zip.getInputStream(entry)); break; } } } } } return classes; } /** Loading Loading @@ -202,6 +234,18 @@ public class AsmAnalyzer { */ void findGlobs(String globPattern, Map<String, ClassReader> zipClasses, Map<String, ClassReader> inOutFound) throws LogAbortException { Pattern regexp = getPatternFromGlob(globPattern); for (Entry<String, ClassReader> entry : zipClasses.entrySet()) { String class_name = entry.getKey(); if (regexp.matcher(class_name).matches()) { findClass(class_name, zipClasses, inOutFound); } } } Pattern getPatternFromGlob(String globPattern) { // transforms the glob pattern in a regexp: // - escape "." with "\." // - replace "*" by "[^.]*" Loading @@ -216,14 +260,7 @@ public class AsmAnalyzer { globPattern = globPattern.replaceAll("@", ".*"); globPattern += "$"; Pattern regexp = Pattern.compile(globPattern); for (Entry<String, ClassReader> entry : zipClasses.entrySet()) { String class_name = entry.getKey(); if (regexp.matcher(class_name).matches()) { findClass(class_name, zipClasses, inOutFound); } } return Pattern.compile(globPattern); } /** Loading
tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java +31 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; Loading Loading @@ -52,6 +53,8 @@ public class AsmGenerator { private Map<String, ClassReader> mKeep; /** All dependencies that must be completely stubbed. */ private Map<String, ClassReader> mDeps; /** All files that are to be copied as-is. */ private Map<String, InputStream> mCopyFiles; /** Counter of number of classes renamed during transform. */ private int mRenameCount; /** FQCN Names of the classes to rename: map old-FQCN => new-FQCN */ Loading Loading @@ -195,6 +198,11 @@ public class AsmGenerator { mDeps = deps; } /** Sets the map of files to output as-is. */ public void setCopyFiles(Map<String, InputStream> copyFiles) { mCopyFiles = copyFiles; } /** Gets the map of classes to output as-is, except if they have native methods */ public Map<String, ClassReader> getKeep() { return mKeep; Loading @@ -205,6 +213,11 @@ public class AsmGenerator { return mDeps; } /** Gets the map of files to output as-is. */ public Map<String, InputStream> getCopyFiles() { return mCopyFiles; } /** Generates the final JAR */ public void generate() throws FileNotFoundException, IOException { TreeMap<String, byte[]> all = new TreeMap<String, byte[]>(); Loading Loading @@ -232,6 +245,15 @@ public class AsmGenerator { all.put(name, b); } for (Entry<String, InputStream> entry : mCopyFiles.entrySet()) { try { byte[] b = inputStreamToByteArray(entry.getValue()); all.put(entry.getKey(), b); } catch (IOException e) { // Ignore. } } mLog.info("# deps classes: %d", mDeps.size()); mLog.info("# keep classes: %d", mKeep.size()); mLog.info("# renamed : %d", mRenameCount); Loading Loading @@ -381,4 +403,13 @@ public class AsmGenerator { return cv.hasNativeMethods(); } private byte[] inputStreamToByteArray(InputStream is) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] data = new byte[8192]; // 8KB int n; while ((n = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, n); } return buffer.toByteArray(); } }
tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java +4 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,10 @@ public class Main { "android.database.ContentObserver", // for Digital clock "com.android.i18n.phonenumbers.*", // for TextView with autolink attribute }, excludeClasses); excludeClasses, new String[] { "com/android/i18n/phonenumbers/data/*", }); aa.analyze(); agen.generate(); Loading
tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java +32 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import org.junit.Test; import org.objectweb.asm.ClassReader; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; Loading @@ -55,8 +56,10 @@ public class AsmAnalyzerTest { Set<String> excludeClasses = new HashSet<String>(1); excludeClasses.add("java.lang.JavaClass"); mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */, null /* deriveFrom */, null /* includeGlobs */, excludeClasses); String[] includeFiles = new String[]{"mock_android/data/data*"}; mAa = new AsmAnalyzer(mLog, mOsJarPath, null /* gen */, null /* deriveFrom */, null /* includeGlobs */, excludeClasses, includeFiles); } @After Loading @@ -65,7 +68,11 @@ public class AsmAnalyzerTest { @Test public void testParseZip() throws IOException { Map<String, ClassReader> map = mAa.parseZip(mOsJarPath); Map<String, ClassReader> map = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, map, filesFound); assertArrayEquals(new String[] { "java.lang.JavaClass", Loading @@ -86,11 +93,17 @@ public class AsmAnalyzerTest { "mock_android.widget.TableLayout$LayoutParams" }, map.keySet().toArray()); assertArrayEquals(new String[] {"mock_android/data/dataFile"}, filesFound.keySet().toArray()); } @Test public void testFindClass() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams", Loading @@ -105,7 +118,11 @@ public class AsmAnalyzerTest { @Test public void testFindGlobs() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); // this matches classes, a package match returns nothing Loading Loading @@ -164,7 +181,11 @@ public class AsmAnalyzerTest { @Test public void testFindClassesDerivingFrom() throws LogAbortException, IOException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> found = new TreeMap<String, ClassReader>(); mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found); Loading @@ -186,7 +207,11 @@ public class AsmAnalyzerTest { @Test public void testDependencyVisitor() throws IOException, LogAbortException { Map<String, ClassReader> zipClasses = mAa.parseZip(mOsJarPath); Map<String, ClassReader> zipClasses = new TreeMap<String, ClassReader>(); Map<String, InputStream> filesFound = new TreeMap<String, InputStream>(); mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap<String, ClassReader> keep = new TreeMap<String, ClassReader>(); TreeMap<String, ClassReader> new_keep = new TreeMap<String, ClassReader>(); TreeMap<String, ClassReader> in_deps = new TreeMap<String, ClassReader>(); Loading