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

Commit d0fb8ac8 authored by Winson's avatar Winson
Browse files

Build splitPermissions manually for PackageParser

Through the PackageManager#getPackageArchiveInfo API, legacy
PackageParser can be invoked before the app process's Application
is available, so instead manually build the split permissions from
the PermissionManager service directly.

Bug: 219211480

Test: manual, re-install GMS per steps from bug

Change-Id: I7f9316a53752fa372002c387653a97e03ca222ac
parent 1e34849d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8035,6 +8035,7 @@ public abstract class PackageManager {
            return PackageParser.generatePackageInfo(pkg, null, (int) flagsBits, 0, 0, null,
                    FrameworkPackageUserState.DEFAULT);
        } catch (PackageParser.PackageParserException e) {
            Log.w(TAG, "Failure to parse package archive", e);
            return null;
        }
    }
+23 −3
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import android.content.IntentFilter;
import android.content.pm.overlay.OverlayPaths;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.content.pm.pkg.FrameworkPackageUserState;
import android.content.res.ApkAssets;
import android.content.res.AssetManager;
@@ -2417,9 +2418,28 @@ public class PackageParser {
            Slog.i(TAG, newPermsMsg.toString());
        }

        final List<PermissionManager.SplitPermissionInfo> splitPermissions =
                ActivityThread.currentApplication().getSystemService(PermissionManager.class)
        // Must build permission info manually for legacy code, which can be called before
        // Appication is available through the app process, so the normal API doesn't work.
        List<SplitPermissionInfoParcelable> splitPermissionParcelables;
        try {
            splitPermissionParcelables = ActivityThread.getPermissionManager()
                    .getSplitPermissions();
        } catch (RemoteException e) {
            splitPermissionParcelables = Collections.emptyList();
        }

        int splitPermissionsSize = splitPermissionParcelables.size();
        List<PermissionManager.SplitPermissionInfo> splitPermissions =
                new ArrayList<>(splitPermissionsSize);
        for (int index = 0; index < splitPermissionsSize; index++) {
            SplitPermissionInfoParcelable splitPermissionParcelable =
                    splitPermissionParcelables.get(index);
            splitPermissions.add(new PermissionManager.SplitPermissionInfo(
                    splitPermissionParcelable.getSplitPermission(),
                    splitPermissionParcelable.getNewPermissions(),
                    splitPermissionParcelable.getTargetSdk()
            ));
        }

        final int listSize = splitPermissions.size();
        for (int is = 0; is < listSize; is++) {