diff options
author | Peiyong Lin <lpy@google.com> | 2019-01-12 17:44:29 -0800 |
---|---|---|
committer | Peiyong Lin <lpy@google.com> | 2019-01-22 14:16:41 -0800 |
commit | 9ca1dd8dab8d568dc9da8b01ad38c1f25ffad991 (patch) | |
tree | 1774de28e5b2d7851e6b284ffdb17a67158272ea | |
parent | 4260098e02c8ea329fc949c1b74c6c974fec8770 (diff) |
[Game Driver] Add blacklist mechanism.
When a blacklist is set, we must not use driver package for those applications
on the blacklist.
BUG: 120869311
Test: Build, flash, boot. Verify with command line.
Change-Id: I1c9f10a3086007038c328a20346ffadeff1861ae
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | core/java/android/os/GraphicsEnvironment.java | 77 | ||||
-rw-r--r-- | graphics/proto/Android.bp | 11 | ||||
-rw-r--r-- | graphics/proto/game_driver.proto | 31 | ||||
-rw-r--r-- | graphics/proto/jarjar-rules.txt | 1 |
5 files changed, 101 insertions, 20 deletions
diff --git a/Android.bp b/Android.bp index f032e6287d89..45ccba0f6707 100644 --- a/Android.bp +++ b/Android.bp @@ -733,6 +733,7 @@ java_defaults { "apex_aidl_interface-java", "networkstack-aidl-interfaces-java", "framework-protos", + "game-driver-protos", "mediaplayer2-protos", "android.hidl.base-V1.0-java", "android.hardware.cas-V1.0-java", diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index f51ba9a41a2b..5bf909566f3b 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -23,10 +23,15 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; +import android.gamedriver.GameDriverProto.Blacklist; +import android.gamedriver.GameDriverProto.Blacklists; import android.opengl.EGL14; import android.provider.Settings; +import android.util.Base64; import android.util.Log; +import com.android.framework.protobuf.InvalidProtocolBufferException; + import dalvik.system.VMRuntime; import java.io.BufferedReader; @@ -62,6 +67,8 @@ public class GraphicsEnvironment { private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private static final String ANGLE_TEMP_RULES = "debug.angle.rules"; private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID"; + private static final String GAME_DRIVER_BLACKLIST_FLAG = "blacklist"; + private static final int BASE64_FLAGS = Base64.NO_PADDING | Base64.NO_WRAP; private ClassLoader mClassLoader; private String mLayerPath; @@ -480,6 +487,24 @@ public class GraphicsEnvironment { return; } + ApplicationInfo driverInfo; + try { + driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName, + PackageManager.MATCH_SYSTEM_ONLY); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); + 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; + } + // To minimize risk of driver updates crippling the device beyond user repair, never use an // updated driver for privileged or non-updated system apps. Presumably pre-installed apps // were tested thoroughly with the pre-installed driver. @@ -491,7 +516,7 @@ public class GraphicsEnvironment { // GUP_DEV_ALL_APPS // 0: Default (Invalid values fallback to default as well) - // 1: All apps use Game Update Package + // 1: All apps use Game Driver // 2: All apps use system graphics driver int gupDevAllApps = coreSettings.getInt(Settings.Global.GUP_DEV_ALL_APPS, 0); if (gupDevAllApps == 2) { @@ -510,33 +535,45 @@ public class GraphicsEnvironment { } return; } + boolean isDevOptIn = getGlobalSettingsString(coreSettings, + Settings.Global.GUP_DEV_OPT_IN_APPS) + .contains(ai.packageName); - if (!getGlobalSettingsString(coreSettings, Settings.Global.GUP_DEV_OPT_IN_APPS) - .contains(ai.packageName) - && !onWhitelist(context, driverPackageName, ai.packageName)) { + if (!isDevOptIn && !onWhitelist(context, driverPackageName, ai.packageName)) { if (DEBUG) { Log.w(TAG, ai.packageName + " is not on the whitelist."); } return; } - } - ApplicationInfo driverInfo; - try { - driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName, - PackageManager.MATCH_SYSTEM_ONLY); - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); - 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"); + if (!isDevOptIn) { + // At this point, the application is on the whitelist only, check whether it's + // on the blacklist, terminate early when it's on the blacklist. + try { + // TODO(b/121350991) Switch to DeviceConfig with property listener. + String base64String = coreSettings.getString(Settings.Global.GUP_BLACKLIST); + if (base64String != null && !base64String.isEmpty()) { + Blacklists blacklistsProto = Blacklists.parseFrom( + Base64.decode(base64String, BASE64_FLAGS)); + List<Blacklist> blacklists = blacklistsProto.getBlacklistsList(); + long driverVersionCode = driverInfo.longVersionCode; + for (Blacklist blacklist : blacklists) { + if (blacklist.getVersionCode() == driverVersionCode) { + for (String packageName : blacklist.getPackageNamesList()) { + if (packageName == ai.packageName) { + return; + } + } + break; + } + } + } + } catch (InvalidProtocolBufferException e) { + if (DEBUG) { + Log.w(TAG, "Can't parse blacklist, skip and continue..."); + } + } } - return; } String abi = chooseAbi(driverInfo); diff --git a/graphics/proto/Android.bp b/graphics/proto/Android.bp new file mode 100644 index 000000000000..1d06348fb02f --- /dev/null +++ b/graphics/proto/Android.bp @@ -0,0 +1,11 @@ +java_library_static { + name: "game-driver-protos", + host_supported: true, + proto: { + type: "lite", + }, + srcs: ["game_driver.proto"], + no_framework_libs: true, + jarjar_rules: "jarjar-rules.txt", + sdk_version: "28", +} diff --git a/graphics/proto/game_driver.proto b/graphics/proto/game_driver.proto new file mode 100644 index 000000000000..fd7ffccac24c --- /dev/null +++ b/graphics/proto/game_driver.proto @@ -0,0 +1,31 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto2"; + +package android.gamedriver; + +option java_package = "android.gamedriver"; +option java_outer_classname = "GameDriverProto"; + +message Blacklist { + optional int64 version_code = 1; + repeated string package_names = 2; +} + +message Blacklists { + repeated Blacklist blacklists = 1; +} diff --git a/graphics/proto/jarjar-rules.txt b/graphics/proto/jarjar-rules.txt new file mode 100644 index 000000000000..4e4063706352 --- /dev/null +++ b/graphics/proto/jarjar-rules.txt @@ -0,0 +1 @@ +rule com.google.protobuf.** com.android.framework.protobuf.@1 |