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
This commit is contained in:
Winson
2022-02-14 15:56:44 -08:00
parent 1e34849d50
commit d0fb8ac83a
2 changed files with 24 additions and 3 deletions

View File

@@ -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;
}
}

View File

@@ -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)
.getSplitPermissions();
// 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++) {