Loading core/java/android/os/GraphicsEnvironment.java +37 −19 Original line number Diff line number Diff line Loading @@ -69,6 +69,8 @@ public class GraphicsEnvironment { private static final String METADATA_DRIVER_BUILD_TIME = "com.android.gamedriver.build_time"; private static final String METADATA_DEVELOPER_DRIVER_ENABLE = "com.android.graphics.developerdriver.enable"; private static final String METADATA_INJECT_LAYERS_ENABLE = "com.android.graphics.injectLayers.enable"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private static final String ANGLE_TEMP_RULES = "debug.angle.rules"; private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID"; Loading Loading @@ -100,14 +102,16 @@ public class GraphicsEnvironment { public void setup(Context context, Bundle coreSettings) { final PackageManager pm = context.getPackageManager(); final String packageName = context.getPackageName(); final ApplicationInfo appInfoWithMetaData = getAppInfoWithMetadata(context, pm, packageName); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setupGpuLayers"); setupGpuLayers(context, coreSettings, pm, packageName); setupGpuLayers(context, coreSettings, pm, packageName, appInfoWithMetaData); Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setupAngle"); setupAngle(context, coreSettings, pm, packageName); Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "chooseDriver"); if (!chooseDriver(context, coreSettings, pm, packageName)) { if (!chooseDriver(context, coreSettings, pm, packageName, appInfoWithMetaData)) { setGpuStats(SYSTEM_DRIVER_NAME, SYSTEM_DRIVER_VERSION_NAME, SYSTEM_DRIVER_VERSION_CODE, SystemProperties.getLong(PROPERTY_GFX_DRIVER_BUILD_TIME, 0), packageName, getVulkanVersion(pm)); Loading Loading @@ -179,6 +183,14 @@ public class GraphicsEnvironment { return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) > 0; } /** * Check whether application is has set the manifest metadata for layer injection. */ private static boolean canInjectLayers(ApplicationInfo ai) { return (ai.metaData != null && ai.metaData.getBoolean(METADATA_INJECT_LAYERS_ENABLE) && setInjectLayersPrSetDumpable()); } /** * Store the layer paths available to the loader. */ Loading Loading @@ -225,15 +237,16 @@ public class GraphicsEnvironment { * If debuggable, check for additional debug settings */ private void setupGpuLayers( Context context, Bundle coreSettings, PackageManager pm, String packageName) { Context context, Bundle coreSettings, PackageManager pm, String packageName, ApplicationInfo ai) { String layerPaths = ""; // Only enable additional debug functionality if the following conditions are met: // 1. App is debuggable or device is rooted // 1. App is debuggable or device is rooted or layer injection metadata flag is true // 2. ENABLE_GPU_DEBUG_LAYERS is true // 3. Package name is equal to GPU_DEBUG_APP if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1)) { if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1) || canInjectLayers(ai)) { final int enable = coreSettings.getInt(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); Loading Loading @@ -343,6 +356,20 @@ public class GraphicsEnvironment { return -1; } private static ApplicationInfo getAppInfoWithMetadata(Context context, PackageManager pm, String packageName) { ApplicationInfo ai; try { // Get the ApplicationInfo from PackageManager so that metadata fields present. ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); } catch (PackageManager.NameNotFoundException e) { // Unlikely to fail for applications, but in case of failure, fall back to use the // ApplicationInfo from context directly. ai = context.getApplicationInfo(); } return ai; } private static String getDriverForPkg(Context context, Bundle bundle, String packageName) { final String allUseAngle; if (bundle != null) { Loading Loading @@ -693,8 +720,7 @@ public class GraphicsEnvironment { /** * Return the driver package name to use. Return null for system driver. */ private static String chooseDriverInternal( Context context, Bundle coreSettings, PackageManager pm, String packageName) { private static String chooseDriverInternal(Bundle coreSettings, ApplicationInfo ai) { final String gameDriver = SystemProperties.get(PROPERTY_GFX_DRIVER); final boolean hasGameDriver = gameDriver != null && !gameDriver.isEmpty(); Loading @@ -709,15 +735,6 @@ public class GraphicsEnvironment { // 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. ApplicationInfo ai; try { // Get the ApplicationInfo from PackageManager so that metadata fields present. ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); } catch (PackageManager.NameNotFoundException e) { // Unlikely to fail for applications, but in case of failure, fall back to use the // ApplicationInfo from context directly. 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 null; Loading Loading @@ -797,9 +814,9 @@ public class GraphicsEnvironment { * Choose whether the current process should use the builtin or an updated driver. */ private static boolean chooseDriver( Context context, Bundle coreSettings, PackageManager pm, String packageName) { final String driverPackageName = chooseDriverInternal(context, coreSettings, pm, packageName); Context context, Bundle coreSettings, PackageManager pm, String packageName, ApplicationInfo ai) { final String driverPackageName = chooseDriverInternal(coreSettings, ai); if (driverPackageName == null) { return false; } Loading Loading @@ -911,4 +928,5 @@ public class GraphicsEnvironment { private static native void setAngleInfo(String path, String appPackage, String devOptIn, FileDescriptor rulesFd, long rulesOffset, long rulesLength); private static native boolean getShouldUseAngle(String packageName); private static native boolean setInjectLayersPrSetDumpable(); } core/jni/android_os_GraphicsEnvironment.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,10 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { } } bool setInjectLayersPrSetDumpable_native() { return android::GraphicsEnv::getInstance().setInjectLayersPrSetDumpable(); } void hintActivityLaunch_native(JNIEnv* env, jobject clazz) { android::GraphicsEnv::getInstance().hintActivityLaunch(); } Loading @@ -93,6 +97,7 @@ const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPathAndSphalLibraries", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPathAndSphalLibraries_native) }, { "setGpuStats", "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/String;I)V", reinterpret_cast<void*>(setGpuStats_native) }, { "setInjectLayersPrSetDumpable", "()Z", reinterpret_cast<void*>(setInjectLayersPrSetDumpable_native) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "getShouldUseAngle", "(Ljava/lang/String;)Z", reinterpret_cast<void*>(shouldUseAngle_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, Loading Loading
core/java/android/os/GraphicsEnvironment.java +37 −19 Original line number Diff line number Diff line Loading @@ -69,6 +69,8 @@ public class GraphicsEnvironment { private static final String METADATA_DRIVER_BUILD_TIME = "com.android.gamedriver.build_time"; private static final String METADATA_DEVELOPER_DRIVER_ENABLE = "com.android.graphics.developerdriver.enable"; private static final String METADATA_INJECT_LAYERS_ENABLE = "com.android.graphics.injectLayers.enable"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private static final String ANGLE_TEMP_RULES = "debug.angle.rules"; private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID"; Loading Loading @@ -100,14 +102,16 @@ public class GraphicsEnvironment { public void setup(Context context, Bundle coreSettings) { final PackageManager pm = context.getPackageManager(); final String packageName = context.getPackageName(); final ApplicationInfo appInfoWithMetaData = getAppInfoWithMetadata(context, pm, packageName); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setupGpuLayers"); setupGpuLayers(context, coreSettings, pm, packageName); setupGpuLayers(context, coreSettings, pm, packageName, appInfoWithMetaData); Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "setupAngle"); setupAngle(context, coreSettings, pm, packageName); Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "chooseDriver"); if (!chooseDriver(context, coreSettings, pm, packageName)) { if (!chooseDriver(context, coreSettings, pm, packageName, appInfoWithMetaData)) { setGpuStats(SYSTEM_DRIVER_NAME, SYSTEM_DRIVER_VERSION_NAME, SYSTEM_DRIVER_VERSION_CODE, SystemProperties.getLong(PROPERTY_GFX_DRIVER_BUILD_TIME, 0), packageName, getVulkanVersion(pm)); Loading Loading @@ -179,6 +183,14 @@ public class GraphicsEnvironment { return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) > 0; } /** * Check whether application is has set the manifest metadata for layer injection. */ private static boolean canInjectLayers(ApplicationInfo ai) { return (ai.metaData != null && ai.metaData.getBoolean(METADATA_INJECT_LAYERS_ENABLE) && setInjectLayersPrSetDumpable()); } /** * Store the layer paths available to the loader. */ Loading Loading @@ -225,15 +237,16 @@ public class GraphicsEnvironment { * If debuggable, check for additional debug settings */ private void setupGpuLayers( Context context, Bundle coreSettings, PackageManager pm, String packageName) { Context context, Bundle coreSettings, PackageManager pm, String packageName, ApplicationInfo ai) { String layerPaths = ""; // Only enable additional debug functionality if the following conditions are met: // 1. App is debuggable or device is rooted // 1. App is debuggable or device is rooted or layer injection metadata flag is true // 2. ENABLE_GPU_DEBUG_LAYERS is true // 3. Package name is equal to GPU_DEBUG_APP if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1)) { if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1) || canInjectLayers(ai)) { final int enable = coreSettings.getInt(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); Loading Loading @@ -343,6 +356,20 @@ public class GraphicsEnvironment { return -1; } private static ApplicationInfo getAppInfoWithMetadata(Context context, PackageManager pm, String packageName) { ApplicationInfo ai; try { // Get the ApplicationInfo from PackageManager so that metadata fields present. ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); } catch (PackageManager.NameNotFoundException e) { // Unlikely to fail for applications, but in case of failure, fall back to use the // ApplicationInfo from context directly. ai = context.getApplicationInfo(); } return ai; } private static String getDriverForPkg(Context context, Bundle bundle, String packageName) { final String allUseAngle; if (bundle != null) { Loading Loading @@ -693,8 +720,7 @@ public class GraphicsEnvironment { /** * Return the driver package name to use. Return null for system driver. */ private static String chooseDriverInternal( Context context, Bundle coreSettings, PackageManager pm, String packageName) { private static String chooseDriverInternal(Bundle coreSettings, ApplicationInfo ai) { final String gameDriver = SystemProperties.get(PROPERTY_GFX_DRIVER); final boolean hasGameDriver = gameDriver != null && !gameDriver.isEmpty(); Loading @@ -709,15 +735,6 @@ public class GraphicsEnvironment { // 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. ApplicationInfo ai; try { // Get the ApplicationInfo from PackageManager so that metadata fields present. ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); } catch (PackageManager.NameNotFoundException e) { // Unlikely to fail for applications, but in case of failure, fall back to use the // ApplicationInfo from context directly. 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 null; Loading Loading @@ -797,9 +814,9 @@ public class GraphicsEnvironment { * Choose whether the current process should use the builtin or an updated driver. */ private static boolean chooseDriver( Context context, Bundle coreSettings, PackageManager pm, String packageName) { final String driverPackageName = chooseDriverInternal(context, coreSettings, pm, packageName); Context context, Bundle coreSettings, PackageManager pm, String packageName, ApplicationInfo ai) { final String driverPackageName = chooseDriverInternal(coreSettings, ai); if (driverPackageName == null) { return false; } Loading Loading @@ -911,4 +928,5 @@ public class GraphicsEnvironment { private static native void setAngleInfo(String path, String appPackage, String devOptIn, FileDescriptor rulesFd, long rulesOffset, long rulesLength); private static native boolean getShouldUseAngle(String packageName); private static native boolean setInjectLayersPrSetDumpable(); }
core/jni/android_os_GraphicsEnvironment.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,10 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { } } bool setInjectLayersPrSetDumpable_native() { return android::GraphicsEnv::getInstance().setInjectLayersPrSetDumpable(); } void hintActivityLaunch_native(JNIEnv* env, jobject clazz) { android::GraphicsEnv::getInstance().hintActivityLaunch(); } Loading @@ -93,6 +97,7 @@ const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPathAndSphalLibraries", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPathAndSphalLibraries_native) }, { "setGpuStats", "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/String;I)V", reinterpret_cast<void*>(setGpuStats_native) }, { "setInjectLayersPrSetDumpable", "()Z", reinterpret_cast<void*>(setInjectLayersPrSetDumpable_native) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "getShouldUseAngle", "(Ljava/lang/String;)Z", reinterpret_cast<void*>(shouldUseAngle_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, Loading