From 1c51f05ab47c987291bb3be083603c045f884579 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 14 Feb 2019 12:05:47 -0800 Subject: [PATCH] Game Driver: process sphal libraries in GPU service This change adds the sphal libraries text file parsing to the GPU service. As the result, when the Game Driver apk is updated, the sphal library list will be read out to the GAME_DRIVER_SPHAL_LIBRARIES settings global property to be used in the graphics environment to extend the current linker namespace. Bug: 124448366 Test: Build, flash and boot. Install the apk to verify settings global. Change-Id: Ifb4007a1fe7269e0a2857fe7badc8642342b1449 --- core/java/android/os/GraphicsEnvironment.java | 13 ++++-- core/jni/android_os_GraphicsEnvironment.cpp | 9 ++-- .../com/android/server/gpu/GpuService.java | 44 +++++++++++++------ 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 47b1eefdcb07b..650d21785ec2c 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -664,8 +664,15 @@ public class GraphicsEnvironment { .append(abi); final String paths = sb.toString(); - if (DEBUG) Log.v(TAG, "gfx driver package libs: " + paths); - setDriverPath(paths); + final String sphalLibraries = + coreSettings.getString(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES); + + if (DEBUG) { + Log.v(TAG, + "gfx driver package search path: " + paths + + ", required sphal libraries: " + sphalLibraries); + } + setDriverPathAndSphalLibraries(paths, sphalLibraries); if (driverAppInfo.metaData == null) { throw new NullPointerException("apk's meta-data cannot be null"); @@ -700,7 +707,7 @@ public class GraphicsEnvironment { private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); private static native void setDebugLayersGLES(String layers); - private static native void setDriverPath(String path); + private static native void setDriverPathAndSphalLibraries(String path, String sphalLibraries); private static native void setGpuStats(String driverPackageName, String driverVersionName, long driverVersionCode, long driverBuildTime, String appPackageName); private static native void setAngleInfo(String path, String appPackage, String devOptIn, diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp index d9d3cdf43d18c..72e3d3495e372 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -27,9 +27,12 @@ int getCanLoadSystemLibraries_native() { return android::GraphicsEnv::getInstance().getCanLoadSystemLibraries(); } -void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { +void setDriverPathAndSphalLibraries_native(JNIEnv* env, jobject clazz, jstring path, + jstring sphalLibraries) { ScopedUtfChars pathChars(env, path); - android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); + ScopedUtfChars sphalLibrariesChars(env, sphalLibraries); + android::GraphicsEnv::getInstance().setDriverPathAndSphalLibraries(pathChars.c_str(), + sphalLibrariesChars.c_str()); } void setGpuStats_native(JNIEnv* env, jobject clazz, jstring driverPackageName, @@ -84,7 +87,7 @@ void setDebugLayersGLES_native(JNIEnv* env, jobject clazz, jstring layers) { const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast(getCanLoadSystemLibraries_native) }, - { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast(setDriverPath) }, + { "setDriverPathAndSphalLibraries", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast(setDriverPathAndSphalLibraries_native) }, { "setGpuStats", "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/String;)V", reinterpret_cast(setGpuStats_native) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast(setAngleInfo_native) }, { "getShouldUseAngle", "(Ljava/lang/String;)Z", reinterpret_cast(shouldUseAngle_native) }, diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java index 6899c3ffcbb14..647727f795da6 100644 --- a/services/core/java/com/android/server/gpu/GpuService.java +++ b/services/core/java/com/android/server/gpu/GpuService.java @@ -62,6 +62,7 @@ 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; @@ -162,6 +163,25 @@ public class GpuService extends SystemService { } } + private static void assetToSettingsGlobal(Context context, Context driverContext, + String fileName, String settingsGlobal, CharSequence delimiter) { + try { + final BufferedReader reader = new BufferedReader( + new InputStreamReader(driverContext.getAssets().open(fileName))); + final ArrayList assetStrings = new ArrayList<>(); + for (String assetString; (assetString = reader.readLine()) != null; ) { + assetStrings.add(assetString); + } + Settings.Global.putString(context.getContentResolver(), + settingsGlobal, + String.join(delimiter, assetStrings)); + } catch (IOException e) { + if (DEBUG) { + Slog.w(TAG, "Failed to load " + fileName + ", abort."); + } + } + } + private void fetchGameDriverPackageProperties() { final ApplicationInfo driverInfo; try { @@ -186,29 +206,25 @@ 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 { final Context driverContext = mContext.createPackageContext(mDriverPackageName, Context.CONTEXT_RESTRICTED); - final BufferedReader reader = new BufferedReader( - new InputStreamReader(driverContext.getAssets() - .open(GAME_DRIVER_WHITELIST_FILENAME))); - final ArrayList whitelistedPackageNames = new ArrayList<>(); - for (String packageName; (packageName = reader.readLine()) != null; ) { - whitelistedPackageNames.add(packageName); - } - Settings.Global.putString(mContentResolver, - Settings.Global.GAME_DRIVER_WHITELIST, - String.join(",", whitelistedPackageNames)); + + 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"); } - } catch (IOException e) { - if (DEBUG) { - Slog.w(TAG, "Failed to load whitelist driver package, abort."); - } } }