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

Commit 0e7ae6d3 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

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
parent 3a0677ae
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.pm.PackageManager;
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 @@ class RuntimePermissionsUpgradeController {
                        | 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,7 +101,8 @@ class RuntimePermissionsUpgradeController {
            }

            for (String requestedPermission : app.requestedPermissions) {
                final PermissionInfo permInfo;
                PermissionInfo permInfo = permissionInfos.get(requestedPermission);
                if (permInfo == null) {
                    try {
                        permInfo = context.getPackageManager().getPermissionInfo(
                                requestedPermission, 0);
@@ -105,6 +110,9 @@ class RuntimePermissionsUpgradeController {
                        continue;
                    }

                    permissionInfos.put(requestedPermission, permInfo);
                }

                if ((permInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED
                        | PermissionInfo.FLAG_SOFT_RESTRICTED)) == 0) {
                    continue;