Loading core/java/android/app/ApplicationLoaders.java +4 −4 Original line number Diff line number Diff line Loading @@ -157,15 +157,15 @@ public class ApplicationLoaders { * All libraries in the closure of libraries to be loaded must be in libs. A library can * only depend on libraries that come before it in the list. */ public void createAndCacheNonBootclasspathSystemClassLoaders(SharedLibraryInfo[] libs) { public void createAndCacheNonBootclasspathSystemClassLoaders(List<SharedLibraryInfo> libs) { if (mSystemLibsCacheMap != null) { throw new IllegalStateException("Already cached."); } mSystemLibsCacheMap = new HashMap<String, CachedClassLoader>(); mSystemLibsCacheMap = new HashMap<>(); for (SharedLibraryInfo lib : libs) { createAndCacheNonBootclasspathSystemClassLoader(lib); for (int i = 0; i < libs.size(); i++) { createAndCacheNonBootclasspathSystemClassLoader(libs.get(i)); } } Loading core/java/com/android/internal/os/ZygoteInit.java +33 −14 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.util.TimingsTraceLog; import android.view.WindowManager; import android.webkit.WebViewFactory; import android.widget.TextView; Loading @@ -72,6 +73,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.security.Provider; import java.security.Security; import java.util.ArrayList; import java.util.List; /** * Startup class for the zygote process. Loading Loading @@ -384,33 +387,49 @@ public class ZygoteInit { * classpath. */ private static void cacheNonBootClasspathClassLoaders() { // Ordered dependencies first final List<SharedLibraryInfo> libs = new ArrayList<>(); // These libraries used to be part of the bootclasspath, but had to be removed. // Old system applications still get them for backwards compatibility reasons, // so they are cached here in order to preserve performance characteristics. SharedLibraryInfo hidlBase = new SharedLibraryInfo( libs.add(new SharedLibraryInfo( "/system/framework/android.hidl.base-V1.0-java.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); SharedLibraryInfo hidlManager = new SharedLibraryInfo( false /*isNative*/)); libs.add(new SharedLibraryInfo( "/system/framework/android.hidl.manager-V1.0-java.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); false /*isNative*/)); SharedLibraryInfo androidTestBase = new SharedLibraryInfo( libs.add(new SharedLibraryInfo( "/system/framework/android.test.base.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{ // ordered dependencies first hidlBase, hidlManager, androidTestBase, }); false /*isNative*/)); // WindowManager Extensions is an optional shared library that is required for WindowManager // Jetpack to fully function. Since it is a widely used library, preload it to improve apps // startup performance. if (WindowManager.hasWindowExtensionsEnabled()) { final String systemExtFrameworkPath = new File(Environment.getSystemExtDirectory(), "framework").getPath(); libs.add(new SharedLibraryInfo( systemExtFrameworkPath + "/androidx.window.extensions.jar", "androidx.window.extensions", null /*codePaths*/, "androidx.window.extensions", SharedLibraryInfo.VERSION_UNDEFINED, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/)); libs.add(new SharedLibraryInfo( systemExtFrameworkPath + "/androidx.window.sidecar.jar", "androidx.window.sidecar", null /*codePaths*/, "androidx.window.sidecar", SharedLibraryInfo.VERSION_UNDEFINED, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/)); } ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders(libs); } /** Loading core/tests/coretests/src/android/app/ApplicationLoadersTest.java +16 −14 Original line number Diff line number Diff line Loading @@ -16,14 +16,17 @@ package android.app; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import android.content.pm.SharedLibraryInfo; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.google.android.collect.Lists; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -48,7 +51,7 @@ public class ApplicationLoadersTest { @Test public void testGetNonExistantLib() { ApplicationLoaders loaders = new ApplicationLoaders(); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( "/system/framework/nonexistantlib.jar", null, null, null)); } Loading @@ -57,9 +60,9 @@ public class ApplicationLoadersTest { ApplicationLoaders loaders = new ApplicationLoaders(); SharedLibraryInfo libA = createLib(LIB_A); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNotNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, null)); } Loading @@ -71,9 +74,9 @@ public class ApplicationLoadersTest { ClassLoader parent = ClassLoader.getSystemClassLoader(); assertNotEquals(null, parent); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, parent, null, null)); } Loading @@ -82,9 +85,9 @@ public class ApplicationLoadersTest { ApplicationLoaders loaders = new ApplicationLoaders(); SharedLibraryInfo libA = createLib(LIB_A); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, "other classloader", null)); } Loading @@ -98,9 +101,9 @@ public class ApplicationLoadersTest { ArrayList<ClassLoader> sharedLibraries = new ArrayList<>(); sharedLibraries.add(dep); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, sharedLibraries)); } Loading @@ -112,7 +115,7 @@ public class ApplicationLoadersTest { libB.addDependency(libA); loaders.createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{libA, libB}); Lists.newArrayList(libA, libB)); ClassLoader loadA = loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, null); Loading @@ -121,7 +124,7 @@ public class ApplicationLoadersTest { ArrayList<ClassLoader> sharedLibraries = new ArrayList<>(); sharedLibraries.add(loadA); assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNotNull(loaders.getCachedNonBootclasspathSystemLib( LIB_DEP_A, null, null, sharedLibraries)); } Loading @@ -132,7 +135,6 @@ public class ApplicationLoadersTest { SharedLibraryInfo libB = createLib(LIB_DEP_A); libB.addDependency(libA); loaders.createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{libB, libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libB, libA)); } } Loading
core/java/android/app/ApplicationLoaders.java +4 −4 Original line number Diff line number Diff line Loading @@ -157,15 +157,15 @@ public class ApplicationLoaders { * All libraries in the closure of libraries to be loaded must be in libs. A library can * only depend on libraries that come before it in the list. */ public void createAndCacheNonBootclasspathSystemClassLoaders(SharedLibraryInfo[] libs) { public void createAndCacheNonBootclasspathSystemClassLoaders(List<SharedLibraryInfo> libs) { if (mSystemLibsCacheMap != null) { throw new IllegalStateException("Already cached."); } mSystemLibsCacheMap = new HashMap<String, CachedClassLoader>(); mSystemLibsCacheMap = new HashMap<>(); for (SharedLibraryInfo lib : libs) { createAndCacheNonBootclasspathSystemClassLoader(lib); for (int i = 0; i < libs.size(); i++) { createAndCacheNonBootclasspathSystemClassLoader(libs.get(i)); } } Loading
core/java/com/android/internal/os/ZygoteInit.java +33 −14 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.util.TimingsTraceLog; import android.view.WindowManager; import android.webkit.WebViewFactory; import android.widget.TextView; Loading @@ -72,6 +73,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.security.Provider; import java.security.Security; import java.util.ArrayList; import java.util.List; /** * Startup class for the zygote process. Loading Loading @@ -384,33 +387,49 @@ public class ZygoteInit { * classpath. */ private static void cacheNonBootClasspathClassLoaders() { // Ordered dependencies first final List<SharedLibraryInfo> libs = new ArrayList<>(); // These libraries used to be part of the bootclasspath, but had to be removed. // Old system applications still get them for backwards compatibility reasons, // so they are cached here in order to preserve performance characteristics. SharedLibraryInfo hidlBase = new SharedLibraryInfo( libs.add(new SharedLibraryInfo( "/system/framework/android.hidl.base-V1.0-java.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); SharedLibraryInfo hidlManager = new SharedLibraryInfo( false /*isNative*/)); libs.add(new SharedLibraryInfo( "/system/framework/android.hidl.manager-V1.0-java.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); false /*isNative*/)); SharedLibraryInfo androidTestBase = new SharedLibraryInfo( libs.add(new SharedLibraryInfo( "/system/framework/android.test.base.jar", null /*packageName*/, null /*codePaths*/, null /*name*/, 0 /*version*/, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/); ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{ // ordered dependencies first hidlBase, hidlManager, androidTestBase, }); false /*isNative*/)); // WindowManager Extensions is an optional shared library that is required for WindowManager // Jetpack to fully function. Since it is a widely used library, preload it to improve apps // startup performance. if (WindowManager.hasWindowExtensionsEnabled()) { final String systemExtFrameworkPath = new File(Environment.getSystemExtDirectory(), "framework").getPath(); libs.add(new SharedLibraryInfo( systemExtFrameworkPath + "/androidx.window.extensions.jar", "androidx.window.extensions", null /*codePaths*/, "androidx.window.extensions", SharedLibraryInfo.VERSION_UNDEFINED, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/)); libs.add(new SharedLibraryInfo( systemExtFrameworkPath + "/androidx.window.sidecar.jar", "androidx.window.sidecar", null /*codePaths*/, "androidx.window.sidecar", SharedLibraryInfo.VERSION_UNDEFINED, SharedLibraryInfo.TYPE_BUILTIN, null /*declaringPackage*/, null /*dependentPackages*/, null /*dependencies*/, false /*isNative*/)); } ApplicationLoaders.getDefault().createAndCacheNonBootclasspathSystemClassLoaders(libs); } /** Loading
core/tests/coretests/src/android/app/ApplicationLoadersTest.java +16 −14 Original line number Diff line number Diff line Loading @@ -16,14 +16,17 @@ package android.app; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import android.content.pm.SharedLibraryInfo; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.google.android.collect.Lists; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -48,7 +51,7 @@ public class ApplicationLoadersTest { @Test public void testGetNonExistantLib() { ApplicationLoaders loaders = new ApplicationLoaders(); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( "/system/framework/nonexistantlib.jar", null, null, null)); } Loading @@ -57,9 +60,9 @@ public class ApplicationLoadersTest { ApplicationLoaders loaders = new ApplicationLoaders(); SharedLibraryInfo libA = createLib(LIB_A); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNotNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, null)); } Loading @@ -71,9 +74,9 @@ public class ApplicationLoadersTest { ClassLoader parent = ClassLoader.getSystemClassLoader(); assertNotEquals(null, parent); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, parent, null, null)); } Loading @@ -82,9 +85,9 @@ public class ApplicationLoadersTest { ApplicationLoaders loaders = new ApplicationLoaders(); SharedLibraryInfo libA = createLib(LIB_A); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, "other classloader", null)); } Loading @@ -98,9 +101,9 @@ public class ApplicationLoadersTest { ArrayList<ClassLoader> sharedLibraries = new ArrayList<>(); sharedLibraries.add(dep); loaders.createAndCacheNonBootclasspathSystemClassLoaders(new SharedLibraryInfo[]{libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libA)); assertEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNull(loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, sharedLibraries)); } Loading @@ -112,7 +115,7 @@ public class ApplicationLoadersTest { libB.addDependency(libA); loaders.createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{libA, libB}); Lists.newArrayList(libA, libB)); ClassLoader loadA = loaders.getCachedNonBootclasspathSystemLib( LIB_A, null, null, null); Loading @@ -121,7 +124,7 @@ public class ApplicationLoadersTest { ArrayList<ClassLoader> sharedLibraries = new ArrayList<>(); sharedLibraries.add(loadA); assertNotEquals(null, loaders.getCachedNonBootclasspathSystemLib( assertNotNull(loaders.getCachedNonBootclasspathSystemLib( LIB_DEP_A, null, null, sharedLibraries)); } Loading @@ -132,7 +135,6 @@ public class ApplicationLoadersTest { SharedLibraryInfo libB = createLib(LIB_DEP_A); libB.addDependency(libA); loaders.createAndCacheNonBootclasspathSystemClassLoaders( new SharedLibraryInfo[]{libB, libA}); loaders.createAndCacheNonBootclasspathSystemClassLoaders(Lists.newArrayList(libB, libA)); } }