From 2f09ff38f6f869809dbab6a15ea3db8add849703 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Mon, 24 Jul 2017 15:29:56 -0700 Subject: [PATCH] Fix system server compilation in ZygoteInit The code which dexopt SystemServer in ZygoteInit used to pass the sharedLibrary string in the old format. This CL updates the classPath string to the new class loader context encoding. Bug: 63941300 Test: compile WITH_DEXPREOPT=false and WITH_DEXPREOPT_BOOT_IMG_ONLY=false and check that when the device boots the correct context is passed to dex2oat. (cherry picked from commit b0dede3ec2e57a734fe17bef4920020c2d66488c) Change-Id: Ie27cd21b0b9c8b7e226bce74dfa297569ac12317 --- .../com/android/internal/os/ZygoteInit.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 0dbe971ed3f57..948f203119056 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -538,7 +538,7 @@ public class ZygoteInit { .asInterface(ServiceManager.getService("installd")); final String instructionSet = VMRuntime.getRuntime().vmInstructionSet(); - String sharedLibraries = ""; + String classPathForElement = ""; for (String classPathElement : classPathElements) { // System server is fully AOTed and never profiled // for profile guided compilation. @@ -570,10 +570,12 @@ public class ZygoteInit { final String compilerFilter = systemServerFilter; final String uuid = StorageManager.UUID_PRIVATE_INTERNAL; final String seInfo = null; + final String classLoaderContext = + getSystemServerClassLoaderContext(classPathForElement); try { installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName, instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter, - uuid, sharedLibraries, seInfo, false /* downgrade */); + uuid, classLoaderContext, seInfo, false /* downgrade */); } catch (RemoteException | ServiceSpecificException e) { // Ignore (but log), we need this on the classpath for fallback mode. Log.w(TAG, "Failed compiling classpath element for system server: " @@ -581,13 +583,35 @@ public class ZygoteInit { } } - if (!sharedLibraries.isEmpty()) { - sharedLibraries += ":"; - } - sharedLibraries += classPathElement; + classPathForElement = encodeSystemServerClassPath( + classPathForElement, classPathElement); } } + /** + * Encodes the system server class loader context in a format that is accepted by dexopt. + * This assumes the system server is always loaded with a {@link dalvik.system.PathClassLoader}. + * + * Note that ideally we would use the {@code DexoptUtils} to compute this. However we have no + * dependency here on the server so we hard code the logic again. + */ + private static String getSystemServerClassLoaderContext(String classPath) { + return classPath == null ? "PCL[]" : "PCL[" + classPath + "]"; + } + + /** + * Encodes the class path in a format accepted by dexopt. + * @param classPath the old class path (may be empty). + * @param newElement the new class path elements + * @return the class path encoding resulted from appending {@code newElement} to + * {@code classPath}. + */ + private static String encodeSystemServerClassPath(String classPath, String newElement) { + return (classPath == null || classPath.isEmpty()) + ? newElement + : classPath + ":" + newElement; + } + /** * Prepare the arguments and forks for the system server process. *