Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3490fce authored by Yiwei Zhang's avatar Yiwei Zhang
Browse files

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
parent 4c7291f7
Loading
Loading
Loading
Loading
+27 −4
Original line number Original line Diff line number Diff line
@@ -33,11 +33,13 @@ import android.widget.Toast;


import dalvik.system.VMRuntime;
import dalvik.system.VMRuntime;


import java.io.BufferedReader;
import java.io.File;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashMap;
@@ -71,6 +73,7 @@ public class GraphicsEnvironment {
            "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE";
            "android.app.action.ANGLE_FOR_ANDROID_TOAST_MESSAGE";
    private static final String INTENT_KEY_A4A_TOAST_MESSAGE = "A4A 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_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_0 = 0x00400000;
    private static final int VULKAN_1_1 = 0x00401000;
    private static final int VULKAN_1_1 = 0x00401000;


@@ -792,10 +795,7 @@ public class GraphicsEnvironment {
          .append("!/lib/")
          .append("!/lib/")
          .append(abi);
          .append(abi);
        final String paths = sb.toString();
        final String paths = sb.toString();

        final String sphalLibraries = getSphalLibraries(context, driverPackageName);
        final String sphalLibraries =
                coreSettings.getString(Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES);

        if (DEBUG) {
        if (DEBUG) {
            Log.v(TAG,
            Log.v(TAG,
                    "gfx driver package search path: " + paths
                    "gfx driver package search path: " + paths
@@ -832,6 +832,29 @@ public class GraphicsEnvironment {
        return null;
        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<String> 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 int getCanLoadSystemLibraries();
    private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
    private static native void setLayerPaths(ClassLoader classLoader, String layerPaths);
    private static native void setDebugLayers(String layers);
    private static native void setDebugLayers(String layers);
+0 −8
Original line number Original line Diff line number Diff line
@@ -64,7 +64,6 @@ public class GpuService extends SystemService {


    private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0";
    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_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 static final int BASE64_FLAGS = Base64.NO_PADDING | Base64.NO_WRAP;


    private final Context mContext;
    private final Context mContext;
@@ -230,9 +229,6 @@ public class GpuService extends SystemService {
        // Reset the whitelist.
        // Reset the whitelist.
        Settings.Global.putString(mContentResolver,
        Settings.Global.putString(mContentResolver,
                                  Settings.Global.GAME_DRIVER_WHITELIST, "");
                                  Settings.Global.GAME_DRIVER_WHITELIST, "");
        // Reset the sphal libraries
        Settings.Global.putString(mContentResolver,
                                  Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, "");
        mGameDriverVersionCode = driverInfo.longVersionCode;
        mGameDriverVersionCode = driverInfo.longVersionCode;


        try {
        try {
@@ -241,10 +237,6 @@ public class GpuService extends SystemService {


            assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_WHITELIST_FILENAME,
            assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_WHITELIST_FILENAME,
                    Settings.Global.GAME_DRIVER_WHITELIST, ",");
                    Settings.Global.GAME_DRIVER_WHITELIST, ",");

            assetToSettingsGlobal(mContext, driverContext, GAME_DRIVER_SPHAL_LIBRARIES_FILENAME,
                    Settings.Global.GAME_DRIVER_SPHAL_LIBRARIES, ":");

        } catch (PackageManager.NameNotFoundException e) {
        } catch (PackageManager.NameNotFoundException e) {
            if (DEBUG) {
            if (DEBUG) {
                Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed");
                Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed");