Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
am 47ad22e: am 961e328: am 6df2860: Add missing files to fix libphone…
Browse files Browse the repository at this point in the history
…number for layoutlib. [DO NOT MERGE]

* commit '47ad22edb7df502356598d417adbce0b0ce35616':
  Add missing files to fix libphonenumber for layoutlib. [DO NOT MERGE]
  • Loading branch information
deepanshu- authored and Android Git Automerger committed May 2, 2014
2 parents 8ad4b8b + 47ad22e commit 495c14d
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 31 deletions.
5 changes: 4 additions & 1 deletion tools/layoutlib/Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
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;
Expand Down Expand Up @@ -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.
Expand All @@ -70,23 +74,31 @@ 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];
}

/**
* Starts the analysis using parameters from the constructor.
* 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" : "");

Expand All @@ -96,15 +108,29 @@ public void analyze() throws IOException, LogAbortException {
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);
Expand All @@ -116,11 +142,17 @@ Map<String,ClassReader> parseZip(List<String> jarPathList) throws IOException {
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;
}

/**
Expand Down Expand Up @@ -202,7 +234,19 @@ ClassReader findClass(String className, Map<String, ClassReader> zipClasses,
*/
void findGlobs(String globPattern, Map<String, ClassReader> zipClasses,
Map<String, ClassReader> inOutFound) throws LogAbortException {
// transforms the glob pattern in a regexp:

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 "[^.]*"
// - escape "$" with "\$"
Expand All @@ -216,14 +260,7 @@ void findGlobs(String globPattern, Map<String, ClassReader> zipClasses,
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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -195,6 +198,11 @@ public void setDeps(Map<String, ClassReader> deps) {
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;
Expand All @@ -205,6 +213,11 @@ public Map<String, ClassReader> getDeps() {
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[]>();
Expand Down Expand Up @@ -232,6 +245,15 @@ public void generate() throws FileNotFoundException, IOException {
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);
Expand Down Expand Up @@ -381,4 +403,13 @@ boolean hasNativeMethods(ClassReader cr) {
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@ private static int createLayoutLib(String osDestJar, ArrayList<String> osJarPath
"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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
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;
Expand All @@ -55,8 +56,10 @@ public void setUp() throws Exception {

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
Expand All @@ -65,7 +68,11 @@ public void tearDown() throws Exception {

@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",
Expand All @@ -86,11 +93,17 @@ public void testParseZip() throws IOException {
"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",
Expand All @@ -105,7 +118,11 @@ public void testFindClass() throws IOException, LogAbortException {

@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
Expand Down Expand Up @@ -164,7 +181,11 @@ public void testFindGlobs() throws IOException, LogAbortException {

@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);
Expand All @@ -186,7 +207,11 @@ public void testFindClassesDerivingFrom() throws LogAbortException, IOException

@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>();
Expand Down

0 comments on commit 495c14d

Please sign in to comment.