Merge "Fix system server compilation in ZygoteInit" into oc-mr1-dev

This commit is contained in:
Calin Juravle
2017-07-25 16:54:06 +00:00
committed by Android (Google) Code Review

View File

@@ -538,7 +538,7 @@ public class ZygoteInit {
.asInterface(ServiceManager.getService("installd")); .asInterface(ServiceManager.getService("installd"));
final String instructionSet = VMRuntime.getRuntime().vmInstructionSet(); final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();
String sharedLibraries = ""; String classPathForElement = "";
for (String classPathElement : classPathElements) { for (String classPathElement : classPathElements) {
// System server is fully AOTed and never profiled // System server is fully AOTed and never profiled
// for profile guided compilation. // for profile guided compilation.
@@ -570,10 +570,12 @@ public class ZygoteInit {
final String compilerFilter = systemServerFilter; final String compilerFilter = systemServerFilter;
final String uuid = StorageManager.UUID_PRIVATE_INTERNAL; final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
final String seInfo = null; final String seInfo = null;
final String classLoaderContext =
getSystemServerClassLoaderContext(classPathForElement);
try { try {
installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName, installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter, instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter,
uuid, sharedLibraries, seInfo, false /* downgrade */); uuid, classLoaderContext, seInfo, false /* downgrade */);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
// Ignore (but log), we need this on the classpath for fallback mode. // Ignore (but log), we need this on the classpath for fallback mode.
Log.w(TAG, "Failed compiling classpath element for system server: " Log.w(TAG, "Failed compiling classpath element for system server: "
@@ -581,13 +583,35 @@ public class ZygoteInit {
} }
} }
if (!sharedLibraries.isEmpty()) { classPathForElement = encodeSystemServerClassPath(
sharedLibraries += ":"; classPathForElement, classPathElement);
}
sharedLibraries += 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. * Prepare the arguments and forks for the system server process.
* *