Loading core/java/android/app/ApplicationLoaders.java +20 −8 Original line number Original line Diff line number Diff line Loading @@ -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); } } /** /** Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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 */); } } /** /** Loading core/java/android/app/LoadedApk.java +22 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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)); } } Loading Loading @@ -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); Loading core/java/android/content/pm/SharedLibraryInfo.java +24 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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) { Loading @@ -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(); } } /** /** Loading @@ -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. Loading Loading @@ -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) { Loading core/java/android/content/pm/parsing/ParsingPackage.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading core/java/android/content/pm/parsing/ParsingPackageImpl.java +44 −0 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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(); Loading Loading @@ -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 Loading
core/java/android/app/ApplicationLoaders.java +20 −8 Original line number Original line Diff line number Diff line Loading @@ -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); } } /** /** Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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 */); } } /** /** Loading
core/java/android/app/LoadedApk.java +22 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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)); } } Loading Loading @@ -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); Loading
core/java/android/content/pm/SharedLibraryInfo.java +24 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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) { Loading @@ -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(); } } /** /** Loading @@ -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. Loading Loading @@ -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) { Loading
core/java/android/content/pm/parsing/ParsingPackage.java +6 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading
core/java/android/content/pm/parsing/ParsingPackageImpl.java +44 −0 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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(); Loading Loading @@ -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