summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tim Van Patten <timvp@google.com> 2018-12-13 17:43:37 -0700
committer Tim Van Patten <timvp@google.com> 2018-12-17 16:29:55 +0000
commit5e3e2ae828ef85b072c4cb26ce886985c443e71f (patch)
tree189c145fe04b5c1beaf1cf823a9193fe78f2d9fc
parent81dc01cfabee243099e3234383a836c962cfa555 (diff)
Use intent-filter to enforce that only a single ANGLE APK is present
In order to support multiple ANGLE builds (Google-signed, AOSP unsigned, OEM-signed), we will use intent-filter to indicate that ANGLE is installed. During CTS testing, we will verify that only a single ANGLE is installed and provides the necessary functionality. Bug: 120487920 Test: Verify ANGLE CTS hostside tests pass. Change-Id: If3491475e776e26b3656c377d2b28c0c8bb66da2
-rw-r--r--core/java/android/os/GraphicsEnvironment.java39
1 files changed, 34 insertions, 5 deletions
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index 124d7b174739..8a0d916187b7 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -17,8 +17,10 @@
package android.os;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.opengl.EGL14;
@@ -57,9 +59,9 @@ public class GraphicsEnvironment {
private static final String TAG = "GraphicsEnvironment";
private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
private static final String PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.0";
- private static final String ANGLE_PACKAGE_NAME = "com.google.android.angle";
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";
private ClassLoader mClassLoader;
private String mLayerPath;
@@ -276,6 +278,27 @@ public class GraphicsEnvironment {
}
/**
+ * Get the ANGLE package name.
+ */
+ private String getAnglePackageName(Context context) {
+ Intent intent = new Intent(ACTION_ANGLE_FOR_ANDROID);
+
+ List<ResolveInfo> resolveInfos = context.getPackageManager()
+ .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY);
+ if (resolveInfos.size() != 1) {
+ Log.e(TAG, "Invalid number of ANGLE packages. Required: 1, Found: "
+ + resolveInfos.size());
+ for (ResolveInfo resolveInfo : resolveInfos) {
+ Log.e(TAG, "Found ANGLE package: " + resolveInfo.activityInfo.packageName);
+ }
+ return "";
+ }
+
+ // Must be exactly 1 ANGLE PKG found to get here.
+ return resolveInfos.get(0).activityInfo.packageName;
+ }
+
+ /**
* Pass ANGLE details down to trigger enable logic
*/
private void setupAngle(Context context, Bundle bundle, String packageName) {
@@ -286,12 +309,18 @@ public class GraphicsEnvironment {
+ "set to: '" + devOptIn + "'");
}
+ String anglePkgName = getAnglePackageName(context);
+ if (anglePkgName.isEmpty()) {
+ Log.e(TAG, "Failed to find ANGLE package.");
+ return;
+ }
+
ApplicationInfo angleInfo;
try {
- angleInfo = context.getPackageManager().getApplicationInfo(ANGLE_PACKAGE_NAME,
+ angleInfo = context.getPackageManager().getApplicationInfo(anglePkgName,
PackageManager.MATCH_SYSTEM_ONLY);
} catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "ANGLE package '" + ANGLE_PACKAGE_NAME + "' not installed");
+ Log.w(TAG, "ANGLE package '" + anglePkgName + "' not installed");
return;
}
@@ -351,7 +380,7 @@ public class GraphicsEnvironment {
angleAssets =
context.getPackageManager().getResourcesForApplication(angleInfo).getAssets();
} catch (PackageManager.NameNotFoundException e) {
- Log.w(TAG, "Failed to get AssetManager for '" + ANGLE_PACKAGE_NAME + "'");
+ Log.w(TAG, "Failed to get AssetManager for '" + anglePkgName + "'");
return;
}
@@ -360,7 +389,7 @@ public class GraphicsEnvironment {
assetsFd = angleAssets.openFd(ANGLE_RULES_FILE);
} catch (IOException e) {
Log.w(TAG, "Failed to get AssetFileDescriptor for " + ANGLE_RULES_FILE + " from "
- + "'" + ANGLE_PACKAGE_NAME + "'");
+ + "'" + anglePkgName + "'");
return;
}