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

Commit 5a63c659 authored by Jiyong Park's avatar Jiyong Park Committed by Android (Google) Code Review
Browse files

Merge "Introduce uses-native-library tag"

parents 3e9bfcf8 6a5b8b1f
Loading
Loading
Loading
Loading
+20 −8
Original line number Original line Diff line number Diff line
@@ -48,17 +48,18 @@ public class ApplicationLoaders {
                               ClassLoader parent, String classLoaderName) {
                               ClassLoader parent, String classLoaderName) {
        return getClassLoaderWithSharedLibraries(zip, targetSdkVersion, isBundled,
        return getClassLoaderWithSharedLibraries(zip, targetSdkVersion, isBundled,
                              librarySearchPath, libraryPermittedPath, parent, classLoaderName,
                              librarySearchPath, libraryPermittedPath, parent, classLoaderName,
                              null);
                              null, null);
    }
    }


    ClassLoader getClassLoaderWithSharedLibraries(
    ClassLoader getClassLoaderWithSharedLibraries(
            String zip, int targetSdkVersion, boolean isBundled,
            String zip, int targetSdkVersion, boolean isBundled,
            String librarySearchPath, String libraryPermittedPath,
            String librarySearchPath, String libraryPermittedPath,
            ClassLoader parent, String classLoaderName,
            ClassLoader parent, String classLoaderName,
            List<ClassLoader> sharedLibraries) {
            List<ClassLoader> sharedLibraries, List<String> nativeSharedLibraries) {
        // For normal usage the cache key used is the same as the zip path.
        // For normal usage the cache key used is the same as the zip path.
        return getClassLoader(zip, targetSdkVersion, isBundled, librarySearchPath,
        return getClassLoader(zip, targetSdkVersion, isBundled, librarySearchPath,
                              libraryPermittedPath, parent, zip, classLoaderName, sharedLibraries);
                              libraryPermittedPath, parent, zip, classLoaderName, sharedLibraries,
                              nativeSharedLibraries);
    }
    }


    /**
    /**
@@ -77,14 +78,22 @@ public class ApplicationLoaders {
            return loader;
            return loader;
        }
        }


        // TODO(b/142191088): allow (Java) shared libraries to have <uses-native-library>
        // Until that is supported, assume that all native shared libraries are used.
        // "ALL" is a magic string that libnativeloader uses to unconditionally add all available
        // native shared libraries to the classloader.
        List<String> nativeSharedLibraries = new ArrayList<>();
        nativeSharedLibraries.add("ALL");
        return getClassLoaderWithSharedLibraries(zip, targetSdkVersion, isBundled,
        return getClassLoaderWithSharedLibraries(zip, targetSdkVersion, isBundled,
              librarySearchPath, libraryPermittedPath, parent, classLoaderName, sharedLibraries);
              librarySearchPath, libraryPermittedPath, parent, classLoaderName, sharedLibraries,
              nativeSharedLibraries);
    }
    }


    private ClassLoader getClassLoader(String zip, int targetSdkVersion, boolean isBundled,
    private ClassLoader getClassLoader(String zip, int targetSdkVersion, boolean isBundled,
                                       String librarySearchPath, String libraryPermittedPath,
                                       String librarySearchPath, String libraryPermittedPath,
                                       ClassLoader parent, String cacheKey,
                                       ClassLoader parent, String cacheKey,
                                       String classLoaderName, List<ClassLoader> sharedLibraries) {
                                       String classLoaderName, List<ClassLoader> sharedLibraries,
                                       List<String> nativeSharedLibraries) {
        /*
        /*
         * This is the parent we use if they pass "null" in.  In theory
         * This is the parent we use if they pass "null" in.  In theory
         * this should be the "system" class loader; in practice we
         * this should be the "system" class loader; in practice we
@@ -113,7 +122,8 @@ public class ApplicationLoaders {


                ClassLoader classloader = ClassLoaderFactory.createClassLoader(
                ClassLoader classloader = ClassLoaderFactory.createClassLoader(
                        zip,  librarySearchPath, libraryPermittedPath, parent,
                        zip,  librarySearchPath, libraryPermittedPath, parent,
                        targetSdkVersion, isBundled, classLoaderName, sharedLibraries);
                        targetSdkVersion, isBundled, classLoaderName, sharedLibraries,
                        nativeSharedLibraries);


                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);


@@ -185,7 +195,8 @@ public class ApplicationLoaders {
        // assume cached libraries work with current sdk since they are built-in
        // assume cached libraries work with current sdk since they are built-in
        ClassLoader classLoader = getClassLoader(path, Build.VERSION.SDK_INT, true /*isBundled*/,
        ClassLoader classLoader = getClassLoader(path, Build.VERSION.SDK_INT, true /*isBundled*/,
                null /*librarySearchPath*/, null /*libraryPermittedPath*/, null /*parent*/,
                null /*librarySearchPath*/, null /*libraryPermittedPath*/, null /*parent*/,
                null /*cacheKey*/, null /*classLoaderName*/, sharedLibraries /*sharedLibraries*/);
                null /*cacheKey*/, null /*classLoaderName*/, sharedLibraries /*sharedLibraries*/,
                null /* nativeSharedLibraries */);


        if (classLoader == null) {
        if (classLoader == null) {
            // bad configuration or break in classloading code
            // bad configuration or break in classloading code
@@ -255,7 +266,8 @@ public class ApplicationLoaders {
        // The cache key is passed separately to enable the stub WebView to be cached under the
        // The cache key is passed separately to enable the stub WebView to be cached under the
        // stub's APK path, when the actual package path is the donor APK.
        // stub's APK path, when the actual package path is the donor APK.
        return getClassLoader(packagePath, Build.VERSION.SDK_INT, false, libsPath, null, null,
        return getClassLoader(packagePath, Build.VERSION.SDK_INT, false, libsPath, null, null,
                              cacheKey, null /* classLoaderName */, null /* sharedLibraries */);
                              cacheKey, null /* classLoaderName */, null /* sharedLibraries */,
                              null /* nativeSharedLibraries */);
    }
    }


    /**
    /**
+22 −1
Original line number Original line Diff line number Diff line
@@ -412,6 +412,12 @@ public final class LoadedApk {
            return;
            return;
        }
        }
        for (SharedLibraryInfo lib : sharedLibraries) {
        for (SharedLibraryInfo lib : sharedLibraries) {
            if (lib.isNative()) {
                // Native shared lib doesn't contribute to the native lib search path. Its name is
                // sent to libnativeloader and then the native shared lib is exported from the
                // default linker namespace.
                continue;
            }
            List<String> paths = lib.getAllCodePaths();
            List<String> paths = lib.getAllCodePaths();
            outSeenPaths.addAll(paths);
            outSeenPaths.addAll(paths);
            for (String path : paths) {
            for (String path : paths) {
@@ -696,6 +702,12 @@ public final class LoadedApk {
        }
        }
        List<ClassLoader> loaders = new ArrayList<>();
        List<ClassLoader> loaders = new ArrayList<>();
        for (SharedLibraryInfo info : sharedLibraries) {
        for (SharedLibraryInfo info : sharedLibraries) {
            if (info.isNative()) {
                // Native shared lib doesn't contribute to the native lib search path. Its name is
                // sent to libnativeloader and then the native shared lib is exported from the
                // default linker namespace.
                continue;
            }
            loaders.add(createSharedLibraryLoader(
            loaders.add(createSharedLibraryLoader(
                    info, isBundledApp, librarySearchPath, libraryPermittedPath));
                    info, isBundledApp, librarySearchPath, libraryPermittedPath));
        }
        }
@@ -898,10 +910,19 @@ public final class LoadedApk {
                    mApplicationInfo.sharedLibraryInfos, isBundledApp, librarySearchPath,
                    mApplicationInfo.sharedLibraryInfos, isBundledApp, librarySearchPath,
                    libraryPermittedPath);
                    libraryPermittedPath);


            List<String> nativeSharedLibraries = new ArrayList<>();
            if (mApplicationInfo.sharedLibraryInfos != null) {
                for (SharedLibraryInfo info : mApplicationInfo.sharedLibraryInfos) {
                    if (info.isNative()) {
                        nativeSharedLibraries.add(info.getName());
                    }
                }
            }

            mDefaultClassLoader = ApplicationLoaders.getDefault().getClassLoaderWithSharedLibraries(
            mDefaultClassLoader = ApplicationLoaders.getDefault().getClassLoaderWithSharedLibraries(
                    zip, mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
                    zip, mApplicationInfo.targetSdkVersion, isBundledApp, librarySearchPath,
                    libraryPermittedPath, mBaseClassLoader,
                    libraryPermittedPath, mBaseClassLoader,
                    mApplicationInfo.classLoaderName, sharedLibraries);
                    mApplicationInfo.classLoaderName, sharedLibraries, nativeSharedLibraries);
            mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader);
            mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader);


            setThreadPolicy(oldPolicy);
            setThreadPolicy(oldPolicy);
+24 −1
Original line number Original line Diff line number Diff line
@@ -79,6 +79,7 @@ public final class SharedLibraryInfo implements Parcelable {


    private final long mVersion;
    private final long mVersion;
    private final @Type int mType;
    private final @Type int mType;
    private final boolean mIsNative;
    private final VersionedPackage mDeclaringPackage;
    private final VersionedPackage mDeclaringPackage;
    private final List<VersionedPackage> mDependentPackages;
    private final List<VersionedPackage> mDependentPackages;
    private List<SharedLibraryInfo> mDependencies;
    private List<SharedLibraryInfo> mDependencies;
@@ -93,13 +94,14 @@ public final class SharedLibraryInfo implements Parcelable {
     * @param type The lib type.
     * @param type The lib type.
     * @param declaringPackage The package that declares the library.
     * @param declaringPackage The package that declares the library.
     * @param dependentPackages The packages that depend on the library.
     * @param dependentPackages The packages that depend on the library.
     * @param isNative indicate if this shared lib is a native lib or not (i.e. java)
     *
     *
     * @hide
     * @hide
     */
     */
    public SharedLibraryInfo(String path, String packageName, List<String> codePaths,
    public SharedLibraryInfo(String path, String packageName, List<String> codePaths,
            String name, long version, int type,
            String name, long version, int type,
            VersionedPackage declaringPackage, List<VersionedPackage> dependentPackages,
            VersionedPackage declaringPackage, List<VersionedPackage> dependentPackages,
            List<SharedLibraryInfo> dependencies) {
            List<SharedLibraryInfo> dependencies, boolean isNative) {
        mPath = path;
        mPath = path;
        mPackageName = packageName;
        mPackageName = packageName;
        mCodePaths = codePaths;
        mCodePaths = codePaths;
@@ -109,6 +111,16 @@ public final class SharedLibraryInfo implements Parcelable {
        mDeclaringPackage = declaringPackage;
        mDeclaringPackage = declaringPackage;
        mDependentPackages = dependentPackages;
        mDependentPackages = dependentPackages;
        mDependencies = dependencies;
        mDependencies = dependencies;
        mIsNative = isNative;
    }

    /** @hide */
    public SharedLibraryInfo(String path, String packageName, List<String> codePaths,
            String name, long version, int type,
            VersionedPackage declaringPackage, List<VersionedPackage> dependentPackages,
            List<SharedLibraryInfo> dependencies) {
        this(path, packageName, codePaths, name, version, type, declaringPackage, dependentPackages,
            dependencies, false /* isNative */);
    }
    }


    private SharedLibraryInfo(Parcel parcel) {
    private SharedLibraryInfo(Parcel parcel) {
@@ -125,6 +137,7 @@ public final class SharedLibraryInfo implements Parcelable {
        mDeclaringPackage = parcel.readParcelable(null);
        mDeclaringPackage = parcel.readParcelable(null);
        mDependentPackages = parcel.readArrayList(null);
        mDependentPackages = parcel.readArrayList(null);
        mDependencies = parcel.createTypedArrayList(SharedLibraryInfo.CREATOR);
        mDependencies = parcel.createTypedArrayList(SharedLibraryInfo.CREATOR);
        mIsNative = parcel.readBoolean();
    }
    }


    /**
    /**
@@ -136,6 +149,15 @@ public final class SharedLibraryInfo implements Parcelable {
        return mType;
        return mType;
    }
    }


    /**
     * Tells whether this library is a native shared library or not.
     *
     * @hide
     */
    public boolean isNative() {
        return mIsNative;
    }

    /**
    /**
     * Gets the library name an app defines in its manifest
     * Gets the library name an app defines in its manifest
     * to depend on the library.
     * to depend on the library.
@@ -320,6 +342,7 @@ public final class SharedLibraryInfo implements Parcelable {
        parcel.writeParcelable(mDeclaringPackage, flags);
        parcel.writeParcelable(mDeclaringPackage, flags);
        parcel.writeList(mDependentPackages);
        parcel.writeList(mDependentPackages);
        parcel.writeTypedList(mDependencies);
        parcel.writeTypedList(mDependencies);
        parcel.writeBoolean(mIsNative);
    }
    }


    private static String typeToString(int type) {
    private static String typeToString(int type) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -92,6 +92,10 @@ public interface ParsingPackage extends ParsingPackageRead {


    ParsingPackage addUsesOptionalLibrary(String libraryName);
    ParsingPackage addUsesOptionalLibrary(String libraryName);


    ParsingPackage addUsesNativeLibrary(String libraryName);

    ParsingPackage addUsesOptionalNativeLibrary(String libraryName);

    ParsingPackage addUsesStaticLibrary(String libraryName);
    ParsingPackage addUsesStaticLibrary(String libraryName);


    ParsingPackage addUsesStaticLibraryCertDigests(String[] certSha256Digests);
    ParsingPackage addUsesStaticLibraryCertDigests(String[] certSha256Digests);
@@ -219,6 +223,8 @@ public interface ParsingPackage extends ParsingPackageRead {


    ParsingPackage removeUsesOptionalLibrary(String libraryName);
    ParsingPackage removeUsesOptionalLibrary(String libraryName);


    ParsingPackage removeUsesOptionalNativeLibrary(String libraryName);

    ParsingPackage setAnyDensity(int anyDensity);
    ParsingPackage setAnyDensity(int anyDensity);


    ParsingPackage setAppComponentFactory(String appComponentFactory);
    ParsingPackage setAppComponentFactory(String appComponentFactory);
+44 −0
Original line number Original line Diff line number Diff line
@@ -184,6 +184,13 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
    @DataClass.ParcelWith(ForInternedStringList.class)
    @DataClass.ParcelWith(ForInternedStringList.class)
    protected List<String> usesOptionalLibraries = emptyList();
    protected List<String> usesOptionalLibraries = emptyList();


    @NonNull
    @DataClass.ParcelWith(ForInternedStringList.class)
    protected List<String> usesNativeLibraries = emptyList();
    @NonNull
    @DataClass.ParcelWith(ForInternedStringList.class)
    protected List<String> usesOptionalNativeLibraries = emptyList();

    @NonNull
    @NonNull
    @DataClass.ParcelWith(ForInternedStringList.class)
    @DataClass.ParcelWith(ForInternedStringList.class)
    private List<String> usesStaticLibraries = emptyList();
    private List<String> usesStaticLibraries = emptyList();
@@ -668,6 +675,27 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
        return this;
        return this;
    }
    }


    @Override
    public final ParsingPackageImpl addUsesOptionalNativeLibrary(String libraryName) {
        this.usesOptionalNativeLibraries = CollectionUtils.add(this.usesOptionalNativeLibraries,
                TextUtils.safeIntern(libraryName));
        return this;
    }

    @Override
    public final ParsingPackageImpl addUsesNativeLibrary(String libraryName) {
        this.usesNativeLibraries = CollectionUtils.add(this.usesNativeLibraries,
                TextUtils.safeIntern(libraryName));
        return this;
    }


    @Override public ParsingPackageImpl removeUsesOptionalNativeLibrary(String libraryName) {
        this.usesOptionalNativeLibraries = CollectionUtils.remove(this.usesOptionalNativeLibraries,
                libraryName);
        return this;
    }

    @Override
    @Override
    public ParsingPackageImpl addUsesStaticLibrary(String libraryName) {
    public ParsingPackageImpl addUsesStaticLibrary(String libraryName) {
        this.usesStaticLibraries = CollectionUtils.add(this.usesStaticLibraries,
        this.usesStaticLibraries = CollectionUtils.add(this.usesStaticLibraries,
@@ -982,6 +1010,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
        sForInternedStringList.parcel(this.libraryNames, dest, flags);
        sForInternedStringList.parcel(this.libraryNames, dest, flags);
        sForInternedStringList.parcel(this.usesLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesNativeLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesOptionalNativeLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags);
        sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags);
        dest.writeLongArray(this.usesStaticLibrariesVersions);
        dest.writeLongArray(this.usesStaticLibrariesVersions);


@@ -1144,6 +1174,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
        this.libraryNames = sForInternedStringList.unparcel(in);
        this.libraryNames = sForInternedStringList.unparcel(in);
        this.usesLibraries = sForInternedStringList.unparcel(in);
        this.usesLibraries = sForInternedStringList.unparcel(in);
        this.usesOptionalLibraries = sForInternedStringList.unparcel(in);
        this.usesOptionalLibraries = sForInternedStringList.unparcel(in);
        this.usesNativeLibraries = sForInternedStringList.unparcel(in);
        this.usesOptionalNativeLibraries = sForInternedStringList.unparcel(in);
        this.usesStaticLibraries = sForInternedStringList.unparcel(in);
        this.usesStaticLibraries = sForInternedStringList.unparcel(in);
        this.usesStaticLibrariesVersions = in.createLongArray();
        this.usesStaticLibrariesVersions = in.createLongArray();


@@ -1415,6 +1447,18 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
        return usesOptionalLibraries;
        return usesOptionalLibraries;
    }
    }


    @NonNull
    @Override
    public List<String> getUsesNativeLibraries() {
        return usesNativeLibraries;
    }

    @NonNull
    @Override
    public List<String> getUsesOptionalNativeLibraries() {
        return usesOptionalNativeLibraries;
    }

    @NonNull
    @NonNull
    @Override
    @Override
    public List<String> getUsesStaticLibraries() {
    public List<String> getUsesStaticLibraries() {
Loading