OSDN Git Service

[GraphicsEnvironment] Add whitelist support.
authorPeiyong Lin <lpy@google.com>
Fri, 12 Oct 2018 22:34:15 +0000 (15:34 -0700)
committerPeiyong Lin <lpy@google.com>
Tue, 16 Oct 2018 19:54:38 +0000 (12:54 -0700)
This patch adds the ability to load whitelist from updatable graphcis driver
apk. Typically a whitelist is part of the graphics driver apk, and the name is
set by overwriting ro.gfx.driver.whitelist.0

BUG: 117241379
Test: Build, flash and boot, whitelist an app and verify.
Change-Id: Ie36ca0173a90a8e48acaca2979ab64bbf92eeaed

core/java/android/os/GraphicsEnvironment.java
core/proto/android/os/system_properties.proto

index df3aae2..384115b 100644 (file)
@@ -19,6 +19,7 @@ package android.os;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.res.AssetManager;
 import android.opengl.EGL14;
 import android.os.Build;
 import android.os.SystemProperties;
@@ -27,7 +28,13 @@ import android.util.Log;
 
 import dalvik.system.VMRuntime;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Set;
 
 /** @hide */
 public class GraphicsEnvironment {
@@ -44,6 +51,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 PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.0";
     private static final String ANGLE_PACKAGE_NAME = "com.android.angle";
     private static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE";
 
@@ -262,6 +270,15 @@ public class GraphicsEnvironment {
             if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app");
             return;
         }
+        Set<String> whitelist = loadWhitelist(context, driverPackageName);
+
+        // Empty whitelist implies no updatable graphics driver. Typically, the pre-installed
+        // updatable graphics driver is supposed to be a place holder and contains no graphics
+        // driver and whitelist.
+        if (whitelist == null || whitelist.isEmpty()) {
+            return;
+        }
+
         ApplicationInfo driverInfo;
         try {
             driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName,
@@ -270,6 +287,22 @@ public class GraphicsEnvironment {
             Log.w(TAG, "driver package '" + driverPackageName + "' not installed");
             return;
         }
+        if (!whitelist.contains(context.getPackageName())) {
+            if (DEBUG) {
+                Log.w(TAG, context.getPackageName() + " is not on the whitelist.");
+            }
+            return;
+        }
+
+        // O drivers are restricted to the sphal linker namespace, so don't try to use
+        // packages unless they declare they're compatible with that restriction.
+        if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) {
+            if (DEBUG) {
+                Log.w(TAG, "updated driver package is not known to be compatible with O");
+            }
+            return;
+        }
+
         String abi = chooseAbi(driverInfo);
         if (abi == null) {
             if (DEBUG) {
@@ -280,12 +313,6 @@ public class GraphicsEnvironment {
             }
             return;
         }
-        if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) {
-            // O drivers are restricted to the sphal linker namespace, so don't try to use
-            // packages unless they declare they're compatible with that restriction.
-            Log.w(TAG, "updated driver package is not known to be compatible with O");
-            return;
-        }
 
         StringBuilder sb = new StringBuilder();
         sb.append(driverInfo.nativeLibraryDir)
@@ -331,6 +358,34 @@ public class GraphicsEnvironment {
         return null;
     }
 
+    private static Set<String> loadWhitelist(Context context, String driverPackageName) {
+        String whitelistName = SystemProperties.get(PROPERTY_GFX_DRIVER_WHITELIST);
+        if (whitelistName == null || whitelistName.isEmpty()) {
+            return null;
+        }
+        try {
+            Context driverContext = context.createPackageContext(driverPackageName,
+                                                                 Context.CONTEXT_RESTRICTED);
+            AssetManager assets = driverContext.getAssets();
+            InputStream stream = assets.open(whitelistName);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+            Set<String> whitelist = new HashSet<>();
+            for (String line; (line = reader.readLine()) != null; ) {
+                whitelist.add(line);
+            }
+            return whitelist;
+        } catch (PackageManager.NameNotFoundException e) {
+            if (DEBUG) {
+                Log.w(TAG, "driver package '" + driverPackageName + "' not installed");
+            }
+        } catch (IOException e) {
+            if (DEBUG) {
+                Log.w(TAG, "Failed to load whitelist driver package, abort.");
+            }
+        }
+        return null;
+    }
+
     private static native int getCanLoadSystemLibraries();
     private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
     private static native void setDebugLayers(String layers);
index a41edf3..1f63be9 100644 (file)
@@ -512,7 +512,9 @@ message SystemPropertiesProto {
         optional int32  vts_coverage = 43;
         optional string zygote = 44;
 
-        // Next Tag: 45
+        optional string gfx_driver_whitelist_0 = 45;
+
+        // Next Tag: 46
     }
     optional Ro ro = 21;