summaryrefslogtreecommitdiff
path: root/core/java/android/os/GraphicsEnvironment.java
diff options
context:
space:
mode:
authorPeiyong Lin <lpy@google.com>2019-04-09 17:16:20 -0700
committerPeiyong Lin <lpy@google.com>2019-04-10 13:23:13 -0700
commit9eee3f956e0943feae9fde0f2b3656e31b628f16 (patch)
tree9f8b87184b6e449a5ac50aaae4945105fa69d316 /core/java/android/os/GraphicsEnvironment.java
parentbef3d76b16d5b5a5e8ba2c6dc48fa55dcb8b55ea (diff)
[GraphicsEnvironment] Expose API to query whether an app should use game driver.
Game Driver and ANGLE require to disable graphics driver preloading, which results in app launch time regression. Given that in early stage, only a few applications will use them, we would like to make sure Zygote prefork comes with a preloaded graphics driver, such that applications that don't go through ANGLE or Game Driver can directly use Zygote prefork without having to load the driver. BUG: 130029351 Test: Verify with testing applications. Change-Id: I8097f0f7a908be9967b08afb01dc0ce5ff7b3413
Diffstat (limited to 'core/java/android/os/GraphicsEnvironment.java')
-rw-r--r--core/java/android/os/GraphicsEnvironment.java118
1 files changed, 68 insertions, 50 deletions
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 53503f47ca74..06720f98d987 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -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;
@@ -97,6 +105,65 @@ public class GraphicsEnvironment {
}
/**
+ * 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
*/
private static boolean isDebuggable(Context context) {
@@ -652,59 +719,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");
- 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");
- }
+ if (!shouldUseGameDriver(context, coreSettings, context.getApplicationInfo())) {
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) {