diff options
8 files changed, 76 insertions, 13 deletions
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 5f656207255a..df3aae2c901c 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -55,7 +55,7 @@ public class GraphicsEnvironment { * Set up GraphicsEnvironment */ public void setup(Context context, Bundle coreSettings) { - setupGpuLayers(context); + setupGpuLayers(context, coreSettings); setupAngle(context, coreSettings); chooseDriver(context); } @@ -81,27 +81,54 @@ public class GraphicsEnvironment { } /** + * Return the debug layer app's on-disk and in-APK lib directories + */ + private static String getDebugLayerAppPaths(Context context, String app) { + ApplicationInfo appInfo; + try { + appInfo = context.getPackageManager().getApplicationInfo( + app, PackageManager.MATCH_ALL); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Debug layer app '" + app + "' not installed"); + + return null; + } + + String abi = chooseAbi(appInfo); + + StringBuilder sb = new StringBuilder(); + sb.append(appInfo.nativeLibraryDir) + .append(File.pathSeparator); + sb.append(appInfo.sourceDir) + .append("!/lib/") + .append(abi); + String paths = sb.toString(); + + if (DEBUG) Log.v(TAG, "Debug layer app libs: " + paths); + + return paths; + } + + /** * Set up layer search paths for all apps * If debuggable, check for additional debug settings */ - private void setupGpuLayers(Context context) { + private void setupGpuLayers(Context context, Bundle coreSettings) { String layerPaths = ""; // Only enable additional debug functionality if the following conditions are met: - // 1. App is debuggable + // 1. App is debuggable or device is rooted // 2. ENABLE_GPU_DEBUG_LAYERS is true // 3. Package name is equal to GPU_DEBUG_APP - if (isDebuggable(context)) { + if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1)) { - int enable = Settings.Global.getInt(context.getContentResolver(), - Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); + int enable = coreSettings.getInt(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); if (enable != 0) { - String gpuDebugApp = Settings.Global.getString(context.getContentResolver(), - Settings.Global.GPU_DEBUG_APP); + String gpuDebugApp = coreSettings.getString(Settings.Global.GPU_DEBUG_APP); String packageName = context.getPackageName(); @@ -115,8 +142,22 @@ public class GraphicsEnvironment { // the layers specified by the app. layerPaths = mDebugLayerPath + ":"; - String layers = Settings.Global.getString(context.getContentResolver(), - Settings.Global.GPU_DEBUG_LAYERS); + + // If there is a debug layer app specified, add its path. + String gpuDebugLayerApp = + coreSettings.getString(Settings.Global.GPU_DEBUG_LAYER_APP); + + if (gpuDebugLayerApp != null && !gpuDebugLayerApp.isEmpty()) { + Log.i(TAG, "GPU debug layer app: " + gpuDebugLayerApp); + String paths = getDebugLayerAppPaths(context, gpuDebugLayerApp); + if (paths != null) { + // Append the path so files placed in the app's base directory will + // override the external path + layerPaths += paths + ":"; + } + } + + String layers = coreSettings.getString(Settings.Global.GPU_DEBUG_LAYERS); Log.i(TAG, "Debug layer list: " + layers); if (layers != null && !layers.isEmpty()) { @@ -290,6 +331,7 @@ public class GraphicsEnvironment { return null; } + private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); private static native void setDriverPath(String path); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index acb75778e08e..c6e457436025 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11631,6 +11631,12 @@ public final class Settings { public static final String GPU_DEBUG_LAYERS = "gpu_debug_layers"; /** + * Addition app for GPU layer discovery + * @hide + */ + public static final String GPU_DEBUG_LAYER_APP = "gpu_debug_layer_app"; + + /** * Control whether the process CPU usage meter should be shown. * * @deprecated This functionality is no longer available as of diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp index b70485d9a0ea..92235ad494a7 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -23,6 +23,10 @@ namespace { +int getCanLoadSystemLibraries_native() { + return android::GraphicsEnv::getInstance().getCanLoadSystemLibraries(); +} + void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { ScopedUtfChars pathChars(env, path); android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); @@ -51,6 +55,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) { } const JNINativeMethod g_methods[] = { + { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index a02602ee5d99..47dbc0716c94 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -397,9 +397,10 @@ message GlobalSettingsProto { // Ordered GPU debug layer list // i.e. <layer1>:<layer2>:...:<layerN> optional SettingProto debug_layers = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; - // App will load ANGLE instead of native GLES drivers. optional SettingProto angle_enabled_app = 3; + // App that can provide layer libraries. + optional SettingProto debug_layer_app = 4; } 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 60abd9468179..632c37fd54d2 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -450,6 +450,7 @@ public class SettingsBackupTest { Settings.Global.GPU_DEBUG_APP, Settings.Global.GPU_DEBUG_LAYERS, Settings.Global.ANGLE_ENABLED_APP, + Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 8745a330311a..da1354be63d2 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -662,6 +662,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.ANGLE_ENABLED_APP, GlobalSettingsProto.Gpu.ANGLE_ENABLED_APP); + dumpSetting(s, p, + Settings.Global.GPU_DEBUG_LAYER_APP, + GlobalSettingsProto.Gpu.DEBUG_LAYER_APP); p.end(gpuToken); final long hdmiToken = p.start(GlobalSettingsProto.HDMI); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 4810b0b91c10..7abac0054e5d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -556,14 +556,15 @@ public class VolumeDialogImpl implements VolumeDialog { mHandler.removeMessages(H.SHOW); mHandler.removeMessages(H.DISMISS); rescheduleTimeoutH(); - mShowing = true; if (mConfigChanged) { - initDialog(); + initDialog(); // resets mShowing to false mConfigurableTexts.update(); mConfigChanged = false; } + initSettingsH(); + mShowing = true; mDialog.show(); Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); mController.notifyVisible(true); diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 09c152ef5135..2ca134465cd6 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -56,6 +56,10 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.DEBUG_VIEW_ATTRIBUTES, int.class); sGlobalSettingToTypeMap.put(Settings.Global.ANGLE_ENABLED_APP, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, int.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_APP, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); // add other global settings here... } |