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
This commit is contained in:
Yiwei Zhang
2019-02-14 12:05:47 -08:00
parent 0f1f043f0e
commit 1c51f05ab4
3 changed files with 46 additions and 20 deletions

View File

@@ -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,

View File

@@ -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<void*>(getCanLoadSystemLibraries_native) },
{ "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) },
{ "setDriverPathAndSphalLibraries", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPathAndSphalLibraries_native) },
{ "setGpuStats", "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/String;)V", reinterpret_cast<void*>(setGpuStats_native) },
{ "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) },
{ "getShouldUseAngle", "(Ljava/lang/String;)Z", reinterpret_cast<void*>(shouldUseAngle_native) },

View File

@@ -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<String> 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<String> 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.");
}
}
}