diff options
author | Cody Northrop <cnorthrop@google.com> | 2018-04-16 13:23:51 -0600 |
---|---|---|
committer | Courtney Goeltzenleuchter <courtneygo@google.com> | 2018-09-18 13:53:08 -0600 |
commit | ea5b2c239ae81832dbfde79f7c63b2f8461534ba (patch) | |
tree | b5395d5486bef0ccf3f1e85cea14c737fbeb518f | |
parent | cbaaaff2a1fed59a7bbb6d41a3b62d305a09feba (diff) | |
download | base-ea5b2c239ae81832dbfde79f7c63b2f8461534ba.tar.gz |
Create ANGLE namespace in GraphicsEnvironment
This commit does the following:
* Create a new Android Setting for use during development,
"angle_enabled_app", which can be used to load ANGLE
only for specified applications.
Usage:
adb shell settings put global angle_enabled_app <package-name>
* When the package name condition is met, build a namespace
that points to the ANGLE APK. The namespace will be used
by the EGL Loader to find ANGLE libs.
* The APK may be the pre-installed version in /system/app/ANGLE,
or it may be an updated version from the Play Store, which will
reside somewhere under /data/app/*.
Test: Manual
Change-Id: Ia0475cf80cf5c2589e52fdb3c8f3672696357923
(cherry picked from commit 5a4e8572f939a87b26a422a4e7f2b20560e92659)
4 files changed, 62 insertions, 0 deletions
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index f2e0bddb93aa..f83acb6b7972 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -44,6 +44,7 @@ public class GraphicsEnvironment { private static final boolean DEBUG = false; private static final String TAG = "GraphicsEnvironment"; private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + private static final String ANGLE_PACKAGE_NAME = "com.android.angle"; private ClassLoader mClassLoader; private String mLayerPath; @@ -54,6 +55,7 @@ public class GraphicsEnvironment { */ public void setup(Context context) { setupGpuLayers(context); + setupAngle(context); chooseDriver(context); } @@ -131,6 +133,52 @@ public class GraphicsEnvironment { } /** + * Selectively enable ANGLE for applications + */ + private static void setupAngle(Context context) { + + String angleEnabledApp = + Settings.Global.getString(context.getContentResolver(), + Settings.Global.ANGLE_ENABLED_APP); + + String packageName = context.getPackageName(); + + // Only provide an ANGLE namespace if the package name matches setting + if ((angleEnabledApp != null && packageName != null) + && (!angleEnabledApp.isEmpty() && !packageName.isEmpty()) + && angleEnabledApp.equals(packageName)) { + + if (DEBUG) Log.v(TAG, "ANGLE enabled for " + packageName); + + ApplicationInfo angleInfo; + + try { + angleInfo = context.getPackageManager().getApplicationInfo(ANGLE_PACKAGE_NAME, + PackageManager.MATCH_SYSTEM_ONLY); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "ANGLE package '" + ANGLE_PACKAGE_NAME + "' not installed"); + return; + } + + String abi = chooseAbi(angleInfo); + + // Build a path that includes installed native libs and APK + StringBuilder sb = new StringBuilder(); + sb.append(angleInfo.nativeLibraryDir) + .append(File.pathSeparator) + .append(angleInfo.sourceDir) + .append("!/lib/") + .append(abi); + String paths = sb.toString(); + + if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths); + + // Providing any path will trigger namespace creation + setAnglePath(paths); + } + } + + /** * Choose whether the current process should use the builtin or an updated driver. */ private static void chooseDriver(Context context) { @@ -218,4 +266,5 @@ public class GraphicsEnvironment { private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); private static native void setDriverPath(String path); + private static native void setAnglePath(String path); } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 05104182f2ec..1da94fd415db 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11264,6 +11264,12 @@ public final class Settings { public static final String GPU_DEBUG_APP = "gpu_debug_app"; /** + * App should try to use ANGLE + * @hide + */ + public static final String ANGLE_ENABLED_APP = "angle_enabled_app"; + + /** * Ordered GPU debug layer list * i.e. <layer1>:<layer2>:...:<layerN> * @hide diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp index 4ecfd4bdc217..9fb8e641a51d 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -28,6 +28,11 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); } +void setAnglePath(JNIEnv* env, jobject clazz, jstring path) { + ScopedUtfChars pathChars(env, path); + android::GraphicsEnv::getInstance().setAnglePath(pathChars.c_str()); +} + void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) { android_namespace_t* appNamespace = android::FindNamespaceByClassLoader(env, classLoader); ScopedUtfChars layerPathsChars(env, layerPaths); @@ -43,6 +48,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) { const JNINativeMethod g_methods[] = { { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) }, + { "setAnglePath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setAnglePath) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, { "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) }, }; diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index fc00f1b93955..97822d9edfd6 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -441,6 +441,7 @@ public class SettingsBackupTest { Settings.Global.ENABLE_GPU_DEBUG_LAYERS, Settings.Global.GPU_DEBUG_APP, Settings.Global.GPU_DEBUG_LAYERS, + Settings.Global.ANGLE_ENABLED_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS, |