Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a955314d authored by Deepanshu Gupta's avatar Deepanshu Gupta Committed by Android (Google) Code Review
Browse files

Merge "Add missing files to fix libphonenumber for layoutlib." into klp-dev

parents fd8cba3a 58037a44
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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)


+53 −16
Original line number Diff line number Diff line
@@ -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<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.
@@ -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];
    }

    /**
@@ -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" : "");

@@ -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);
@@ -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,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 "[^.]*"
@@ -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);
    }

    /**
+31 −0
Original line number Diff line number Diff line
@@ -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<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 */
@@ -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;
@@ -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[]>();
@@ -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);
@@ -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();
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -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();

+32 −7
Original line number Diff line number Diff line
@@ -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<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
@@ -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",
@@ -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",
@@ -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
@@ -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);
@@ -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