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

Commit 5e57a20c authored by Fyodor Kupolov's avatar Fyodor Kupolov
Browse files

Performance optimizations in generatePackageInfo

In PM.generatePackageInfo, granted permissions (returned by permissionsState.
getPermissions) are only used if the package has a non-empty list of
requested permissions. Added a shortcut to handle that. In my tests
this shortcut is triggered in ~20% calls to PM.generatePackageInfo.

Also added an early continue in PermissionsState.getPermissions. Calling
hasRuntimePermission was not necessary in 90% cases.
Also changed ArraySet to be created with capacity for all mPermissions --
this is the typical scenario, previously it was going through multiple
grow operations.

Bug: 29879962
Change-Id: Ic4d8914d1c4f4df447deee2e3e3a15a2594e90ef
parent 7877b8ad
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -3217,10 +3217,11 @@ public class PackageManagerService extends IPackageManager.Stub {
        final PermissionsState permissionsState = ps.getPermissionsState();
        // Compute GIDs only if requested
        final int[] gids = (flags & PackageManager.GET_GIDS) != 0
                ? permissionsState.computeGids(userId) : EMPTY_INT_ARRAY;
        // TODO b/29879962 Calculate granted permissions only if needed in generatePackageInfo
        final Set<String> permissions = permissionsState.getPermissions(userId);
        final int[] gids = (flags & PackageManager.GET_GIDS) == 0
                ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId);
        // Compute granted permissions only if package has requested permissions
        final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions)
                ? Collections.<String>emptySet() : permissionsState.getPermissions(userId);
        final PackageUserState state = ps.readUserState(userId);
        return PackageParser.generatePackageInfo(p, gids, flags,
+2 −1
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ public final class PermissionsState {
            return Collections.emptySet();
        }

        Set<String> permissions = new ArraySet<>();
        Set<String> permissions = new ArraySet<>(mPermissions.size());

        final int permissionCount = mPermissions.size();
        for (int i = 0; i < permissionCount; i++) {
@@ -282,6 +282,7 @@ public final class PermissionsState {

            if (hasInstallPermission(permission)) {
                permissions.add(permission);
                continue;
            }

            if (userId != UserHandle.USER_ALL) {