Loading core/java/android/os/GraphicsEnvironment.java +52 −10 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -80,28 +80,55 @@ public class GraphicsEnvironment { mDebugLayerPath = debugLayerPath; } /** * 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(); Loading @@ -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()) { Loading Loading @@ -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); Loading core/java/android/provider/Settings.java +6 −0 Original line number Diff line number Diff line Loading @@ -11630,6 +11630,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. * Loading core/jni/android_os_GraphicsEnvironment.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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) }, Loading core/proto/android/providers/settings/global.proto +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
core/java/android/os/GraphicsEnvironment.java +52 −10 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -80,28 +80,55 @@ public class GraphicsEnvironment { mDebugLayerPath = debugLayerPath; } /** * 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(); Loading @@ -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()) { Loading Loading @@ -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); Loading
core/java/android/provider/Settings.java +6 −0 Original line number Diff line number Diff line Loading @@ -11630,6 +11630,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. * Loading
core/jni/android_os_GraphicsEnvironment.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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) }, Loading
core/proto/android/providers/settings/global.proto +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
core/tests/coretests/src/android/provider/SettingsBackupTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading