APEX and system apps can't be installed in a streaming fashion.

Test: atest PackageManagerShellCommandTest
Bug: b/136132412 b/133435829

Change-Id: I07d4bbc6800d227783fc284d2a6af9b00def1eaf
This commit is contained in:
Alex Buynytskyy
2020-02-03 15:00:21 -08:00
parent c69e256934
commit ae3eabee20

View File

@@ -558,10 +558,22 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mStagedSessionErrorMessage =
stagedSessionErrorMessage != null ? stagedSessionErrorMessage : "";
if (isStreamingInstallation()
&& this.params.dataLoaderParams.getComponentName().getPackageName()
== SYSTEM_DATA_LOADER_PACKAGE) {
assertShellOrSystemCalling("System data loaders");
if (isDataLoaderInstallation()) {
if (isApexInstallation()) {
throw new IllegalArgumentException(
"DataLoader installation of APEX modules is not allowed.");
}
}
if (isStreamingInstallation()) {
if (!isIncrementalInstallationAllowed(mPackageName)) {
throw new IllegalArgumentException(
"Incremental installation of this package is not allowed.");
}
if (this.params.dataLoaderParams.getComponentName().getPackageName()
== SYSTEM_DATA_LOADER_PACKAGE) {
assertShellOrSystemCalling("System data loaders");
}
}
}
@@ -1173,6 +1185,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
== PackageManager.PERMISSION_GRANTED;
}
/**
* Checks if the package can be installed on IncFs.
*/
private static boolean isIncrementalInstallationAllowed(String packageName) {
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
final AndroidPackage existingPackage = pmi.getPackage(packageName);
if (existingPackage == null) {
return true;
}
return !PackageManagerService.isSystemApp(existingPackage);
}
/**
* If this was not already called, the session will be sealed.
*
@@ -1362,14 +1387,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return false;
}
final PackageInfo pkgInfo = mPm.getPackageInfo(
params.appPackageName, PackageManager.GET_SIGNATURES
| PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
if (isApexInstallation()) {
validateApexInstallLocked();
} else {
validateApkInstallLocked(pkgInfo);
validateApkInstallLocked();
}
}
@@ -1786,8 +1807,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
* {@link PackageManagerService}.
*/
@GuardedBy("mLock")
private void validateApkInstallLocked(@Nullable PackageInfo pkgInfo)
throws PackageManagerException {
private void validateApkInstallLocked() throws PackageManagerException {
ApkLite baseApk = null;
mPackageName = null;
mVersionCode = -1;
@@ -1797,6 +1817,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mResolvedStagedFiles.clear();
mResolvedInheritedFiles.clear();
final PackageInfo pkgInfo = mPm.getPackageInfo(
params.appPackageName, PackageManager.GET_SIGNATURES
| PackageManager.MATCH_STATIC_SHARED_LIBRARIES /*flags*/, userId);
// Partial installs must be consistent with existing install
if (params.mode == SessionParams.MODE_INHERIT_EXISTING
&& (pkgInfo == null || pkgInfo.applicationInfo == null)) {