summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Northrop <cnorthrop@google.com>2018-04-16 13:23:51 -0600
committerCourtney Goeltzenleuchter <courtneygo@google.com>2018-09-18 13:53:08 -0600
commitea5b2c239ae81832dbfde79f7c63b2f8461534ba (patch)
treeb5395d5486bef0ccf3f1e85cea14c737fbeb518f
parentcbaaaff2a1fed59a7bbb6d41a3b62d305a09feba (diff)
downloadbase-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)
-rw-r--r--core/java/android/os/GraphicsEnvironment.java49
-rw-r--r--core/java/android/provider/Settings.java6
-rw-r--r--core/jni/android_os_GraphicsEnvironment.cpp6
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java1
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,