Merge "[GraphicsEnvironment] Expose API to query whether an app should use game driver." into qt-dev

This commit is contained in:
Peiyong Lin
2019-04-11 23:21:29 +00:00
committed by Android (Google) Code Review
4 changed files with 94 additions and 58 deletions

View File

@@ -72,6 +72,14 @@ public class GraphicsEnvironment {
private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A Toast Message";
private static final String GAME_DRIVER_WHITELIST_ALL = "*";
// GAME_DRIVER_ALL_APPS
// 0: Default (Invalid values fallback to default as well)
// 1: All apps use Game Driver
// 2: All apps use system graphics driver
private static final int GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT = 0;
private static final int GAME_DRIVER_GLOBAL_OPT_IN_ALL = 1;
private static final int GAME_DRIVER_GLOBAL_OPT_IN_NONE = 2;
private ClassLoader mClassLoader;
private String mLayerPath;
private String mDebugLayerPath;
@@ -96,6 +104,65 @@ public class GraphicsEnvironment {
Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
}
/**
* Allow to query whether an application will use Game Driver.
*/
public static boolean shouldUseGameDriver(Context context, Bundle coreSettings,
ApplicationInfo applicationInfo) {
final String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER);
if (driverPackageName == null || driverPackageName.isEmpty()) {
return false;
}
// To minimize risk of driver updates crippling the device beyond user repair, never use an
// updated driver for privileged or non-updated system apps. Presumably pre-installed apps
// were tested thoroughly with the pre-installed driver.
if (applicationInfo.isPrivilegedApp() || (applicationInfo.isSystemApp()
&& !applicationInfo.isUpdatedSystemApp())) {
if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app");
return false;
}
final ContentResolver contentResolver = context.getContentResolver();
final String packageName = applicationInfo.packageName;
final int globalOptIn;
if (coreSettings != null) {
globalOptIn = coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0);
} else {
globalOptIn = Settings.Global.getInt(contentResolver,
Settings.Global.GAME_DRIVER_ALL_APPS, 0);
}
if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_ALL) {
return true;
}
if (globalOptIn == GAME_DRIVER_GLOBAL_OPT_IN_NONE) {
return false;
}
// GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS
if (getGlobalSettingsString(contentResolver, coreSettings,
Settings.Global.GAME_DRIVER_OPT_OUT_APPS).contains(packageName)) {
return false;
}
final boolean isOptIn = getGlobalSettingsString(contentResolver, coreSettings,
Settings.Global.GAME_DRIVER_OPT_IN_APPS).contains(packageName);
final List<String> whitelist = getGlobalSettingsString(contentResolver, coreSettings,
Settings.Global.GAME_DRIVER_WHITELIST);
if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0
&& !whitelist.contains(packageName)) {
return false;
}
// If the application is not opted-in, then check whether it's on the blacklist,
// terminate early if it's on the blacklist and fallback to system driver.
if (!isOptIn
&& getGlobalSettingsString(contentResolver, coreSettings,
Settings.Global.GAME_DRIVER_BLACKLIST)
.contains(packageName)) {
return false;
}
return true;
}
/**
* Check whether application is debuggable
*/
@@ -657,59 +724,10 @@ public class GraphicsEnvironment {
return false;
}
// To minimize risk of driver updates crippling the device beyond user repair, never use an
// updated driver for privileged or non-updated system apps. Presumably pre-installed apps
// were tested thoroughly with the pre-installed driver.
final ApplicationInfo ai = context.getApplicationInfo();
if (ai.isPrivilegedApp() || (ai.isSystemApp() && !ai.isUpdatedSystemApp())) {
if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app");
if (!shouldUseGameDriver(context, coreSettings, context.getApplicationInfo())) {
return false;
}
// GAME_DRIVER_ALL_APPS
// 0: Default (Invalid values fallback to default as well)
// 1: All apps use Game Driver
// 2: All apps use system graphics driver
final int gameDriverAllApps = coreSettings.getInt(Settings.Global.GAME_DRIVER_ALL_APPS, 0);
if (gameDriverAllApps == 2) {
if (DEBUG) {
Log.w(TAG, "Game Driver is turned off on this device");
}
return false;
}
if (gameDriverAllApps != 1) {
// GAME_DRIVER_OPT_OUT_APPS has higher priority than GAME_DRIVER_OPT_IN_APPS
if (getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_OPT_OUT_APPS).contains(packageName)) {
if (DEBUG) {
Log.w(TAG, packageName + " opts out from Game Driver.");
}
return false;
}
final boolean isOptIn =
getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_OPT_IN_APPS).contains(packageName);
final List<String> whitelist = getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_WHITELIST);
if (!isOptIn && whitelist.indexOf(GAME_DRIVER_WHITELIST_ALL) != 0
&& !whitelist.contains(packageName)) {
if (DEBUG) {
Log.w(TAG, packageName + " is not on the whitelist.");
}
return false;
}
// If the application is not opted-in and check whether it's on the blacklist,
// terminate early if it's on the blacklist and fallback to system driver.
if (!isOptIn
&& getGlobalSettingsString(null, coreSettings,
Settings.Global.GAME_DRIVER_BLACKLIST)
.contains(ai.packageName)) {
return false;
}
}
final String abi = chooseAbi(driverAppInfo);
if (abi == null) {
if (DEBUG) {

View File

@@ -513,6 +513,7 @@ public class Process {
* @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.
*
* @return An object that describes the result of the attempt to start the process.
* @throws RuntimeException on fatal start failure
@@ -532,12 +533,13 @@ public class Process {
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
@Nullable String[] zygoteArgs) {
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ true,
zygoteArgs);
zygoteArgs, useSystemGraphicsDriver);
}
/** @hide */
@@ -554,12 +556,13 @@ public class Process {
@Nullable String packageName,
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
@Nullable String[] zygoteArgs) {
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
abi, instructionSet, appDataDir, invokeWith, packageName,
packagesForUid, sandboxId, /*useUnspecializedAppProcessPool=*/ false,
zygoteArgs);
zygoteArgs, useSystemGraphicsDriver);
}
/**

View File

@@ -308,6 +308,7 @@ public class ZygoteProcess {
* @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.
*
* @return An object that describes the result of the attempt to start the process.
* @throws RuntimeException on fatal start failure
@@ -326,7 +327,8 @@ public class ZygoteProcess {
@Nullable String[] packagesForUid,
@Nullable String sandboxId,
boolean useUsapPool,
@Nullable String[] zygoteArgs) {
@Nullable String[] zygoteArgs,
boolean useSystemGraphicsDriver) {
// TODO (chriswailes): Is there a better place to check this value?
if (fetchUsapPoolEnabledPropWithMinInterval()) {
informZygotesOfUsapPoolStatus();

View File

@@ -62,6 +62,7 @@ import android.os.AppZygote;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.GraphicsEnvironment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -703,6 +704,13 @@ public final class ProcessList {
return prefix + "+" + Integer.toString(diff);
}
private static boolean shouldUseSystemGraphicsDriver(Context context, Bundle coreSettings,
ApplicationInfo applicationInfo) {
final boolean shouldUseGameDriver =
GraphicsEnvironment.shouldUseGameDriver(context, coreSettings, applicationInfo);
return !shouldUseGameDriver;
}
public static String makeOomAdjString(int setAdj, boolean compact) {
if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
return buildOomTag("cch", "cch", " ", setAdj,
@@ -1783,6 +1791,8 @@ public final class ProcessList {
final StorageManagerInternal storageManagerInternal =
LocalServices.getService(StorageManagerInternal.class);
final String sandboxId = storageManagerInternal.getSandboxId(app.info.packageName);
final boolean useSystemGraphicsDriver = shouldUseSystemGraphicsDriver(mService.mContext,
mService.mCoreSettingsObserver.getCoreSettingsLocked(), app.info);
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +
app.processName);
checkSlow(startTime, "startProcess: asking zygote to start proc");
@@ -1793,7 +1803,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});
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
} else if (hostingType.equals("app_zygote")) {
final AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);
@@ -1802,14 +1813,16 @@ public final class ProcessList {
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});
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
} 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});
new String[] {PROC_START_SEQ_IDENT + app.startSeq},
useSystemGraphicsDriver);
}
checkSlow(startTime, "startProcess: returned from zygote!");
return startResult;