Merge "Load the default graphics driver in USAPs." into qt-dev

This commit is contained in:
Christian Wailes
2019-04-24 21:18:14 +00:00
committed by Android (Google) Code Review
5 changed files with 68 additions and 52 deletions

View File

@@ -512,57 +512,59 @@ public class Process {
* @param invokeWith null-ok the command to invoke with.
* @param packageName null-ok the name of the package this process belongs to.
* @param packagesForUid null-ok all the packages with the same uid as this process.
* @param zygoteArgs Additional arguments to supply to the zygote process.
* @param useSystemGraphicsDriver whether the process uses system graphics driver.
*
*
* @param zygoteArgs Additional arguments to supply to the zygote process.
* @return An object that describes the result of the attempt to start the process.
* @throws RuntimeException on fatal start failure
*
* {@hide}
*/
public static final ProcessStartResult start(@NonNull final String processClass,
@Nullable final String niceName,
int uid, int gid, @Nullable int[] gids,
int runtimeFlags, int mountExternal,
int targetSdkVersion,
@Nullable String seInfo,
@NonNull String abi,
@Nullable String instructionSet,
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
public static ProcessStartResult start(@NonNull final String processClass,
@Nullable final String niceName,
int uid, int gid, @Nullable int[] gids,
int runtimeFlags,
int mountExternal,
int targetSdkVersion,
@Nullable String seInfo,
@NonNull String abi,
@Nullable String instructionSet,
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ true,
zygoteArgs, useSystemGraphicsDriver);
packagesForUid, sandboxId, /*useUsapPool=*/ true,
useSystemGraphicsDriver, zygoteArgs);
}
/** @hide */
public static final ProcessStartResult startWebView(@NonNull final String processClass,
@Nullable final String niceName,
int uid, int gid, @Nullable int[] gids,
int runtimeFlags, int mountExternal,
int targetSdkVersion,
@Nullable String seInfo,
@NonNull String abi,
@Nullable String instructionSet,
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
public static ProcessStartResult startWebView(@NonNull final String processClass,
@Nullable final String niceName,
int uid, int gid, @Nullable int[] gids,
int runtimeFlags,
int mountExternal,
int targetSdkVersion,
@Nullable String seInfo,
@NonNull String abi,
@Nullable String instructionSet,
@Nullable String appDataDir,
@Nullable String invokeWith,
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ false,
zygoteArgs, useSystemGraphicsDriver);
packagesForUid, sandboxId, /*useUsapPool=*/ false,
useSystemGraphicsDriver, zygoteArgs);
}
/**

View File

@@ -327,8 +327,8 @@ public class ZygoteProcess {
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
boolean useUsapPool,
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
boolean useSystemGraphicsDriver,
@Nullable String[] zygoteArgs) {
// TODO (chriswailes): Is there a better place to check this value?
if (fetchUsapPoolEnabledPropWithMinInterval()) {
informZygotesOfUsapPoolStatus();
@@ -339,7 +339,7 @@ public class ZygoteProcess {
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, /*startChildZygote=*/ false,
packageName, packagesForUid, sandboxId,
useUsapPool, zygoteArgs);
useUsapPool, useSystemGraphicsDriver, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
@@ -548,7 +548,8 @@ public class ZygoteProcess {
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
boolean useUnspecializedAppProcessPool,
boolean useUsapPool,
boolean useSystemGraphicsDriver,
@Nullable String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<>();
@@ -635,8 +636,10 @@ public class ZygoteProcess {
}
synchronized(mLock) {
// The USAP pool can not be used if the application will not use the systems graphics
// driver. If that driver is requested use the Zygote application start path.
return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),
useUnspecializedAppProcessPool,
useUsapPool && useSystemGraphicsDriver,
argsForZygote);
}
}
@@ -1141,7 +1144,8 @@ public class ZygoteProcess {
abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
true /* startChildZygote */, null /* packageName */,
null /* packagesForUid */, null /* sandboxId */,
false /* useUsapPool */, extraArgs);
false /* useUsapPool */, false /*useSystemGraphicsDriver*/,
extraArgs);
} catch (ZygoteStartFailedEx ex) {
throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
}

View File

@@ -517,6 +517,9 @@ public final class Zygote {
Credentials peerCredentials = null;
ZygoteArguments args = null;
// Load resources
ZygoteInit.nativePreloadOpenGL();
while (true) {
try {
sessionSocket = usapPoolSocket.accept();

View File

@@ -150,7 +150,7 @@ public class ZygoteInit {
nativePreloadAppProcessHALs();
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadOpenGL");
preloadOpenGL();
maybePreloadOpenGL();
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
preloadSharedLibraries();
preloadTextResources();
@@ -192,9 +192,16 @@ public class ZygoteInit {
native private static void nativePreloadAppProcessHALs();
native private static void nativePreloadOpenGL();
/**
* This call loads the graphics driver by attempting to make an OpenGL call. If the driver is
* not currently in memory it will load and initialize it. The OpenGL call itself is relatively
* cheap and pure. This means that it is a low overhead on the initial call, and is safe and
* cheap to call later. Calls after the initial invocation will effectively be no-ops for the
* system.
*/
static native void nativePreloadOpenGL();
private static void preloadOpenGL() {
private static void maybePreloadOpenGL() {
String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER);
if (!SystemProperties.getBoolean(PROPERTY_DISABLE_OPENGL_PRELOADING, false) &&
(driverPackageName == null || driverPackageName.isEmpty())) {

View File

@@ -1827,8 +1827,8 @@ public final class ProcessList {
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, app.info.packageName,
packageNames, sandboxId,
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
useSystemGraphicsDriver,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else if (hostingRecord.usesAppZygote()) {
final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
@@ -1836,17 +1836,17 @@ public final class ProcessList {
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, null, app.info.packageName,
packageNames, sandboxId, /*useUnspecializedAppProcessPool=*/ false,
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
packageNames, sandboxId, /*useUsapPool=*/ false,
useSystemGraphicsDriver,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
} else {
startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith, app.info.packageName,
packageNames, sandboxId,
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
useSystemGraphicsDriver,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
checkSlow(startTime, "startProcess: returned from zygote!");
return startResult;