summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Northrop <cnorthrop@google.com>2018-08-09 16:01:08 -0600
committerCourtney Goeltzenleuchter <courtneygo@google.com>2018-09-19 15:33:41 -0600
commited5b5df7ee655fdf8d4ca00aa5dc8565b4c9bb98 (patch)
treef1e819d1a058ecfca8003f6029852c3417a55a04
parent9612e96a25f88b813ff1a080c5fb11e122e63a8a (diff)
downloadbase-ed5b5df7ee655fdf8d4ca00aa5dc8565b4c9bb98.tar.gz
Pass more ANGLE info from runtime
In order to facilitate ANGLE selection logic in the backend, we need to start sending more information from GraphicsEnvironment. This includes the application name, whether the developer opted in, and the list can be expanded. We also have to send the ANGLE namespace unconditionally in case the application opts in programmatically. Allow specifying ANGLE in manifest via meta-data This CL allows the application's manifest to specify whether to use ANGLE or native drivers for GLES via meta-data. To enable, place the following within <application> and it will be detected by the platform: <meta-data android:name:"com.android.angle.GLES_MODE" android:value:"angle" /> The manifest can also specify "native" to opt-out of ANGLE, but native will be the default for Q release. This method is in service of the tech preview of ANGLE for Android. For Q release, we should move this to the Android API. Bug: 80239516 Test: Manual build, booted clean, ensured developer opt-in still works. Test: Manual, verify ANGLE can be selected or rejected Change-Id: I3b8f99942999de6a3188d2e61355dcd244f9191e (cherry picked from commit 261dfbd814bf62caaee11e6ebe4e2e61e28f4919) (cherry picked from commit 068c3f2a85fb657d507da27c6eaa5f5e67b41d81) (cherry picked from commit a2e5faf4b23bf0b8b84ffc1d67d545e3dd4f8c63) (cherry picked from commit c91fc842d3154bd4e56c830243a60481ffdcfb19)
-rw-r--r--core/java/android/os/GraphicsEnvironment.java79
-rw-r--r--core/jni/android_os_GraphicsEnvironment.cpp10
2 files changed, 61 insertions, 28 deletions
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index f83acb6b7972..54be6393e651 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -45,6 +45,7 @@ public class GraphicsEnvironment {
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 static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE";
private ClassLoader mClassLoader;
private String mLayerPath;
@@ -123,7 +124,6 @@ public class GraphicsEnvironment {
}
}
}
-
}
// Include the app's lib directory in all cases
@@ -133,7 +133,7 @@ public class GraphicsEnvironment {
}
/**
- * Selectively enable ANGLE for applications
+ * Pass ANGLE details down to trigger enable logic
*/
private static void setupAngle(Context context) {
@@ -143,39 +143,67 @@ public class GraphicsEnvironment {
String packageName = context.getPackageName();
- // Only provide an ANGLE namespace if the package name matches setting
+ boolean devOptIn = false;
if ((angleEnabledApp != null && packageName != null)
&& (!angleEnabledApp.isEmpty() && !packageName.isEmpty())
&& angleEnabledApp.equals(packageName)) {
- if (DEBUG) Log.v(TAG, "ANGLE enabled for " + packageName);
+ if (DEBUG) Log.v(TAG, packageName + " opted in for ANGLE via Developer Setting");
- ApplicationInfo angleInfo;
+ devOptIn = true;
+ }
- 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;
+ ApplicationInfo appInfo;
+ try {
+ appInfo = context.getPackageManager().getApplicationInfo(packageName,
+ PackageManager.GET_META_DATA);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "Failed to get info about current application: " + packageName);
+ return;
+ }
+
+ String appPref = "dontcare";
+ final BaseBundle metadata = appInfo.metaData;
+ if (metadata != null) {
+ final String glesMode = metadata.getString(GLES_MODE_METADATA_KEY);
+ if (glesMode != null) {
+ if (glesMode.equals("angle")) {
+ appPref = "angle";
+ if (DEBUG) Log.v(TAG, packageName + " opted for ANGLE via AndroidManifest");
+ } else if (glesMode.equals("native")) {
+ appPref = "native";
+ if (DEBUG) Log.v(TAG, packageName + " opted for NATIVE via AndroidManifest");
+ } else {
+ Log.w(TAG, "Unrecognized GLES_MODE (\"" + glesMode + "\") for " + packageName
+ + ". Supported values are \"angle\" or \"native\"");
+ }
}
+ }
- String abi = chooseAbi(angleInfo);
+ 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;
+ }
- // 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();
+ String abi = chooseAbi(angleInfo);
- if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths);
+ // 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();
- // Providing any path will trigger namespace creation
- setAnglePath(paths);
- }
+ if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths);
+
+ // Further opt-in logic is handled in native, so pass relevant info down
+ setAngleInfo(paths, packageName, appPref, devOptIn);
}
/**
@@ -266,5 +294,6 @@ 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);
+ private static native void setAngleInfo(String path, String appPackage, String appPref,
+ boolean devOptIn);
}
diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp
index 9fb8e641a51d..9372671f4d05 100644
--- a/core/jni/android_os_GraphicsEnvironment.cpp
+++ b/core/jni/android_os_GraphicsEnvironment.cpp
@@ -28,9 +28,13 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) {
android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str());
}
-void setAnglePath(JNIEnv* env, jobject clazz, jstring path) {
+void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName,
+ jstring appPref, jboolean devOptIn) {
ScopedUtfChars pathChars(env, path);
- android::GraphicsEnv::getInstance().setAnglePath(pathChars.c_str());
+ ScopedUtfChars appNameChars(env, appName);
+ ScopedUtfChars appPrefChars(env, appPref);
+ android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(),
+ appPrefChars.c_str(), devOptIn);
}
void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) {
@@ -48,7 +52,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) },
+ { "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) },
{ "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) },
};