From 2d5a2bb0ad544b38b41cdd4a2494b0b082131741 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Wed, 7 Nov 2018 21:10:07 -0800 Subject: [PATCH] Add global property to store opt-in application package name. We provide a way in developer option to opt-in an application to use updated graphics driver. To make sure we set up the graphics environment correctly, we need to access the package name of the selected application. This patch introduces a global property to store the package name. BUG: 119221883 Test: Build, flash and boot, verify with prototype Change-Id: I49dfcccf387169c072fb9345f7a50c00fcdb0737 --- core/java/android/os/GraphicsEnvironment.java | 49 ++++++++++--------- core/java/android/provider/Settings.java | 7 +++ .../android/providers/settings/global.proto | 3 ++ .../android/provider/SettingsBackupTest.java | 1 + packages/SettingsLib/res/values/strings.xml | 3 ++ .../settings/SettingsProtoDumpUtil.java | 3 ++ .../server/am/CoreSettingsObserver.java | 2 + 7 files changed, 46 insertions(+), 22 deletions(-) diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index b25707a0be63d..8c5c415614f96 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -37,8 +37,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.HashSet; -import java.util.Set; /** @hide */ public class GraphicsEnvironment { @@ -70,7 +68,7 @@ public class GraphicsEnvironment { public void setup(Context context, Bundle coreSettings) { setupGpuLayers(context, coreSettings); setupAngle(context, coreSettings); - chooseDriver(context); + chooseDriver(context, coreSettings); } /** @@ -312,11 +310,12 @@ public class GraphicsEnvironment { /** * Choose whether the current process should use the builtin or an updated driver. */ - private static void chooseDriver(Context context) { + private static void chooseDriver(Context context, Bundle coreSettings) { String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); if (driverPackageName == null || driverPackageName.isEmpty()) { return; } + // 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. @@ -325,12 +324,16 @@ public class GraphicsEnvironment { if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app"); return; } - Set whitelist = loadWhitelist(context, driverPackageName); - // Empty whitelist implies no updatable graphics driver. Typically, the pre-installed - // updatable graphics driver is supposed to be a place holder and contains no graphics - // driver and whitelist. - if (whitelist == null || whitelist.isEmpty()) { + String applicationPackageName = context.getPackageName(); + String devOptInApplicationName = coreSettings.getString( + Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP); + boolean devOptIn = applicationPackageName.equals(devOptInApplicationName); + boolean whitelisted = onWhitelist(context, driverPackageName, ai.packageName); + if (!devOptIn && !whitelisted) { + if (DEBUG) { + Log.w(TAG, applicationPackageName + " is not on the whitelist."); + } return; } @@ -342,12 +345,6 @@ public class GraphicsEnvironment { Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); return; } - if (!whitelist.contains(context.getPackageName())) { - if (DEBUG) { - Log.w(TAG, context.getPackageName() + " is not on the whitelist."); - } - return; - } // O drivers are restricted to the sphal linker namespace, so don't try to use // packages unless they declare they're compatible with that restriction. @@ -413,10 +410,18 @@ public class GraphicsEnvironment { return null; } - private static Set loadWhitelist(Context context, String driverPackageName) { + private static boolean onWhitelist(Context context, String driverPackageName, + String applicationPackageName) { String whitelistName = SystemProperties.get(PROPERTY_GFX_DRIVER_WHITELIST); + + // Empty whitelist implies no updatable graphics driver. Typically, the pre-installed + // updatable graphics driver is supposed to be a place holder and contains no graphics + // driver and whitelist. if (whitelistName == null || whitelistName.isEmpty()) { - return null; + if (DEBUG) { + Log.w(TAG, "No whitelist found."); + } + return false; } try { Context driverContext = context.createPackageContext(driverPackageName, @@ -424,11 +429,11 @@ public class GraphicsEnvironment { AssetManager assets = driverContext.getAssets(); InputStream stream = assets.open(whitelistName); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); - Set whitelist = new HashSet<>(); - for (String line; (line = reader.readLine()) != null; ) { - whitelist.add(line); + for (String packageName; (packageName = reader.readLine()) != null; ) { + if (packageName.equals(applicationPackageName)) { + return true; + } } - return whitelist; } catch (PackageManager.NameNotFoundException e) { if (DEBUG) { Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); @@ -438,7 +443,7 @@ public class GraphicsEnvironment { Log.w(TAG, "Failed to load whitelist driver package, abort."); } } - return null; + return false; } private static native int getCanLoadSystemLibraries(); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 7a444e0bf2c84..0aa3a7b28829b 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11758,6 +11758,13 @@ public final class Settings { */ public static final String ANGLE_ENABLED_APP = "angle_enabled_app"; + /** + * App that is selected to use updated graphics driver. + * @hide + */ + public static final String UPDATED_GFX_DRIVER_DEV_OPT_IN_APP = + "updated_gfx_driver_dev_opt_in_app"; + /** * Ordered GPU debug layer list for Vulkan * i.e. ::...: diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index e0e7b6f105b33..72892fa07381b 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -405,6 +405,9 @@ message GlobalSettingsProto { // Ordered GPU debug layer list for GLES // i.e. ::...: optional SettingProto debug_layers_gles = 5; + // App opt in to load updated graphics driver instead of + // native graphcis driver through developer options. + optional SettingProto updated_gfx_driver_dev_opt_in_app = 6; } optional Gpu gpu = 59; diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 63dd59a0eea87..78d45d05af937 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -457,6 +457,7 @@ public class SettingsBackupTest { Settings.Global.GPU_DEBUG_LAYERS, Settings.Global.GPU_DEBUG_LAYERS_GLES, Settings.Global.ANGLE_ENABLED_APP, + Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index e2a34f42369a1..738d72920a2f1 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1130,4 +1130,7 @@ + + + Opt in app to use updated graphcis driver in developement diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index f1295e03a82d2..1371a5c2e3107 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -678,6 +678,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.GPU_DEBUG_LAYERS_GLES, GlobalSettingsProto.Gpu.DEBUG_LAYERS_GLES); + dumpSetting(s, p, + Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, + GlobalSettingsProto.Gpu.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP); p.end(gpuToken); final long hdmiToken = p.start(GlobalSettingsProto.HDMI); diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 8ac19d5b2159a..9cfd39ced2941 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -62,6 +62,8 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS_GLES, String.class); sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); sGlobalSettingToTypeMap.put(Settings.Global.SMS_ACCESS_RESTRICTION_ENABLED, int.class); + sGlobalSettingToTypeMap.put(Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, + String.class); // add other global settings here... }