From e3490fce0075e615bfc12253336d2909a5eefdd3 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 13 Jun 2019 14:02:35 -0700 Subject: [PATCH] Game Driver: Process sphal libraries in GraphicsEnvironment Previously, there's only one Game Driver existed in the system, so we process sphal libraries in GPU service to save the launch time for loading Game Driver. Now we need to support a separate prerelease driver, so we have to move the processing back to app launch time. Bug: 134881329 Test: Manual test with prerelease driver and Settings UI. Change-Id: Ic1bb412a6a026c68f55243c906bd56fe1fee44c3 --- core/java/android/os/GraphicsEnvironment.java | 31 ++++++++++++++++--- .../com/android/server/gpu/GpuService.java | 8 ----- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 24a1477836690..e85d0b9bce075 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -33,11 +33,13 @@ import android.widget.Toast; import dalvik.system.VMRuntime; +import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -71,6 +73,7 @@ public class GraphicsEnvironment { "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE"; private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A Toast Message"; private static final String GAME_DRIVER_WHITELIST_ALL = "*"; + private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int VULKAN_1_0 = 0x00400000; private static final int VULKAN_1_1 = 0x00401000; @@ -792,10 +795,7 @@ public class GraphicsEnvironment { .append("!/lib/") .append(abi); final String paths = sb.toString(); - - final String sphalLibraries = - coreSettings.getString(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES); - + final String sphalLibraries = getSphalLibraries(context, driverPackageName); if (DEBUG) { Log.v(TAG, "gfx driver package search path: " + paths @@ -832,6 +832,29 @@ public class GraphicsEnvironment { return null; } + private static String getSphalLibraries(Context context, String driverPackageName) { + try { + final Context driverContext = + context.createPackageContext(driverPackageName, Context.CONTEXT_RESTRICTED); + final BufferedReader reader = new BufferedReader(new InputStreamReader( + driverContext.getAssets().open(GAME_DRIVER_SPHAL_LIBRARIES_FILENAME))); + final ArrayList assetStrings = new ArrayList<>(); + for (String assetString; (assetString = reader.readLine()) != null;) { + assetStrings.add(assetString); + } + return String.join(":", assetStrings); + } 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 '" + GAME_DRIVER_SPHAL_LIBRARIES_FILENAME + "'"); + } + } + return ""; + } + private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java index d4396534d0672..955f17781540f 100644 --- a/services/core/java/com/android/server/gpu/GpuService.java +++ b/services/core/java/com/android/server/gpu/GpuService.java @@ -64,7 +64,6 @@ public class GpuService extends SystemService { private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; private static final String GAME_DRIVER_WHITELIST_FILENAME = "whitelist.txt"; - private static final String GAME_DRIVER_SPHAL_LIBRARIES_FILENAME = "sphal_libraries.txt"; private static final int BASE64_FLAGS = Base64.NO_PADDING | Base64.NO_WRAP; private final Context mContext; @@ -230,9 +229,6 @@ public class GpuService extends SystemService { // Reset the whitelist. Settings.Global.putString(mContentResolver, Settings.Global.GAME_DRIVER_WHITELIST, ""); - // Reset the sphal libraries - Settings.Global.putString(mContentResolver, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ""); mGameDriverVersionCode = driverInfo.longVersionCode; try { @@ -241,10 +237,6 @@ public class GpuService extends SystemService { assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_WHITELIST_FILENAME, Settings.Global.GAME_DRIVER_WHITELIST, ","); - - assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_SPHAL_LIBRARIES_FILENAME, - Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ":"); - } catch (PackageManager.NameNotFoundException e) { if (DEBUG) { Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed");