Cache PermissionInfos in whitelistAllSystemAppPermissions
PermissionInfo-s are not per package. Hence instead of resolving them
over and over again, cache already resolved PermissionInfo and reuse
them.
Before whitelistAllSystemAppPermissions took between 600 and 1100 ms on
a crosshatch-eng. Now it takes between 200-350 ms.
Test: Booted a few time and measured how long this method took
Bug: 139485700
Fixes: 136682954
Change-Id: I83221f9fb2ed00b67957a633d26906f4d8aeb26e
diff --git a/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java b/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
index cac2ef2..ff72b98 100644
--- a/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
+++ b/PermissionController/src/com/android/packageinstaller/permission/service/RuntimePermissionsUpgradeController.java
@@ -25,6 +25,7 @@
import android.content.pm.PermissionInfo;
import android.permission.PermissionManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -88,6 +89,9 @@
| PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_FACTORY_ONLY);
+ // Cache permissionInfos
+ final ArrayMap<String, PermissionInfo> permissionInfos = new ArrayMap<>();
+
final int appCount = apps.size();
for (int i = 0; i < appCount; i++) {
final PackageInfo app = apps.get(i);
@@ -97,12 +101,16 @@
}
for (String requestedPermission : app.requestedPermissions) {
- final PermissionInfo permInfo;
- try {
- permInfo = context.getPackageManager().getPermissionInfo(
- requestedPermission, 0);
- } catch (PackageManager.NameNotFoundException e) {
- continue;
+ PermissionInfo permInfo = permissionInfos.get(requestedPermission);
+ if (permInfo == null) {
+ try {
+ permInfo = context.getPackageManager().getPermissionInfo(
+ requestedPermission, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ continue;
+ }
+
+ permissionInfos.put(requestedPermission, permInfo);
}
if ((permInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED