From 6df2860b2316fb42e8686c3154b2156619c7777f Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 16 Jan 2014 14:16:23 -0800 Subject: [PATCH] Add missing files to fix libphonenumber for layoutlib. [DO NOT MERGE] Change-Id: I8102da6c1c4625e887293a8823770d199521c53f (cherry-picked from 8a16f8e29a67c383e065ba9c47d5d1e80d7d2db9) --- tools/layoutlib/Android.mk | 5 +- .../tools/layoutlib/create/AsmAnalyzer.java | 69 ++++++++++++++---- .../tools/layoutlib/create/AsmGenerator.java | 31 ++++++++ .../android/tools/layoutlib/create/Main.java | 5 +- .../layoutlib/create/AsmAnalyzerTest.java | 39 ++++++++-- .../layoutlib/create/AsmGeneratorTest.java | 23 ++++-- .../create/tests/data/mock_android.jar | Bin 9096 -> 14872 bytes .../mock_android/data/anotherDataFile | 1 + .../mock_data/mock_android/data/dataFile | 1 + 9 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 tools/layoutlib/create/tests/mock_data/mock_android/data/anotherDataFile create mode 100644 tools/layoutlib/create/tests/mock_data/mock_android/data/dataFile diff --git a/tools/layoutlib/Android.mk b/tools/layoutlib/Android.mk index 8a4b5b345a170..12acb094c1517 100644 --- a/tools/layoutlib/Android.mk +++ b/tools/layoutlib/Android.mk @@ -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 @@ -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) diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java index 1572a4034432a..9a31705d0a3a9 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java @@ -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; @@ -60,6 +61,9 @@ public class AsmAnalyzer { private final String[] mIncludeGlobs; /** The set of classes to exclude.*/ private final Set 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. @@ -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 osJarPath, AsmGenerator gen, - String[] deriveFrom, String[] includeGlobs, Set excludeClasses) { + String[] deriveFrom, String[] includeGlobs, Set excludeClasses, + String[] includeFileGlobs) { mLog = log; mGen = gen; mOsSourceJar = osJarPath != null ? osJarPath : new ArrayList(); mDeriveFrom = deriveFrom != null ? deriveFrom : new String[0]; mIncludeGlobs = includeGlobs != null ? includeGlobs : new String[0]; mExcludedClasses = excludeClasses; + mIncludeFileGlobs = includeFileGlobs != null ? includeFileGlobs : new String[0]; } /** @@ -86,7 +94,11 @@ public class AsmAnalyzer { * Fills the generator with classes & dependencies found. */ public void analyze() throws IOException, LogAbortException { - Map zipClasses = parseZip(mOsSourceJar); + + TreeMap zipClasses = new TreeMap(); + Map filesFound = new TreeMap(); + + parseZip(mOsSourceJar, zipClasses, filesFound); mLog.info("Found %d classes in input JAR%s.", zipClasses.size(), mOsSourceJar.size() > 1 ? "s" : ""); @@ -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 classes + * and all other files to filesFound. + * + * @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 parseZip(List jarPathList) throws IOException { - TreeMap classes = new TreeMap(); + void parseZip(List jarPathList, Map classes, + Map 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); @@ -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; } /** @@ -202,7 +234,19 @@ public class AsmAnalyzer { */ void findGlobs(String globPattern, Map zipClasses, Map inOutFound) throws LogAbortException { - // transforms the glob pattern in a regexp: + + Pattern regexp = getPatternFromGlob(globPattern); + + for (Entry 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 "[^.]*" // - escape "$" with "\$" @@ -216,14 +260,7 @@ public class AsmAnalyzer { globPattern = globPattern.replaceAll("@", ".*"); globPattern += "$"; - Pattern regexp = Pattern.compile(globPattern); - - for (Entry entry : zipClasses.entrySet()) { - String class_name = entry.getKey(); - if (regexp.matcher(class_name).matches()) { - findClass(class_name, zipClasses, inOutFound); - } - } + return Pattern.compile(globPattern); } /** diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java index b10256127ae88..207d8ae7b2d9e 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java @@ -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; @@ -52,6 +53,8 @@ public class AsmGenerator { private Map mKeep; /** All dependencies that must be completely stubbed. */ private Map mDeps; + /** All files that are to be copied as-is. */ + private Map mCopyFiles; /** Counter of number of classes renamed during transform. */ private int mRenameCount; /** FQCN Names of the classes to rename: map old-FQCN => new-FQCN */ @@ -195,6 +198,11 @@ public class AsmGenerator { mDeps = deps; } + /** Sets the map of files to output as-is. */ + public void setCopyFiles(Map copyFiles) { + mCopyFiles = copyFiles; + } + /** Gets the map of classes to output as-is, except if they have native methods */ public Map getKeep() { return mKeep; @@ -205,6 +213,11 @@ public class AsmGenerator { return mDeps; } + /** Gets the map of files to output as-is. */ + public Map getCopyFiles() { + return mCopyFiles; + } + /** Generates the final JAR */ public void generate() throws FileNotFoundException, IOException { TreeMap all = new TreeMap(); @@ -232,6 +245,15 @@ public class AsmGenerator { all.put(name, b); } + for (Entry 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); @@ -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(); + } } diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java index ee501d234d01f..a79fba19d2161 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java @@ -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(); diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java index 005fc9dadab41..7ec0d389be872 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmAnalyzerTest.java @@ -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; @@ -55,8 +56,10 @@ public class AsmAnalyzerTest { Set excludeClasses = new HashSet(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 @@ -65,7 +68,11 @@ public class AsmAnalyzerTest { @Test public void testParseZip() throws IOException { - Map map = mAa.parseZip(mOsJarPath); + + Map map = new TreeMap(); + Map filesFound = new TreeMap(); + + mAa.parseZip(mOsJarPath, map, filesFound); assertArrayEquals(new String[] { "java.lang.JavaClass", @@ -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 zipClasses = mAa.parseZip(mOsJarPath); + + Map zipClasses = new TreeMap(); + Map filesFound = new TreeMap(); + + mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap found = new TreeMap(); ClassReader cr = mAa.findClass("mock_android.view.ViewGroup$LayoutParams", @@ -105,7 +118,11 @@ public class AsmAnalyzerTest { @Test public void testFindGlobs() throws IOException, LogAbortException { - Map zipClasses = mAa.parseZip(mOsJarPath); + + Map zipClasses = new TreeMap(); + Map filesFound = new TreeMap(); + + mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap found = new TreeMap(); // this matches classes, a package match returns nothing @@ -164,7 +181,11 @@ public class AsmAnalyzerTest { @Test public void testFindClassesDerivingFrom() throws LogAbortException, IOException { - Map zipClasses = mAa.parseZip(mOsJarPath); + + Map zipClasses = new TreeMap(); + Map filesFound = new TreeMap(); + + mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap found = new TreeMap(); mAa.findClassesDerivingFrom("mock_android.view.View", zipClasses, found); @@ -186,7 +207,11 @@ public class AsmAnalyzerTest { @Test public void testDependencyVisitor() throws IOException, LogAbortException { - Map zipClasses = mAa.parseZip(mOsJarPath); + + Map zipClasses = new TreeMap(); + Map filesFound = new TreeMap(); + + mAa.parseZip(mOsJarPath, zipClasses, filesFound); TreeMap keep = new TreeMap(); TreeMap new_keep = new TreeMap(); TreeMap in_deps = new TreeMap(); diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java index 8a27173181a30..0dbc2387b1287 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/AsmGeneratorTest.java @@ -33,6 +33,7 @@ import org.objectweb.asm.Type; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; @@ -131,7 +132,8 @@ public class AsmGeneratorTest { new String[] { // include classes "**" }, - new HashSet(0) /* excluded classes */); + new HashSet(0) /* excluded classes */, + new String[]{} /* include files */); aa.analyze(); agen.generate(); @@ -195,10 +197,15 @@ public class AsmGeneratorTest { new String[] { // include classes "**" }, - new HashSet(1)); + new HashSet(1), + new String[] { /* include files */ + "mock_android/data/data*" + }); aa.analyze(); agen.generate(); - Map output = parseZip(mOsDestJar); + Map output = new TreeMap(); + Map filesFound = new TreeMap(); + parseZip(mOsDestJar, output, filesFound); boolean injectedClassFound = false; for (ClassReader cr: output.values()) { TestClassVisitor cv = new TestClassVisitor(); @@ -206,10 +213,13 @@ public class AsmGeneratorTest { injectedClassFound |= cv.mInjectedClassFound; } assertTrue(injectedClassFound); + assertArrayEquals(new String[] {"mock_android/data/dataFile"}, + filesFound.keySet().toArray()); } - private Map parseZip(String jarPath) throws IOException { - TreeMap classes = new TreeMap(); + private void parseZip(String jarPath, + Map classes, + Map filesFound) throws IOException { ZipFile zip = new ZipFile(jarPath); Enumeration entries = zip.entries(); @@ -220,10 +230,11 @@ public class AsmGeneratorTest { ClassReader cr = new ClassReader(zip.getInputStream(entry)); String className = classReaderToClassName(cr); classes.put(className, cr); + } else { + filesFound.put(entry.getName(), zip.getInputStream(entry)); } } - return classes; } private String classReaderToClassName(ClassReader classReader) { diff --git a/tools/layoutlib/create/tests/data/mock_android.jar b/tools/layoutlib/create/tests/data/mock_android.jar index 60d8efb1bb997982776ffa3a8b9a6824de644b60..8dd04812a866a6ed1677c039695686857275776e 100644 GIT binary patch literal 14872 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 DL~eN_ literal 9096 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 diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/data/anotherDataFile b/tools/layoutlib/create/tests/mock_data/mock_android/data/anotherDataFile new file mode 100644 index 0000000000000..ab29fbe449cf9 --- /dev/null +++ b/tools/layoutlib/create/tests/mock_data/mock_android/data/anotherDataFile @@ -0,0 +1 @@ +A simple data file that should *not* be copied to the output jar. \ No newline at end of file diff --git a/tools/layoutlib/create/tests/mock_data/mock_android/data/dataFile b/tools/layoutlib/create/tests/mock_data/mock_android/data/dataFile new file mode 100644 index 0000000000000..9b01893ebab37 --- /dev/null +++ b/tools/layoutlib/create/tests/mock_data/mock_android/data/dataFile @@ -0,0 +1 @@ +A simple data file that should be copied to the output jar unchanged. \ No newline at end of file