summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java3
-rw-r--r--services/core/java/com/android/server/pm/InstallArgs.java19
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java506
-rw-r--r--services/core/java/com/android/server/pm/InstallRequest.java387
-rw-r--r--services/core/java/com/android/server/pm/InstallingSession.java99
-rw-r--r--services/core/java/com/android/server/pm/PackageHandler.java16
-rw-r--r--services/core/java/com/android/server/pm/PackageInstalledInfo.java78
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java59
-rw-r--r--services/core/java/com/android/server/pm/PackageRemovedInfo.java5
-rw-r--r--services/core/java/com/android/server/pm/PostInstallData.java40
-rw-r--r--services/core/java/com/android/server/pm/ReconcilePackageUtils.java18
-rw-r--r--services/core/java/com/android/server/pm/ReconcileRequest.java11
-rw-r--r--services/core/java/com/android/server/pm/ReconciledPackage.java9
-rw-r--r--services/core/java/com/android/server/pm/RemovePackageHelper.java14
14 files changed, 751 insertions, 513 deletions
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index 9f6aa633c3b2..7242a56edfba 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -271,7 +271,8 @@ final class DeletePackageHelper {
// other processes clean up before deleting resources.
synchronized (mPm.mInstallLock) {
if (info.mArgs != null) {
- mRemovePackageHelper.cleanUpResources(info.mArgs);
+ mRemovePackageHelper.cleanUpResources(info.mArgs.mCodeFile,
+ info.mArgs.mInstructionSets);
}
boolean reEnableStub = false;
diff --git a/services/core/java/com/android/server/pm/InstallArgs.java b/services/core/java/com/android/server/pm/InstallArgs.java
index 65c237804d39..a94a4e2a70be 100644
--- a/services/core/java/com/android/server/pm/InstallArgs.java
+++ b/services/core/java/com/android/server/pm/InstallArgs.java
@@ -70,10 +70,9 @@ final class InstallArgs {
UserHandle user, String[] instructionSets,
String abiOverride, String[] installGrantPermissions,
List<String> allowlistedRestrictedPermissions,
- int autoRevokePermissionsMode,
- String traceMethod, int traceCookie, SigningDetails signingDetails,
- int installReason, int installScenario, boolean forceQueryableOverride,
- int dataLoaderType, int packageSource) {
+ int autoRevokePermissionsMode, String traceMethod, int traceCookie,
+ SigningDetails signingDetails, int installReason, int installScenario,
+ boolean forceQueryableOverride, int dataLoaderType, int packageSource) {
mOriginInfo = originInfo;
mMoveInfo = moveInfo;
mInstallFlags = installFlags;
@@ -96,18 +95,6 @@ final class InstallArgs {
mPackageSource = packageSource;
}
- /** New install */
- InstallArgs(InstallingSession params) {
- this(params.mOriginInfo, params.mMoveInfo, params.mObserver, params.mInstallFlags,
- params.mInstallSource, params.mVolumeUuid,
- params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride,
- params.mGrantedRuntimePermissions, params.mAllowlistedRestrictedPermissions,
- params.mAutoRevokePermissionsMode,
- params.mTraceMethod, params.mTraceCookie, params.mSigningDetails,
- params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride,
- params.mDataLoaderType, params.mPackageSource);
- }
-
/**
* Create args that describe an existing installed package. Typically used
* when cleaning up old installs, or used as a move source.
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index d20171024cd3..a25ee5e11e7e 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -105,7 +105,6 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
import android.content.pm.DataLoaderType;
-import android.content.pm.IPackageInstallObserver2;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfoLite;
import android.content.pm.PackageInstaller;
@@ -147,6 +146,7 @@ import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.F2fsUtils;
@@ -275,9 +275,9 @@ final class InstallPackageHelper {
// Prune unused SharedUserSetting
if (mPm.mSettings.checkAndPruneSharedUserLPw(requestSharedUserSetting, false)) {
// Set the app ID in removed info for UID_REMOVED broadcasts
- if (reconciledPkg.mInstallResult != null
- && reconciledPkg.mInstallResult.mRemovedInfo != null) {
- reconciledPkg.mInstallResult.mRemovedInfo.mRemovedAppId =
+ if (reconciledPkg.mInstallRequest != null
+ && reconciledPkg.mInstallRequest.getRemovedInfo() != null) {
+ reconciledPkg.mInstallRequest.getRemovedInfo().mRemovedAppId =
requestSharedUserSetting.mAppId;
}
}
@@ -307,24 +307,26 @@ final class InstallPackageHelper {
mPm.mSettings.convertSharedUserSettingsLPw(sharedUserSetting);
}
}
- if (reconciledPkg.mInstallArgs != null
- && reconciledPkg.mInstallArgs.mForceQueryableOverride) {
+ if (reconciledPkg.mInstallRequest != null
+ && reconciledPkg.mInstallRequest.isForceQueryableOverride()) {
pkgSetting.setForceQueryableOverride(true);
}
// If this is part of a standard install, set the initiating package name, else rely on
// previous device state.
- if (reconciledPkg.mInstallArgs != null) {
- InstallSource installSource = reconciledPkg.mInstallArgs.mInstallSource;
- if (installSource.initiatingPackageName != null) {
- final PackageSetting ips = mPm.mSettings.getPackageLPr(
- installSource.initiatingPackageName);
- if (ips != null) {
- installSource = installSource.setInitiatingPackageSignatures(
- ips.getSignatures());
+ if (reconciledPkg.mInstallRequest != null) {
+ InstallSource installSource = reconciledPkg.mInstallRequest.getInstallSource();
+ if (installSource != null) {
+ if (installSource.initiatingPackageName != null) {
+ final PackageSetting ips = mPm.mSettings.getPackageLPr(
+ installSource.initiatingPackageName);
+ if (ips != null) {
+ installSource = installSource.setInitiatingPackageSignatures(
+ ips.getSignatures());
+ }
}
+ pkgSetting.setInstallSource(installSource);
}
- pkgSetting.setInstallSource(installSource);
}
if ((scanFlags & SCAN_AS_APK_IN_APEX) != 0) {
@@ -418,8 +420,8 @@ final class InstallPackageHelper {
reconciledPkg.mAllowedSharedLibraryInfos,
reconciledPkg.getCombinedAvailablePackages(), scanFlags);
- if (reconciledPkg.mInstallResult != null) {
- reconciledPkg.mInstallResult.mLibraryConsumers = clientLibPkgs;
+ if (reconciledPkg.mInstallRequest != null) {
+ reconciledPkg.mInstallRequest.setLibraryConsumers(clientLibPkgs);
}
if ((scanFlags & SCAN_BOOTING) != 0) {
@@ -615,20 +617,18 @@ final class InstallPackageHelper {
mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId });
}
// start async restore with no post-install since we finish install here
- PackageInstalledInfo res = new PackageInstalledInfo(
- PackageManager.INSTALL_SUCCEEDED);
- res.mPkg = pkgSetting.getPkg();
- res.mNewUsers = new int[]{ userId };
- PostInstallData postInstallData =
- new PostInstallData(null, res, () -> {
+ InstallRequest request = new InstallRequest(userId,
+ PackageManager.INSTALL_SUCCEEDED, pkgSetting.getPkg(), new int[]{ userId },
+ () -> {
mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName,
userId);
if (intentSender != null) {
- onRestoreComplete(res.mReturnCode, mContext, intentSender);
+ onRestoreComplete(PackageManager.INSTALL_SUCCEEDED, mContext,
+ intentSender);
}
});
- restoreAndPostInstall(userId, res, postInstallData);
+ restoreAndPostInstall(request);
}
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -647,18 +647,17 @@ final class InstallPackageHelper {
}
}
- /** @param data Post-install is performed only if this is non-null. */
- public void restoreAndPostInstall(
- int userId, PackageInstalledInfo res, @Nullable PostInstallData data) {
+ public void restoreAndPostInstall(InstallRequest request) {
+ final int userId = request.getUserId();
if (DEBUG_INSTALL) {
- Log.v(TAG, "restoreAndPostInstall userId=" + userId + " package=" + res.mPkg);
+ Log.v(TAG,
+ "restoreAndPostInstall userId=" + userId + " package=" + request.getPkg());
}
// A restore should be requested at this point if (a) the install
// succeeded, (b) the operation is not an update.
- final boolean update = res.mRemovedInfo != null
- && res.mRemovedInfo.mRemovedPackage != null;
- boolean doRestore = !update && res.mPkg != null;
+ final boolean update = request.isUpdate();
+ boolean doRestore = !update && request.getPkg() != null;
// Set up the post-install work request bookkeeping. This will be used
// and cleaned up by the post-install event handling regardless of whether
@@ -666,23 +665,17 @@ final class InstallPackageHelper {
int token;
if (mPm.mNextInstallToken < 0) mPm.mNextInstallToken = 1;
token = mPm.mNextInstallToken++;
- if (data != null) {
- mPm.mRunningInstalls.put(token, data);
- } else if (DEBUG_INSTALL) {
- Log.v(TAG, "No post-install required for " + token);
- }
+ mPm.mRunningInstalls.put(token, request);
if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token);
- if (res.mReturnCode == PackageManager.INSTALL_SUCCEEDED && doRestore) {
+ if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && doRestore) {
// Pass responsibility to the Backup Manager. It will perform a
// restore if appropriate, then pass responsibility back to the
// Package Manager to run the post-install observer callbacks
// and broadcasts.
- if (res.mFreezer != null) {
- res.mFreezer.close();
- }
- doRestore = performBackupManagerRestore(userId, token, res);
+ request.closeFreezer();
+ doRestore = performBackupManagerRestore(userId, token, request);
}
// If this is an update to a package that might be potentially downgraded, then we
@@ -690,8 +683,8 @@ final class InstallPackageHelper {
// need to be snapshotted or restored for the package.
//
// TODO(narayan): Get this working for cases where userId == UserHandle.USER_ALL.
- if (res.mReturnCode == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) {
- doRestore = performRollbackManagerRestore(userId, token, res, data);
+ if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED && !doRestore && update) {
+ doRestore = performRollbackManagerRestore(userId, token, request);
}
if (!doRestore) {
@@ -707,10 +700,10 @@ final class InstallPackageHelper {
}
/**
- * Perform Backup Manager restore for a given {@link PackageInstalledInfo}.
+ * Perform Backup Manager restore for a given {@link InstallRequest}.
* Returns whether the restore successfully completed.
*/
- private boolean performBackupManagerRestore(int userId, int token, PackageInstalledInfo res) {
+ private boolean performBackupManagerRestore(int userId, int token, InstallRequest request) {
IBackupManager iBackupManager = mInjector.getIBackupManager();
if (iBackupManager != null) {
// For backwards compatibility as USER_ALL previously routed directly to USER_SYSTEM
@@ -725,7 +718,7 @@ final class InstallPackageHelper {
try {
if (iBackupManager.isUserReadyForBackup(userId)) {
iBackupManager.restoreAtInstallForUser(
- userId, res.mPkg.getPackageName(), token);
+ userId, request.getPkg().getPackageName(), token);
} else {
Slog.w(TAG, "User " + userId + " is not ready. Restore at install "
+ "didn't take place.");
@@ -745,12 +738,11 @@ final class InstallPackageHelper {
}
/**
- * Perform Rollback Manager restore for a given {@link PackageInstalledInfo}.
+ * Perform Rollback Manager restore for a given {@link InstallRequest}.
* Returns whether the restore successfully completed.
*/
- private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res,
- PostInstallData data) {
- final String packageName = res.mPkg.getPackageName();
+ private boolean performRollbackManagerRestore(int userId, int token, InstallRequest request) {
+ final String packageName = request.getPkg().getPackageName();
final int[] allUsers = mPm.mUserManager.getUserIds();
final int[] installedUsers;
@@ -762,19 +754,20 @@ final class InstallPackageHelper {
if (ps != null) {
appId = ps.getAppId();
ceDataInode = ps.getCeDataInode(userId);
+ // NOTE: We ignore the user specified in the InstallParam because we know this is
+ // an update, and hence need to restore data for all installed users.
+ installedUsers = ps.queryInstalledUsers(allUsers, true);
+ } else {
+ installedUsers = new int[0];
}
-
- // NOTE: We ignore the user specified in the InstallParam because we know this is
- // an update, and hence need to restore data for all installed users.
- installedUsers = ps.queryInstalledUsers(allUsers, true);
}
- boolean doSnapshotOrRestore = data != null && data.args != null
- && ((data.args.mInstallFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0
- || (data.args.mInstallFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0);
+ final int installFlags = request.getInstallFlags();
+ boolean doSnapshotOrRestore = ((installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0
+ || (installFlags & PackageManager.INSTALL_REQUEST_DOWNGRADE) != 0);
if (ps != null && doSnapshotOrRestore) {
- final String seInfo = AndroidPackageUtils.getSeInfo(res.mPkg, ps);
+ final String seInfo = AndroidPackageUtils.getSeInfo(request.getPkg(), ps);
final RollbackManagerInternal rollbackManager =
mInjector.getLocalService(RollbackManagerInternal.class);
rollbackManager.snapshotAndRestoreUserData(packageName,
@@ -817,9 +810,8 @@ final class InstallPackageHelper {
@GuardedBy("mPm.mInstallLock")
private void installPackagesLI(List<InstallRequest> requests) {
final Map<String, ScanResult> preparedScans = new ArrayMap<>(requests.size());
- final Map<String, InstallArgs> installArgs = new ArrayMap<>(requests.size());
- final Map<String, PackageInstalledInfo> installResults = new ArrayMap<>(requests.size());
final Map<String, PrepareResult> prepareResults = new ArrayMap<>(requests.size());
+ final Map<String, InstallRequest> installRequests = new ArrayMap<>(requests.size());
final Map<String, Settings.VersionInfo> versionInfos = new ArrayMap<>(requests.size());
final Map<String, Boolean> createdAppId = new ArrayMap<>(requests.size());
boolean success = false;
@@ -832,32 +824,30 @@ final class InstallPackageHelper {
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "preparePackage");
prepareResult =
- preparePackageLI(request.mArgs, request.mInstallResult);
+ preparePackageLI(request);
} catch (PrepareFailure prepareFailure) {
- request.mInstallResult.setError(prepareFailure.error,
+ request.setError(prepareFailure.error,
prepareFailure.getMessage());
- request.mInstallResult.mOrigPackage = prepareFailure.mConflictingPackage;
- request.mInstallResult.mOrigPermission = prepareFailure.mConflictingPermission;
+ request.setOriginPackage(prepareFailure.mConflictingPackage);
+ request.setOriginPermission(prepareFailure.mConflictingPermission);
return;
} finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
- request.mInstallResult.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
- request.mInstallResult.mInstallerPackageName =
- request.mArgs.mInstallSource.installerPackageName;
+ request.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
+ request.setInstallerPackageName(request.getSourceInstallerPackageName());
final String packageName = prepareResult.mPackageToScan.getPackageName();
prepareResults.put(packageName, prepareResult);
- installResults.put(packageName, request.mInstallResult);
- installArgs.put(packageName, request.mArgs);
+ installRequests.put(packageName, request);
try {
final ScanResult result = scanPackageTracedLI(
prepareResult.mPackageToScan, prepareResult.mParseFlags,
prepareResult.mScanFlags, System.currentTimeMillis(),
- request.mArgs.mUser, request.mArgs.mAbiOverride);
+ request.getUser(), request.getAbiOverride());
if (null != preparedScans.put(result.mPkgSetting.getPkg().getPackageName(),
result)) {
- request.mInstallResult.setError(
+ request.setError(
PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE,
"Duplicate package "
+ result.mPkgSetting.getPkg().getPackageName()
@@ -868,7 +858,7 @@ final class InstallPackageHelper {
result.mRequest.mOldPkg, result.mPkgSetting.getPkg())) {
// TODO: INSTALL_FAILED_UPDATE_INCOMPATIBLE is about incomptabible
// signatures. Is there a better error code?
- request.mInstallResult.setError(
+ request.setError(
INSTALL_FAILED_UPDATE_INCOMPATIBLE,
"Update attempted to change value of "
+ PackageManager.PROPERTY_NO_APP_DATA_STORAGE);
@@ -883,15 +873,15 @@ final class InstallPackageHelper {
versionInfos.put(result.mPkgSetting.getPkg().getPackageName(),
mPm.getSettingsVersionForPackage(result.mPkgSetting.getPkg()));
} catch (PackageManagerException e) {
- request.mInstallResult.setError("Scanning Failed.", e);
+ request.setError("Scanning Failed.", e);
return;
}
}
CommitRequest commitRequest;
synchronized (mPm.mLock) {
- ReconcileRequest reconcileRequest = new ReconcileRequest(preparedScans, installArgs,
- installResults, prepareResults,
+ ReconcileRequest reconcileRequest = new ReconcileRequest(preparedScans,
+ installRequests, prepareResults,
Collections.unmodifiableMap(mPm.mPackages), versionInfos);
Map<String, ReconciledPackage> reconciledPackages;
try {
@@ -901,7 +891,7 @@ final class InstallPackageHelper {
mPm.mSettings.getKeySetManagerService(), mPm.mSettings);
} catch (ReconcileFailure e) {
for (InstallRequest request : requests) {
- request.mInstallResult.setError("Reconciliation failed...", e);
+ request.setError("Reconciliation failed...", e);
}
return;
} finally {
@@ -921,25 +911,24 @@ final class InstallPackageHelper {
} finally {
if (success) {
for (InstallRequest request : requests) {
- final InstallArgs args = request.mArgs;
- if (args.mDataLoaderType != DataLoaderType.INCREMENTAL) {
+ if (request.getDataLoaderType() != DataLoaderType.INCREMENTAL) {
continue;
}
- if (args.mSigningDetails.getSignatureSchemeVersion() != SIGNING_BLOCK_V4) {
+ if (request.getSignatureSchemeVersion() != SIGNING_BLOCK_V4) {
continue;
}
// For incremental installs, we bypass the verifier prior to install. Now
// that we know the package is valid, send a notice to the verifier with
// the root hash of the base.apk.
- final String baseCodePath = request.mInstallResult.mPkg.getBaseApkPath();
- final String[] splitCodePaths = request.mInstallResult.mPkg.getSplitCodePaths();
- final Uri originUri = Uri.fromFile(args.mOriginInfo.mResolvedFile);
+ final String baseCodePath = request.getPkg().getBaseApkPath();
+ final String[] splitCodePaths = request.getPkg().getSplitCodePaths();
+ final Uri originUri = request.getOriginUri();
final int verificationId = mPm.mPendingVerificationToken++;
final String rootHashString = PackageManagerServiceUtils
.buildVerificationRootHashString(baseCodePath, splitCodePaths);
VerificationUtils.broadcastPackageVerified(verificationId, originUri,
PackageManager.VERIFICATION_ALLOW, rootHashString,
- args.mDataLoaderType, args.mUser, mContext);
+ request.getDataLoaderType(), request.getUser(), mContext);
}
} else {
for (ScanResult result : preparedScans.values()) {
@@ -951,11 +940,9 @@ final class InstallPackageHelper {
// TODO(b/194319951): create a more descriptive reason than unknown
// mark all non-failure installs as UNKNOWN so we do not treat them as success
for (InstallRequest request : requests) {
- if (request.mInstallResult.mFreezer != null) {
- request.mInstallResult.mFreezer.close();
- }
- if (request.mInstallResult.mReturnCode == PackageManager.INSTALL_SUCCEEDED) {
- request.mInstallResult.mReturnCode = PackageManager.INSTALL_UNKNOWN;
+ request.closeFreezer();
+ if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
+ request.setReturnCode(PackageManager.INSTALL_UNKNOWN);
}
}
}
@@ -980,18 +967,19 @@ final class InstallPackageHelper {
}
@GuardedBy("mPm.mInstallLock")
- private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res)
+ private PrepareResult preparePackageLI(InstallRequest request)
throws PrepareFailure {
- final int installFlags = args.mInstallFlags;
- final boolean onExternal = args.mVolumeUuid != null;
+ final int installFlags = request.getInstallFlags();
+ final boolean onExternal = request.getVolumeUuid() != null;
final boolean instantApp = ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0);
final boolean fullApp = ((installFlags & PackageManager.INSTALL_FULL_APP) != 0);
final boolean virtualPreload =
((installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);
final boolean isApex = ((installFlags & PackageManager.INSTALL_APEX) != 0);
- final boolean isRollback = args.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK;
+ final boolean isRollback =
+ request.getInstallReason() == PackageManager.INSTALL_REASON_ROLLBACK;
@PackageManagerService.ScanFlags int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE;
- if (args.mMoveInfo != null) {
+ if (request.isMoveInstall()) {
// moving a complete application; perform an initial scan on the new install location
scanFlags |= SCAN_INITIAL;
}
@@ -1012,7 +1000,7 @@ final class InstallPackageHelper {
}
final File tmpPackageFile = new File(
- isApex ? res.mApexInfo.modulePath : args.getCodePath());
+ isApex ? request.getApexInfo().modulePath : request.getCodePath());
if (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile);
// Validity check
@@ -1066,7 +1054,8 @@ final class InstallPackageHelper {
}
}
- String pkgName = res.mName = parsedPackage.getPackageName();
+ String pkgName = parsedPackage.getPackageName();
+ request.setName(pkgName);
if (parsedPackage.isTestOnly()) {
if ((installFlags & PackageManager.INSTALL_ALLOW_TEST) == 0) {
throw new PrepareFailure(INSTALL_FAILED_TEST_ONLY, "installPackageLI");
@@ -1074,8 +1063,8 @@ final class InstallPackageHelper {
}
// either use what we've been given or parse directly from the APK
- if (args.mSigningDetails != SigningDetails.UNKNOWN) {
- parsedPackage.setSigningDetails(args.mSigningDetails);
+ if (request.getSigningDetails() != SigningDetails.UNKNOWN) {
+ parsedPackage.setSigningDetails(request.getSigningDetails());
} else {
final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing();
final ParseResult<SigningDetails> result = ParsingPackageUtils.getSigningDetails(
@@ -1223,7 +1212,8 @@ final class InstallPackageHelper {
if (ps.getPkg() != null) {
systemApp = ps.getPkg().isSystem();
}
- res.mOrigUsers = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true);
+ request.setOriginUsers(
+ ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true));
}
final int numGroups = ArrayUtils.size(parsedPackage.getPermissionGroups());
@@ -1299,7 +1289,7 @@ final class InstallPackageHelper {
// it as dangerous leading to the group auto-grant.
if ((perm.getProtectionLevel() & PermissionInfo.PROTECTION_MASK_BASE)
== PermissionInfo.PROTECTION_DANGEROUS) {
- if (bp != null && !bp.isRuntime()) {
+ if (!bp.isRuntime()) {
Slog.w(TAG, "Package " + parsedPackage.getPackageName()
+ " trying to change a non-runtime permission "
+ perm.getName()
@@ -1372,7 +1362,7 @@ final class InstallPackageHelper {
}
}
- if (args.mMoveInfo != null) {
+ if (request.isMoveInstall()) {
// We did an in-place move, so dex is ready to roll
scanFlags |= SCAN_NO_DEX;
scanFlags |= SCAN_MOVE;
@@ -1380,7 +1370,7 @@ final class InstallPackageHelper {
synchronized (mPm.mLock) {
final PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName);
if (ps == null) {
- res.setError(INSTALL_FAILED_INTERNAL_ERROR,
+ request.setError(INSTALL_FAILED_INTERNAL_ERROR,
"Missing settings for moved package " + pkgName);
}
@@ -1403,7 +1393,7 @@ final class InstallPackageHelper {
}
boolean isUpdatedSystemAppFromExistingSetting = pkgSetting != null
&& pkgSetting.getPkgState().isUpdatedSystemApp();
- final String abiOverride = deriveAbiOverride(args.mAbiOverride);
+ final String abiOverride = deriveAbiOverride(request.getAbiOverride());
boolean isUpdatedSystemAppInferred = oldPackage != null && oldPackage.isSystem();
final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths>
derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage,
@@ -1419,7 +1409,7 @@ final class InstallPackageHelper {
}
if (!isApex) {
- doRenameLI(args, res.mReturnCode, res.mReturnMsg, parsedPackage);
+ doRenameLI(request, parsedPackage);
try {
setUpFsVerityIfPossible(parsedPackage);
@@ -1430,8 +1420,8 @@ final class InstallPackageHelper {
}
} else {
// Use the path returned by apexd
- parsedPackage.setPath(res.mApexInfo.modulePath);
- parsedPackage.setBaseApkPath(res.mApexInfo.modulePath);
+ parsedPackage.setPath(request.getApexInfo().modulePath);
+ parsedPackage.setBaseApkPath(request.getApexInfo().modulePath);
}
final PackageFreezer freezer =
@@ -1559,8 +1549,8 @@ final class InstallPackageHelper {
// don't allow an upgrade from full to ephemeral
if (isInstantApp) {
- if (args.mUser == null
- || args.mUser.getIdentifier() == UserHandle.USER_ALL) {
+ if (request.getUser() == null
+ || request.getUserId() == UserHandle.USER_ALL) {
for (int currentUser : allUsers) {
if (!ps.getInstantApp(currentUser)) {
// can't downgrade from full to instant
@@ -1571,10 +1561,10 @@ final class InstallPackageHelper {
PackageManager.INSTALL_FAILED_SESSION_INVALID);
}
}
- } else if (!ps.getInstantApp(args.mUser.getIdentifier())) {
+ } else if (!ps.getInstantApp(request.getUserId())) {
// can't downgrade from full to instant
Slog.w(TAG, "Can't replace full app with instant app: " + pkgName11
- + " for user: " + args.mUser.getIdentifier());
+ + " for user: " + request.getUserId());
throw new PrepareFailure(
PackageManager.INSTALL_FAILED_SESSION_INVALID);
}
@@ -1582,25 +1572,29 @@ final class InstallPackageHelper {
}
// Update what is removed
- res.mRemovedInfo = new PackageRemovedInfo(mPm);
- res.mRemovedInfo.mUid = oldPackage.getUid();
- res.mRemovedInfo.mRemovedPackage = oldPackage.getPackageName();
- res.mRemovedInfo.mInstallerPackageName = ps.getInstallSource().installerPackageName;
- res.mRemovedInfo.mIsStaticSharedLib =
+ PackageRemovedInfo removedInfo = new PackageRemovedInfo(mPm);
+ removedInfo.mUid = oldPackage.getUid();
+ removedInfo.mRemovedPackage = oldPackage.getPackageName();
+ removedInfo.mInstallerPackageName =
+ ps.getInstallSource().installerPackageName;
+ removedInfo.mIsStaticSharedLib =
parsedPackage.getStaticSharedLibName() != null;
- res.mRemovedInfo.mIsUpdate = true;
- res.mRemovedInfo.mOrigUsers = installedUsers;
- res.mRemovedInfo.mInstallReasons = new SparseArray<>(installedUsers.length);
+ removedInfo.mIsUpdate = true;
+ removedInfo.mOrigUsers = installedUsers;
+ removedInfo.mInstallReasons = new SparseIntArray(installedUsers.length);
for (int i = 0; i < installedUsers.length; i++) {
final int userId = installedUsers[i];
- res.mRemovedInfo.mInstallReasons.put(userId, ps.getInstallReason(userId));
+ removedInfo.mInstallReasons.put(userId,
+ ps.getInstallReason(userId));
}
- res.mRemovedInfo.mUninstallReasons = new SparseArray<>(uninstalledUsers.length);
+ removedInfo.mUninstallReasons = new SparseIntArray(uninstalledUsers.length);
for (int i = 0; i < uninstalledUsers.length; i++) {
final int userId = uninstalledUsers[i];
- res.mRemovedInfo.mUninstallReasons.put(userId, ps.getUninstallReason(userId));
+ removedInfo.mUninstallReasons.put(userId,
+ ps.getUninstallReason(userId));
}
- res.mRemovedInfo.mIsExternal = oldPackage.isExternalStorage();
+ removedInfo.mIsExternal = oldPackage.isExternalStorage();
+ request.setRemovedInfo(removedInfo);
sysPkg = oldPackage.isSystem();
if (sysPkg) {
@@ -1625,7 +1619,7 @@ final class InstallPackageHelper {
Slog.d(TAG, "replaceSystemPackageLI: new=" + parsedPackage
+ ", old=" + oldPackage);
}
- res.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
+ request.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
targetParseFlags = systemParseFlags;
targetScanFlags = systemScanFlags;
} else { // non system replace
@@ -1674,7 +1668,7 @@ final class InstallPackageHelper {
oldPackage, parsedPackage, replace /* clearCodeCache */, sysPkg,
ps, disabledPs);
} finally {
- res.mFreezer = freezer;
+ request.setFreezer(freezer);
if (shouldCloseFreezerBeforeReturn) {
freezer.close();
}
@@ -1686,24 +1680,26 @@ final class InstallPackageHelper {
* scanned package should be updated to reflect the rename.
*/
@GuardedBy("mPm.mInstallLock")
- private void doRenameLI(InstallArgs args, int status, String statusMsg,
+ private void doRenameLI(InstallRequest request,
ParsedPackage parsedPackage) throws PrepareFailure {
- if (args.mMoveInfo != null) {
+ final int status = request.getReturnCode();
+ final String statusMsg = request.getReturnMsg();
+ if (request.isMoveInstall()) {
if (status != PackageManager.INSTALL_SUCCEEDED) {
- mRemovePackageHelper.cleanUpForMoveInstall(args.mMoveInfo.mToUuid,
- args.mMoveInfo.mPackageName, args.mMoveInfo.mFromCodePath);
+ mRemovePackageHelper.cleanUpForMoveInstall(request.getMoveToUuid(),
+ request.getMovePackageName(), request.getMoveFromCodePath());
throw new PrepareFailure(status, statusMsg);
}
return;
}
// For file installations
if (status != PackageManager.INSTALL_SUCCEEDED) {
- mRemovePackageHelper.removeCodePath(args.mCodeFile);
+ mRemovePackageHelper.removeCodePath(request.getCodeFile());
throw new PrepareFailure(status, statusMsg);
}
- final File targetDir = resolveTargetDir(args);
- final File beforeCodeFile = args.mCodeFile;
+ final File targetDir = resolveTargetDir(request.getInstallFlags(), request.getCodeFile());
+ final File beforeCodeFile = request.getCodeFile();
final File afterCodeFile = PackageManagerServiceUtils.getNextCodePath(targetDir,
parsedPackage.getPackageName());
@@ -1732,7 +1728,7 @@ final class InstallPackageHelper {
}
// Reflect the rename internally
- args.mCodeFile = afterCodeFile;
+ request.setCodeFile(afterCodeFile);
// Reflect the rename in scanned details
try {
@@ -1750,12 +1746,12 @@ final class InstallPackageHelper {
// TODO(b/168126411): Once staged install flow starts using the same folder as non-staged
// flow, we won't need this method anymore.
- private File resolveTargetDir(InstallArgs args) {
- boolean isStagedInstall = (args.mInstallFlags & INSTALL_STAGED) != 0;
+ private File resolveTargetDir(int installFlags, File codeFile) {
+ boolean isStagedInstall = (installFlags & INSTALL_STAGED) != 0;
if (isStagedInstall) {
return Environment.getDataAppDirectory(null);
} else {
- return args.mCodeFile.getParentFile();
+ return codeFile.getParentFile();
}
}
@@ -1905,7 +1901,7 @@ final class InstallPackageHelper {
final ScanRequest scanRequest = scanResult.mRequest;
final ParsedPackage parsedPackage = scanRequest.mParsedPackage;
final String packageName = parsedPackage.getPackageName();
- final PackageInstalledInfo res = reconciledPkg.mInstallResult;
+ final InstallRequest installRequest = reconciledPkg.mInstallRequest;
final RemovePackageHelper removePackageHelper = new RemovePackageHelper(mPm);
final DeletePackageHelper deletePackageHelper = new DeletePackageHelper(mPm);
@@ -1921,9 +1917,10 @@ final class InstallPackageHelper {
.setFirstInstallTimeFromReplaced(deletedPkgSetting, request.mAllUsers)
.setLastUpdateTime(System.currentTimeMillis());
- res.mRemovedInfo.mBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList(
- mPm.snapshotComputer(), reconciledPkg.mPkgSetting, request.mAllUsers,
- mPm.mSettings.getPackagesLocked());
+ installRequest.getRemovedInfo().mBroadcastAllowList =
+ mPm.mAppsFilter.getVisibilityAllowList(mPm.snapshotComputer(),
+ reconciledPkg.mPkgSetting, request.mAllUsers,
+ mPm.mSettings.getPackagesLocked());
if (reconciledPkg.mPrepareResult.mSystem) {
// Remove existing system package
removePackageHelper.removePackage(oldPackage, true);
@@ -1931,7 +1928,7 @@ final class InstallPackageHelper {
// We didn't need to disable the .apk as a current system package,
// which means we are replacing another update that is already
// installed. We need to make sure to delete the older one's .apk.
- res.mRemovedInfo.mArgs = new InstallArgs(
+ installRequest.getRemovedInfo().mArgs = new InstallArgs(
oldPackage.getPath(),
getAppDexInstructionSets(
AndroidPackageUtils.getPrimaryCpuAbi(oldPackage,
@@ -1939,7 +1936,7 @@ final class InstallPackageHelper {
AndroidPackageUtils.getSecondaryCpuAbi(oldPackage,
deletedPkgSetting)));
} else {
- res.mRemovedInfo.mArgs = null;
+ installRequest.getRemovedInfo().mArgs = null;
}
} else {
try {
@@ -1957,7 +1954,7 @@ final class InstallPackageHelper {
// Update the in-memory copy of the previous code paths.
PackageSetting ps1 = mPm.mSettings.getPackageLPr(
reconciledPkg.mPrepareResult.mExistingPackage.getPackageName());
- if ((reconciledPkg.mInstallArgs.mInstallFlags & PackageManager.DONT_KILL_APP)
+ if ((installRequest.getInstallFlags() & PackageManager.DONT_KILL_APP)
== 0) {
Set<String> oldCodePaths = ps1.getOldCodePaths();
if (oldCodePaths == null) {
@@ -1970,12 +1967,11 @@ final class InstallPackageHelper {
ps1.setOldCodePaths(null);
}
- if (reconciledPkg.mInstallResult.mReturnCode
- == PackageManager.INSTALL_SUCCEEDED) {
+ if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
PackageSetting ps2 = mPm.mSettings.getPackageLPr(
parsedPackage.getPackageName());
if (ps2 != null) {
- res.mRemovedInfo.mRemovedForAllUsers =
+ installRequest.getRemovedInfo().mRemovedForAllUsers =
mPm.mPackages.get(ps2.getPackageName()) == null;
}
}
@@ -1984,15 +1980,16 @@ final class InstallPackageHelper {
AndroidPackage pkg = commitReconciledScanResultLocked(
reconciledPkg, request.mAllUsers);
- updateSettingsLI(pkg, reconciledPkg, request.mAllUsers, res);
+ updateSettingsLI(pkg, reconciledPkg, request.mAllUsers, installRequest);
final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
if (ps != null) {
- res.mNewUsers = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true);
+ installRequest.setNewUsers(
+ ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true));
ps.setUpdateAvailable(false /*updateAvailable*/);
}
- if (res.mReturnCode == PackageManager.INSTALL_SUCCEEDED) {
- mPm.updateSequenceNumberLP(ps, res.mNewUsers);
+ if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
+ mPm.updateSequenceNumberLP(ps, installRequest.getNewUsers());
mPm.updateInstantAppInstallerLocked(packageName);
}
}
@@ -2005,20 +2002,18 @@ final class InstallPackageHelper {
}
private void updateSettingsLI(AndroidPackage newPackage, ReconciledPackage reconciledPkg,
- int[] allUsers, PackageInstalledInfo res) {
- updateSettingsInternalLI(newPackage, reconciledPkg, allUsers, res);
+ int[] allUsers, InstallRequest installRequest) {
+ updateSettingsInternalLI(newPackage, reconciledPkg, allUsers, installRequest);
}
private void updateSettingsInternalLI(AndroidPackage pkg, ReconciledPackage reconciledPkg,
- int[] allUsers, PackageInstalledInfo res) {
+ int[] allUsers, InstallRequest installRequest) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "updateSettings");
final String pkgName = pkg.getPackageName();
- final int[] installedForUsers = res.mOrigUsers;
- final InstallArgs installArgs = reconciledPkg.mInstallArgs;
- final int installReason = installArgs.mInstallReason;
- InstallSource installSource = installArgs.mInstallSource;
- final String installerPackageName = installSource.installerPackageName;
+ final int[] installedForUsers = installRequest.getOriginUsers();
+ final int installReason = installRequest.getInstallReason();
+ final String installerPackageName = installRequest.getSourceInstallerPackageName();
if (DEBUG_INSTALL) Slog.d(TAG, "New package installed in " + pkg.getPath());
synchronized (mPm.mLock) {
@@ -2026,15 +2021,15 @@ final class InstallPackageHelper {
// of the package implies that the user actually wants to run that new code,
// so we enable the package.
final PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName);
- final int userId = installArgs.mUser.getIdentifier();
+ final int userId = installRequest.getUserId();
if (ps != null) {
if (pkg.isSystem()) {
if (DEBUG_INSTALL) {
Slog.d(TAG, "Implicitly enabling system package on upgrade: " + pkgName);
}
// Enable system package for requested users
- if (res.mOrigUsers != null) {
- for (int origUserId : res.mOrigUsers) {
+ if (installedForUsers != null) {
+ for (int origUserId : installedForUsers) {
if (userId == UserHandle.USER_ALL || userId == origUserId) {
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT,
origUserId, installerPackageName);
@@ -2101,20 +2096,27 @@ final class InstallPackageHelper {
// When replacing an existing package, preserve the original install reason for all
// users that had the package installed before. Similarly for uninstall reasons.
final Set<Integer> previousUserIds = new ArraySet<>();
- if (res.mRemovedInfo != null && res.mRemovedInfo.mInstallReasons != null) {
- final int installReasonCount = res.mRemovedInfo.mInstallReasons.size();
+ if (installRequest.getRemovedInfo() != null
+ && installRequest.getRemovedInfo().mInstallReasons != null) {
+ final int installReasonCount =
+ installRequest.getRemovedInfo().mInstallReasons.size();
for (int i = 0; i < installReasonCount; i++) {
- final int previousUserId = res.mRemovedInfo.mInstallReasons.keyAt(i);
+ final int previousUserId =
+ installRequest.getRemovedInfo().mInstallReasons.keyAt(i);
final int previousInstallReason =
- res.mRemovedInfo.mInstallReasons.valueAt(i);
+ installRequest.getRemovedInfo().mInstallReasons.valueAt(i);
ps.setInstallReason(previousInstallReason, previousUserId);
previousUserIds.add(previousUserId);
}
}
- if (res.mRemovedInfo != null && res.mRemovedInfo.mUninstallReasons != null) {
- for (int i = 0; i < res.mRemovedInfo.mUninstallReasons.size(); i++) {
- final int previousUserId = res.mRemovedInfo.mUninstallReasons.keyAt(i);
- final int previousReason = res.mRemovedInfo.mUninstallReasons.valueAt(i);
+ if (installRequest.getRemovedInfo() != null
+ && installRequest.getRemovedInfo().mUninstallReasons != null) {
+ for (int i = 0; i < installRequest.getRemovedInfo().mUninstallReasons.size();
+ i++) {
+ final int previousUserId =
+ installRequest.getRemovedInfo().mUninstallReasons.keyAt(i);
+ final int previousReason =
+ installRequest.getRemovedInfo().mUninstallReasons.valueAt(i);
ps.setUninstallReason(previousReason, previousUserId);
}
}
@@ -2153,41 +2155,41 @@ final class InstallPackageHelper {
final PermissionManagerServiceInternal.PackageInstalledParams.Builder
permissionParamsBuilder =
new PermissionManagerServiceInternal.PackageInstalledParams.Builder();
- final boolean grantPermissions = (installArgs.mInstallFlags
+ final boolean grantPermissions = (installRequest.getInstallFlags()
& PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
if (grantPermissions) {
final List<String> grantedPermissions =
- installArgs.mInstallGrantPermissions != null
- ? Arrays.asList(installArgs.mInstallGrantPermissions)
+ installRequest.getInstallGrantPermissions() != null
+ ? Arrays.asList(installRequest.getInstallGrantPermissions())
: pkg.getRequestedPermissions();
permissionParamsBuilder.setGrantedPermissions(grantedPermissions);
}
final boolean allowlistAllRestrictedPermissions =
- (installArgs.mInstallFlags
+ (installRequest.getInstallFlags()
& PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0;
final List<String> allowlistedRestrictedPermissions =
allowlistAllRestrictedPermissions ? pkg.getRequestedPermissions()
- : installArgs.mAllowlistedRestrictedPermissions;
+ : installRequest.getAllowlistedRestrictedPermissions();
if (allowlistedRestrictedPermissions != null) {
permissionParamsBuilder.setAllowlistedRestrictedPermissions(
allowlistedRestrictedPermissions);
}
- final int autoRevokePermissionsMode = installArgs.mAutoRevokePermissionsMode;
+ final int autoRevokePermissionsMode = installRequest.getAutoRevokePermissionsMode();
permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode);
final ScanResult scanResult = reconciledPkg.mScanResult;
mPm.mPermissionManager.onPackageInstalled(pkg, scanResult.mPreviousAppId,
permissionParamsBuilder.build(), userId);
// Apply restricted settings on potentially dangerous packages.
- if (installArgs.mPackageSource == PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE
- || installArgs.mPackageSource
+ if (installRequest.getPackageSource() == PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE
+ || installRequest.getPackageSource()
== PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE) {
enableRestrictedSettings(pkgName, pkg.getUid());
}
}
- res.mName = pkgName;
- res.mUid = pkg.getUid();
- res.mPkg = pkg;
- res.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
+ installRequest.setName(pkgName);
+ installRequest.setUid(pkg.getUid());
+ installRequest.setPkg(pkg);
+ installRequest.setReturnCode(PackageManager.INSTALL_SUCCEEDED);
//to update install status
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "writeSettings");
mPm.writeSettingsLPrTEMP();
@@ -2252,13 +2254,13 @@ final class InstallPackageHelper {
// can be used for optimizations.
mArtManagerService.prepareAppProfiles(
pkg,
- mPm.resolveUserIds(reconciledPkg.mInstallArgs.mUser.getIdentifier()),
+ mPm.resolveUserIds(reconciledPkg.mInstallRequest.getUserId()),
/* updateReferenceProfileContent= */ true);
// Compute the compilation reason from the installation scenario.
final int compilationReason =
mDexManager.getCompilationReasonForInstallScenario(
- reconciledPkg.mInstallArgs.mInstallScenario);
+ reconciledPkg.mInstallRequest.getInstallScenario());
// Construct the DexoptOptions early to see if we should skip running dexopt.
//
@@ -2267,8 +2269,9 @@ final class InstallPackageHelper {
//
// Also, don't fail application installs if the dexopt step fails.
final boolean isBackupOrRestore =
- reconciledPkg.mInstallArgs.mInstallReason == INSTALL_REASON_DEVICE_RESTORE
- || reconciledPkg.mInstallArgs.mInstallReason
+ reconciledPkg.mInstallRequest.getInstallReason()
+ == INSTALL_REASON_DEVICE_RESTORE
+ || reconciledPkg.mInstallRequest.getInstallReason()
== INSTALL_REASON_DEVICE_SETUP;
final int dexoptFlags = DexoptOptions.DEXOPT_BOOT_COMPLETE
@@ -2580,35 +2583,31 @@ final class InstallPackageHelper {
}
}
- void handlePackagePostInstall(PackageInstalledInfo res, InstallArgs installArgs,
- boolean launchedForRestore) {
+ void handlePackagePostInstall(InstallRequest request, boolean launchedForRestore) {
final boolean killApp =
- (installArgs.mInstallFlags & PackageManager.INSTALL_DONT_KILL_APP) == 0;
+ (request.getInstallFlags() & PackageManager.INSTALL_DONT_KILL_APP) == 0;
final boolean virtualPreload =
- ((installArgs.mInstallFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);
- final String installerPackage = installArgs.mInstallSource.installerPackageName;
- final IPackageInstallObserver2 installObserver = installArgs.mObserver;
- final int dataLoaderType = installArgs.mDataLoaderType;
- final boolean succeeded = res.mReturnCode == PackageManager.INSTALL_SUCCEEDED;
- final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null;
- final String packageName = res.mName;
+ ((request.getInstallFlags() & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);
+ final String installerPackage = request.getInstallerPackageName();
+ final int dataLoaderType = request.getDataLoaderType();
+ final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED;
+ final boolean update = request.isUpdate();
+ final String packageName = request.getName();
final PackageStateInternal pkgSetting =
succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null;
final boolean removedBeforeUpdate = (pkgSetting == null)
|| (pkgSetting.isSystem() && !pkgSetting.getPath().getPath().equals(
- res.mPkg.getPath()));
+ request.getPkg().getPath()));
if (succeeded && removedBeforeUpdate) {
Slog.e(TAG, packageName + " was removed before handlePackagePostInstall "
+ "could be executed");
- res.mReturnCode = INSTALL_FAILED_PACKAGE_CHANGED;
- res.mReturnMsg = "Package was removed before install could complete.";
+ request.setReturnCode(INSTALL_FAILED_PACKAGE_CHANGED);
+ request.setReturnMessage("Package was removed before install could complete.");
// Remove the update failed package's older resources safely now
- InstallArgs args = res.mRemovedInfo != null ? res.mRemovedInfo.mArgs : null;
- if (args != null) {
- mRemovePackageHelper.cleanUpResources(args);
- }
- mPm.notifyInstallObserver(res, installObserver);
+ mRemovePackageHelper.cleanUpResources(request.getOldCodeFile(),
+ request.getOldInstructionSet());
+ mPm.notifyInstallObserver(request);
return;
}
@@ -2617,28 +2616,31 @@ final class InstallPackageHelper {
mPm.mPerUidReadTimeoutsCache = null;
// Send the removed broadcasts
- if (res.mRemovedInfo != null) {
- if (res.mRemovedInfo.mIsExternal) {
+ if (request.getRemovedInfo() != null) {
+ if (request.getRemovedInfo().mIsExternal) {
if (DEBUG_INSTALL) {
- Slog.i(TAG, "upgrading pkg " + res.mRemovedInfo.mRemovedPackage
+ Slog.i(TAG, "upgrading pkg " + request.getRemovedInfo().mRemovedPackage
+ " is ASEC-hosted -> UNAVAILABLE");
}
- final String[] pkgNames = new String[]{res.mRemovedInfo.mRemovedPackage};
- final int[] uids = new int[]{res.mRemovedInfo.mUid};
+ final String[] pkgNames = new String[]{
+ request.getRemovedInfo().mRemovedPackage};
+ final int[] uids = new int[]{request.getRemovedInfo().mUid};
mBroadcastHelper.sendResourcesChangedBroadcast(mPm::snapshotComputer,
false /* mediaStatus */, true /* replacing */, pkgNames, uids);
}
- res.mRemovedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/);
+ request.getRemovedInfo().sendPackageRemovedBroadcasts(
+ killApp, false /*removedBySystem*/);
}
final String installerPackageName =
- res.mInstallerPackageName != null
- ? res.mInstallerPackageName
- : res.mRemovedInfo != null
- ? res.mRemovedInfo.mInstallerPackageName
+ request.getInstallerPackageName() != null
+ ? request.getInstallerPackageName()
+ : request.getRemovedInfo() != null
+ ? request.getRemovedInfo().mInstallerPackageName
: null;
- mPm.notifyInstantAppPackageInstalled(res.mPkg.getPackageName(), res.mNewUsers);
+ mPm.notifyInstantAppPackageInstalled(request.getPkg().getPackageName(),
+ request.getNewUsers());
// Determine the set of users who are adding this package for
// the first time vs. those who are seeing an update.
@@ -2646,8 +2648,9 @@ final class InstallPackageHelper {
int[] firstInstantUserIds = EMPTY_INT_ARRAY;
int[] updateUserIds = EMPTY_INT_ARRAY;
int[] instantUserIds = EMPTY_INT_ARRAY;
- final boolean allNewUsers = res.mOrigUsers == null || res.mOrigUsers.length == 0;
- for (int newUser : res.mNewUsers) {
+ final boolean allNewUsers = request.getOriginUsers() == null
+ || request.getOriginUsers().length == 0;
+ for (int newUser : request.getNewUsers()) {
final boolean isInstantApp = pkgSetting.getUserStateOrDefault(newUser)
.isInstantApp();
if (allNewUsers) {
@@ -2659,7 +2662,7 @@ final class InstallPackageHelper {
continue;
}
boolean isNew = true;
- for (int origUser : res.mOrigUsers) {
+ for (int origUser : request.getOriginUsers()) {
if (origUser == newUser) {
isNew = false;
break;
@@ -2681,20 +2684,20 @@ final class InstallPackageHelper {
}
// Send installed broadcasts if the package is not a static shared lib.
- if (res.mPkg.getStaticSharedLibName() == null) {
- mPm.mProcessLoggingHandler.invalidateBaseApkHash(res.mPkg.getBaseApkPath());
+ if (request.getPkg().getStaticSharedLibName() == null) {
+ mPm.mProcessLoggingHandler.invalidateBaseApkHash(request.getPkg().getBaseApkPath());
// Send added for users that see the package for the first time
// sendPackageAddedForNewUsers also deals with system apps
- int appId = UserHandle.getAppId(res.mUid);
- boolean isSystem = res.mPkg.isSystem();
+ int appId = UserHandle.getAppId(request.getUid());
+ boolean isSystem = request.getPkg().isSystem();
mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName,
isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId,
firstUserIds, firstInstantUserIds, dataLoaderType);
// Send added for users that don't see the package for the first time
Bundle extras = new Bundle();
- extras.putInt(Intent.EXTRA_UID, res.mUid);
+ extras.putInt(Intent.EXTRA_UID, request.getUid());
if (update) {
extras.putBoolean(Intent.EXTRA_REPLACING, true);
}
@@ -2743,8 +2746,8 @@ final class InstallPackageHelper {
mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED,
packageName, extras, 0 /*flags*/,
null /*targetPackage*/, null /*finishedReceiver*/,
- updateUserIds, instantUserIds, res.mRemovedInfo.mBroadcastAllowList,
- null);
+ updateUserIds, instantUserIds,
+ request.getRemovedInfo().mBroadcastAllowList, null);
if (installerPackageName != null) {
mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName,
extras, 0 /*flags*/,
@@ -2768,7 +2771,7 @@ final class InstallPackageHelper {
null /*broadcastAllowList*/,
mBroadcastHelper.getTemporaryAppAllowlistBroadcastOptions(
REASON_PACKAGE_REPLACED).toBundle());
- } else if (launchedForRestore && !res.mPkg.isSystem()) {
+ } else if (launchedForRestore && !request.getPkg().isSystem()) {
// First-install and we did a restore, so we're responsible for the
// first-launch broadcast.
if (DEBUG_BACKUP) {
@@ -2780,17 +2783,17 @@ final class InstallPackageHelper {
}
// Send broadcast package appeared if external for all users
- if (res.mPkg.isExternalStorage()) {
+ if (request.getPkg().isExternalStorage()) {
if (!update) {
final StorageManager storageManager =
mInjector.getSystemService(StorageManager.class);
VolumeInfo volume =
storageManager.findVolumeByUuid(
StorageManager.convert(
- res.mPkg.getVolumeUuid()).toString());
+ request.getPkg().getVolumeUuid()).toString());
int packageExternalStorageType =
PackageManagerServiceUtils.getPackageExternalStorageType(volume,
- res.mPkg.isExternalStorage());
+ request.getPkg().isExternalStorage());
// If the package was installed externally, log it.
if (packageExternalStorageType != StorageEnums.UNKNOWN) {
FrameworkStatsLog.write(
@@ -2799,19 +2802,20 @@ final class InstallPackageHelper {
}
}
if (DEBUG_INSTALL) {
- Slog.i(TAG, "upgrading pkg " + res.mPkg + " is external");
+ Slog.i(TAG, "upgrading pkg " + request.getPkg() + " is external");
}
final String[] pkgNames = new String[]{packageName};
- final int[] uids = new int[]{res.mPkg.getUid()};
+ final int[] uids = new int[]{request.getPkg().getUid()};
mBroadcastHelper.sendResourcesChangedBroadcast(mPm::snapshotComputer,
true /* mediaStatus */, true /* replacing */, pkgNames, uids);
}
- } else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib
+ } else if (!ArrayUtils.isEmpty(request.getLibraryConsumers())) { // if static shared lib
// No need to kill consumers if it's installation of new version static shared lib.
final Computer snapshot = mPm.snapshotComputer();
- final boolean dontKillApp = !update && res.mPkg.getStaticSharedLibName() != null;
- for (int i = 0; i < res.mLibraryConsumers.size(); i++) {
- AndroidPackage pkg = res.mLibraryConsumers.get(i);
+ final boolean dontKillApp = !update
+ && request.getPkg().getStaticSharedLibName() != null;
+ for (int i = 0; i < request.getLibraryConsumers().size(); i++) {
+ AndroidPackage pkg = request.getLibraryConsumers().get(i);
// send broadcast that all consumers of the static shared library have changed
mPm.sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp,
new ArrayList<>(Collections.singletonList(pkg.getPackageName())),
@@ -2828,9 +2832,9 @@ final class InstallPackageHelper {
}
if (allNewUsers && !update) {
- mPm.notifyPackageAdded(packageName, res.mUid);
+ mPm.notifyPackageAdded(packageName, request.getUid());
} else {
- mPm.notifyPackageChanged(packageName, res.mUid);
+ mPm.notifyPackageChanged(packageName, request.getUid());
}
// Log current value of "unknown sources" setting
@@ -2838,7 +2842,8 @@ final class InstallPackageHelper {
getUnknownSourcesSettings());
// Remove the replaced package's older resources safely now
- InstallArgs args = res.mRemovedInfo != null ? res.mRemovedInfo.mArgs : null;
+ InstallArgs args = request.getRemovedInfo() != null
+ ? request.getRemovedInfo().mArgs : null;
if (args != null) {
if (!killApp) {
// If we didn't kill the app, defer the deletion of code/resource files, since
@@ -2847,7 +2852,7 @@ final class InstallPackageHelper {
// ApplicationInfo changes have propagated to all application threads.
mPm.scheduleDeferredNoKillPostDelete(args);
} else {
- mRemovePackageHelper.cleanUpResources(args);
+ mRemovePackageHelper.cleanUpResources(args.mCodeFile, args.mInstructionSets);
}
} else {
// Force a gc to clear up things. Ask for a background one, it's fine to go on
@@ -2874,21 +2879,21 @@ final class InstallPackageHelper {
final boolean deferInstallObserver = succeeded && update;
if (deferInstallObserver) {
if (killApp) {
- mPm.scheduleDeferredPendingKillInstallObserver(res, installObserver);
+ mPm.scheduleDeferredPendingKillInstallObserver(request);
} else {
- mPm.scheduleDeferredNoKillInstallObserver(res, installObserver);
+ mPm.scheduleDeferredNoKillInstallObserver(request);
}
} else {
- mPm.notifyInstallObserver(res, installObserver);
+ mPm.notifyInstallObserver(request);
}
// Prune unused static shared libraries which have been cached a period of time
mPm.schedulePruneUnusedStaticSharedLibraries(true /* delay */);
// Log tracing if needed
- if (installArgs.mTraceMethod != null) {
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, installArgs.mTraceMethod,
- installArgs.mTraceCookie);
+ if (request.getTraceMethod() != null) {
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, request.getTraceMethod(),
+ request.getTraceCookie());
}
}
@@ -3936,10 +3941,10 @@ final class InstallPackageHelper {
+ "; " + pkgSetting.getPathString()
+ " --> " + parsedPackage.getPath());
- final InstallArgs args = new InstallArgs(
- pkgSetting.getPathString(), getAppDexInstructionSets(
- pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()));
- mRemovePackageHelper.cleanUpResources(args);
+ mRemovePackageHelper.cleanUpResources(
+ new File(pkgSetting.getPathString()),
+ getAppDexInstructionSets(pkgSetting.getPrimaryCpuAbi(),
+ pkgSetting.getSecondaryCpuAbi()));
synchronized (mPm.mLock) {
mPm.mSettings.enableSystemPackageLPw(pkgSetting.getPackageName());
}
@@ -4021,10 +4026,9 @@ final class InstallPackageHelper {
+ parsedPackage.getLongVersionCode()
+ "; " + pkgSetting.getPathString() + " --> "
+ parsedPackage.getPath());
- InstallArgs args = new InstallArgs(
- pkgSetting.getPathString(), getAppDexInstructionSets(
- pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()));
- mRemovePackageHelper.cleanUpResources(args);
+ mRemovePackageHelper.cleanUpResources(new File(pkgSetting.getPathString()),
+ getAppDexInstructionSets(
+ pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()));
} else {
// The application on /system is older than the application on /data. Hide
// the application on /system and the version on /data will be scanned later
diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java
index 753d012a32e3..36bbf41bffe6 100644
--- a/services/core/java/com/android/server/pm/InstallRequest.java
+++ b/services/core/java/com/android/server/pm/InstallRequest.java
@@ -16,12 +16,389 @@
package com.android.server.pm;
+import static android.content.pm.PackageManager.INSTALL_REASON_UNKNOWN;
+import static android.content.pm.PackageManager.INSTALL_SCENARIO_DEFAULT;
+
+import static com.android.server.pm.PackageManagerService.TAG;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.apex.ApexInfo;
+import android.app.AppOpsManager;
+import android.content.pm.DataLoaderType;
+import android.content.pm.IPackageInstallObserver2;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.SigningDetails;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.util.ExceptionUtils;
+import android.util.Slog;
+
+import com.android.server.pm.pkg.AndroidPackage;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
final class InstallRequest {
- public final InstallArgs mArgs;
- public final PackageInstalledInfo mInstallResult;
+ private final int mUserId;
+ @Nullable
+ private final InstallArgs mInstallArgs;
+ @NonNull
+ private final PackageInstalledInfo mInstalledInfo;
+ @Nullable
+ private Runnable mPostInstallRunnable;
+ @Nullable
+ private PackageRemovedInfo mRemovedInfo;
+
+ // New install
+ InstallRequest(InstallingSession params) {
+ mUserId = params.getUser().getIdentifier();
+ mInstallArgs = new InstallArgs(params.mOriginInfo, params.mMoveInfo, params.mObserver,
+ params.mInstallFlags, params.mInstallSource, params.mVolumeUuid,
+ params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride,
+ params.mGrantedRuntimePermissions, params.mAllowlistedRestrictedPermissions,
+ params.mAutoRevokePermissionsMode,
+ params.mTraceMethod, params.mTraceCookie, params.mSigningDetails,
+ params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride,
+ params.mDataLoaderType, params.mPackageSource);
+ mInstalledInfo = new PackageInstalledInfo();
+ }
+
+ // Install existing package as user
+ InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers,
+ Runnable runnable) {
+ mUserId = userId;
+ mInstallArgs = null;
+ mInstalledInfo = new PackageInstalledInfo();
+ mInstalledInfo.mReturnCode = returnCode;
+ mInstalledInfo.mPkg = pkg;
+ mInstalledInfo.mNewUsers = newUsers;
+ mPostInstallRunnable = runnable;
+ }
+
+ private static class PackageInstalledInfo {
+ String mName;
+ int mUid = -1;
+ // The set of users that originally had this package installed.
+ int[] mOrigUsers;
+ // The set of users that now have this package installed.
+ int[] mNewUsers;
+ AndroidPackage mPkg;
+ int mReturnCode;
+ String mReturnMsg;
+ String mInstallerPackageName;
+ // The set of packages consuming this shared library or null if no consumers exist.
+ ArrayList<AndroidPackage> mLibraryConsumers;
+ PackageFreezer mFreezer;
+ // In some error cases we want to convey more info back to the observer
+ String mOrigPackage;
+ String mOrigPermission;
+ // The ApexInfo returned by ApexManager#installPackage, used by rebootless APEX install
+ ApexInfo mApexInfo;
+ }
+
+ public String getName() {
+ return mInstalledInfo.mName;
+ }
+
+ public String getReturnMsg() {
+ return mInstalledInfo.mReturnMsg;
+ }
+
+ public OriginInfo getOriginInfo() {
+ return mInstallArgs == null ? null : mInstallArgs.mOriginInfo;
+ }
+
+ public PackageRemovedInfo getRemovedInfo() {
+ return mRemovedInfo;
+ }
+
+ public String getOrigPackage() {
+ return mInstalledInfo.mOrigPackage;
+ }
+
+ public String getOrigPermission() {
+ return mInstalledInfo.mOrigPermission;
+ }
+
+ @Nullable
+ public File getCodeFile() {
+ return mInstallArgs == null ? null : mInstallArgs.mCodeFile;
+ }
+
+ @Nullable
+ public String getCodePath() {
+ return (mInstallArgs != null && mInstallArgs.mCodeFile != null)
+ ? mInstallArgs.mCodeFile.getAbsolutePath() : null;
+ }
+
+ @Nullable
+ public String getAbiOverride() {
+ return mInstallArgs == null ? null : mInstallArgs.mAbiOverride;
+ }
+
+ public int getReturnCode() {
+ return mInstalledInfo.mReturnCode;
+ }
+
+ @Nullable
+ public IPackageInstallObserver2 getObserver() {
+ return mInstallArgs == null ? null : mInstallArgs.mObserver;
+ }
+
+ public boolean isMoveInstall() {
+ return mInstallArgs != null && mInstallArgs.mMoveInfo != null;
+ }
+
+ @Nullable
+ public String getMoveToUuid() {
+ return (mInstallArgs != null && mInstallArgs.mMoveInfo != null)
+ ? mInstallArgs.mMoveInfo.mToUuid : null;
+ }
+
+ @Nullable
+ public String getMovePackageName() {
+ return (mInstallArgs != null && mInstallArgs.mMoveInfo != null)
+ ? mInstallArgs.mMoveInfo.mPackageName : null;
+ }
+
+ @Nullable
+ public String getMoveFromCodePath() {
+ return (mInstallArgs != null && mInstallArgs.mMoveInfo != null)
+ ? mInstallArgs.mMoveInfo.mFromCodePath : null;
+ }
+
+ @Nullable
+ public File getOldCodeFile() {
+ return (mRemovedInfo != null && mRemovedInfo.mArgs != null)
+ ? mRemovedInfo.mArgs.mCodeFile : null;
+ }
+
+ @Nullable
+ public String[] getOldInstructionSet() {
+ return (mRemovedInfo != null && mRemovedInfo.mArgs != null)
+ ? mRemovedInfo.mArgs.mInstructionSets : null;
+ }
+
+ public UserHandle getUser() {
+ return new UserHandle(mUserId);
+ }
+
+ public int getUserId() {
+ return mUserId;
+ }
+
+ public int getInstallFlags() {
+ return mInstallArgs == null ? 0 : mInstallArgs.mInstallFlags;
+ }
+
+ public int getInstallReason() {
+ return mInstallArgs == null ? INSTALL_REASON_UNKNOWN : mInstallArgs.mInstallReason;
+ }
+
+ @Nullable
+ public String getVolumeUuid() {
+ return mInstallArgs == null ? null : mInstallArgs.mVolumeUuid;
+ }
+
+ public AndroidPackage getPkg() {
+ return mInstalledInfo.mPkg;
+ }
+
+ @Nullable
+ public String getTraceMethod() {
+ return mInstallArgs == null ? null : mInstallArgs.mTraceMethod;
+ }
+
+ public int getTraceCookie() {
+ return mInstallArgs == null ? 0 : mInstallArgs.mTraceCookie;
+ }
+
+ public boolean isUpdate() {
+ return mRemovedInfo != null && mRemovedInfo.mRemovedPackage != null;
+ }
+
+ @Nullable
+ public String getRemovedPackage() {
+ return mRemovedInfo != null ? mRemovedInfo.mRemovedPackage : null;
+ }
+
+ public boolean isInstallForExistingUser() {
+ return mInstallArgs == null;
+ }
+
+ @Nullable
+ public InstallSource getInstallSource() {
+ return mInstallArgs == null ? null : mInstallArgs.mInstallSource;
+ }
+
+ @Nullable
+ public String getInstallerPackageName() {
+ return (mInstallArgs != null && mInstallArgs.mInstallSource != null)
+ ? mInstallArgs.mInstallSource.installerPackageName : null;
+ }
+
+ public int getDataLoaderType() {
+ return mInstallArgs == null ? DataLoaderType.NONE : mInstallArgs.mDataLoaderType;
+ }
+
+ public int getSignatureSchemeVersion() {
+ return mInstallArgs == null ? SigningDetails.SignatureSchemeVersion.UNKNOWN
+ : mInstallArgs.mSigningDetails.getSignatureSchemeVersion();
+ }
+
+ @NonNull
+ public SigningDetails getSigningDetails() {
+ return mInstallArgs == null ? SigningDetails.UNKNOWN : mInstallArgs.mSigningDetails;
+ }
+
+ @Nullable
+ public Uri getOriginUri() {
+ return mInstallArgs == null ? null : Uri.fromFile(mInstallArgs.mOriginInfo.mResolvedFile);
+ }
+
+ public ApexInfo getApexInfo() {
+ return mInstalledInfo.mApexInfo;
+ }
+
+ public String getSourceInstallerPackageName() {
+ return mInstallArgs.mInstallSource.installerPackageName;
+ }
+
+ public boolean isRollback() {
+ return mInstallArgs != null
+ && mInstallArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK;
+ }
+
+ public int[] getNewUsers() {
+ return mInstalledInfo.mNewUsers;
+ }
+
+ public int[] getOriginUsers() {
+ return mInstalledInfo.mOrigUsers;
+ }
+
+ public int getUid() {
+ return mInstalledInfo.mUid;
+ }
+
+ @Nullable
+ public String[] getInstallGrantPermissions() {
+ return mInstallArgs == null ? null : mInstallArgs.mInstallGrantPermissions;
+ }
+
+ public ArrayList<AndroidPackage> getLibraryConsumers() {
+ return mInstalledInfo.mLibraryConsumers;
+ }
+
+ @Nullable
+ public List<String> getAllowlistedRestrictedPermissions() {
+ return mInstallArgs == null ? null : mInstallArgs.mAllowlistedRestrictedPermissions;
+ }
+
+ public int getAutoRevokePermissionsMode() {
+ return mInstallArgs == null
+ ? AppOpsManager.MODE_DEFAULT : mInstallArgs.mAutoRevokePermissionsMode;
+ }
+
+ public int getPackageSource() {
+ return mInstallArgs == null
+ ? PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED : mInstallArgs.mPackageSource;
+ }
+
+ public int getInstallScenario() {
+ return mInstallArgs == null ? INSTALL_SCENARIO_DEFAULT : mInstallArgs.mInstallScenario;
+ }
+
+ public boolean isForceQueryableOverride() {
+ return mInstallArgs != null && mInstallArgs.mForceQueryableOverride;
+ }
+
+ public void closeFreezer() {
+ if (mInstalledInfo.mFreezer != null) {
+ mInstalledInfo.mFreezer.close();
+ }
+ }
+
+ public void runPostInstallRunnable() {
+ if (mPostInstallRunnable != null) {
+ mPostInstallRunnable.run();
+ }
+ }
+
+ public void setCodeFile(File codeFile) {
+ if (mInstallArgs != null) {
+ mInstallArgs.mCodeFile = codeFile;
+ }
+ }
+
+ public void setError(int code, String msg) {
+ setReturnCode(code);
+ setReturnMessage(msg);
+ Slog.w(TAG, msg);
+ }
+
+ public void setError(String msg, PackageManagerException e) {
+ mInstalledInfo.mReturnCode = e.error;
+ setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
+ Slog.w(TAG, msg, e);
+ }
+
+ public void setReturnCode(int returnCode) {
+ mInstalledInfo.mReturnCode = returnCode;
+ }
+
+ public void setReturnMessage(String returnMsg) {
+ mInstalledInfo.mReturnMsg = returnMsg;
+ }
+
+ public void setApexInfo(ApexInfo apexInfo) {
+ mInstalledInfo.mApexInfo = apexInfo;
+ }
+
+ public void setPkg(AndroidPackage pkg) {
+ mInstalledInfo.mPkg = pkg;
+ }
+
+ public void setUid(int uid) {
+ mInstalledInfo.mUid = uid;
+ }
+
+ public void setNewUsers(int[] newUsers) {
+ mInstalledInfo.mNewUsers = newUsers;
+ }
+
+ public void setOriginPackage(String originPackage) {
+ mInstalledInfo.mOrigPackage = originPackage;
+ }
+
+ public void setOriginPermission(String originPermission) {
+ mInstalledInfo.mOrigPermission = originPermission;
+ }
+
+ public void setInstallerPackageName(String installerPackageName) {
+ mInstalledInfo.mInstallerPackageName = installerPackageName;
+ }
+
+ public void setName(String packageName) {
+ mInstalledInfo.mName = packageName;
+ }
+
+ public void setOriginUsers(int[] userIds) {
+ mInstalledInfo.mOrigUsers = userIds;
+ }
+
+ public void setFreezer(PackageFreezer freezer) {
+ mInstalledInfo.mFreezer = freezer;
+ }
+
+ public void setRemovedInfo(PackageRemovedInfo removedInfo) {
+ mRemovedInfo = removedInfo;
+ }
- InstallRequest(InstallArgs args, PackageInstalledInfo res) {
- mArgs = args;
- mInstallResult = res;
+ public void setLibraryConsumers(ArrayList<AndroidPackage> libraryConsumers) {
+ mInstalledInfo.mLibraryConsumers = libraryConsumers;
}
}
diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java
index a7f1727dfa61..8d5a5e156e71 100644
--- a/services/core/java/com/android/server/pm/InstallingSession.java
+++ b/services/core/java/com/android/server/pm/InstallingSession.java
@@ -253,68 +253,69 @@ class InstallingSession {
}
private void processPendingInstall() {
- InstallArgs args = new InstallArgs(this);
+ InstallRequest installRequest = new InstallRequest(this);
if (mRet == PackageManager.INSTALL_SUCCEEDED) {
- mRet = copyApk(args);
+ mRet = copyApk(installRequest);
}
if (mRet == PackageManager.INSTALL_SUCCEEDED) {
F2fsUtils.releaseCompressedBlocks(
- mPm.mContext.getContentResolver(), new File(args.getCodePath()));
+ mPm.mContext.getContentResolver(), new File(installRequest.getCodePath()));
}
+ installRequest.setReturnCode(mRet);
if (mParentInstallingSession != null) {
- mParentInstallingSession.tryProcessInstallRequest(args, mRet);
+ mParentInstallingSession.tryProcessInstallRequest(installRequest);
} else {
- PackageInstalledInfo res = new PackageInstalledInfo(mRet);
// Queue up an async operation since the package installation may take a little while.
mPm.mHandler.post(() -> processInstallRequests(
- res.mReturnCode == PackageManager.INSTALL_SUCCEEDED /* success */,
- Collections.singletonList(new InstallRequest(args, res))));
+ mRet == PackageManager.INSTALL_SUCCEEDED /* success */,
+ Collections.singletonList(installRequest)));
}
}
- private int copyApk(InstallArgs args) {
+ private int copyApk(InstallRequest request) {
if (mMoveInfo == null) {
- return copyApkForFileInstall(args);
+ return copyApkForFileInstall(request);
} else {
- return copyApkForMoveInstall(args);
+ return copyApkForMoveInstall(request);
}
}
- private int copyApkForFileInstall(InstallArgs args) {
+ private int copyApkForFileInstall(InstallRequest request) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "copyApk");
try {
if (mOriginInfo.mStaged) {
if (DEBUG_INSTALL) {
Slog.d(TAG, mOriginInfo.mFile + " already staged; skipping copy");
}
- args.mCodeFile = mOriginInfo.mFile;
+ request.setCodeFile(mOriginInfo.mFile);
return PackageManager.INSTALL_SUCCEEDED;
}
try {
final boolean isEphemeral =
(mInstallFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
- args.mCodeFile =
- mPm.mInstallerService.allocateStageDirLegacy(mVolumeUuid, isEphemeral);
+ request.setCodeFile(
+ mPm.mInstallerService.allocateStageDirLegacy(mVolumeUuid, isEphemeral));
} catch (IOException e) {
Slog.w(TAG, "Failed to create copy file: " + e);
return PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
}
int ret = PackageManagerServiceUtils.copyPackage(
- mOriginInfo.mFile.getAbsolutePath(), args.mCodeFile);
+ mOriginInfo.mFile.getAbsolutePath(), request.getCodeFile());
if (ret != PackageManager.INSTALL_SUCCEEDED) {
Slog.e(TAG, "Failed to copy package");
return ret;
}
- final boolean isIncremental = isIncrementalPath(args.mCodeFile.getAbsolutePath());
- final File libraryRoot = new File(args.mCodeFile, LIB_DIR_NAME);
+ final boolean isIncremental = isIncrementalPath(
+ request.getCodeFile().getAbsolutePath());
+ final File libraryRoot = new File(request.getCodeFile(), LIB_DIR_NAME);
NativeLibraryHelper.Handle handle = null;
try {
- handle = NativeLibraryHelper.Handle.create(args.mCodeFile);
+ handle = NativeLibraryHelper.Handle.create(request.getCodeFile());
ret = NativeLibraryHelper.copyNativeBinariesWithOverride(handle, libraryRoot,
- args.mAbiOverride, isIncremental);
+ request.getAbiOverride(), isIncremental);
} catch (IOException e) {
Slog.e(TAG, "Copying native libraries failed", e);
ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
@@ -328,7 +329,7 @@ class InstallingSession {
}
}
- private int copyApkForMoveInstall(InstallArgs args) {
+ private int copyApkForMoveInstall(InstallRequest request) {
if (DEBUG_INSTALL) {
Slog.d(TAG, "Moving " + mMoveInfo.mPackageName + " from "
+ mMoveInfo.mFromUuid + " to " + mMoveInfo.mToUuid);
@@ -345,8 +346,9 @@ class InstallingSession {
}
final String toPathName = new File(mMoveInfo.mFromCodePath).getName();
- args.mCodeFile = new File(Environment.getDataAppDirectory(mMoveInfo.mToUuid), toPathName);
- if (DEBUG_INSTALL) Slog.d(TAG, "codeFile after move is " + args.mCodeFile);
+ request.setCodeFile(
+ new File(Environment.getDataAppDirectory(mMoveInfo.mToUuid), toPathName));
+ if (DEBUG_INSTALL) Slog.d(TAG, "codeFile after move is " + request.getCodeFile());
return PackageManager.INSTALL_SUCCEEDED;
}
@@ -460,7 +462,7 @@ class InstallingSession {
List<InstallRequest> apexInstallRequests = new ArrayList<>();
List<InstallRequest> apkInstallRequests = new ArrayList<>();
for (InstallRequest request : installRequests) {
- if ((request.mArgs.mInstallFlags & PackageManager.INSTALL_APEX) != 0) {
+ if ((request.getInstallFlags() & PackageManager.INSTALL_APEX) != 0) {
apexInstallRequests.add(request);
} else {
apkInstallRequests.add(request);
@@ -485,7 +487,7 @@ class InstallingSession {
// processInstallRequestAsync. In that case just notify the observer about the
// failure.
InstallRequest request = apexInstallRequests.get(0);
- mPm.notifyInstallObserver(request.mInstallResult, request.mArgs.mObserver);
+ mPm.notifyInstallObserver(request);
}
return;
}
@@ -496,28 +498,25 @@ class InstallingSession {
private void processApkInstallRequests(boolean success, List<InstallRequest> installRequests) {
if (success) {
for (InstallRequest request : installRequests) {
- if (request.mInstallResult.mReturnCode != PackageManager.INSTALL_SUCCEEDED) {
- cleanUpForFailedInstall(request.mArgs);
+ if (request.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
+ cleanUpForFailedInstall(request);
}
}
mInstallPackageHelper.installPackagesTraced(installRequests);
for (InstallRequest request : installRequests) {
- doPostInstall(request.mInstallResult.mReturnCode, request.mArgs);
+ doPostInstall(request);
}
}
for (InstallRequest request : installRequests) {
- mInstallPackageHelper.restoreAndPostInstall(request.mArgs.mUser.getIdentifier(),
- request.mInstallResult,
- new PostInstallData(request.mArgs,
- request.mInstallResult, null));
+ mInstallPackageHelper.restoreAndPostInstall(request);
}
}
- private void doPostInstall(int status, InstallArgs args) {
+ private void doPostInstall(InstallRequest request) {
if (mMoveInfo != null) {
- if (status == PackageManager.INSTALL_SUCCEEDED) {
+ if (request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) {
mRemovePackageHelper.cleanUpForMoveInstall(mMoveInfo.mFromUuid,
mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
} else {
@@ -525,18 +524,18 @@ class InstallingSession {
mMoveInfo.mPackageName, mMoveInfo.mFromCodePath);
}
} else {
- if (status != PackageManager.INSTALL_SUCCEEDED) {
- mRemovePackageHelper.removeCodePath(args.mCodeFile);
+ if (request.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
+ mRemovePackageHelper.removeCodePath(request.getCodeFile());
}
}
}
- private void cleanUpForFailedInstall(InstallArgs args) {
- if (args.mMoveInfo != null) {
- mRemovePackageHelper.cleanUpForMoveInstall(args.mMoveInfo.mToUuid,
- args.mMoveInfo.mPackageName, args.mMoveInfo.mFromCodePath);
+ private void cleanUpForFailedInstall(InstallRequest request) {
+ if (request.isMoveInstall()) {
+ mRemovePackageHelper.cleanUpForMoveInstall(request.getMoveToUuid(),
+ request.getMovePackageName(), request.getMoveFromCodePath());
} else {
- mRemovePackageHelper.removeCodePath(args.mCodeFile);
+ mRemovePackageHelper.removeCodePath(request.getCodeFile());
}
}
@@ -560,7 +559,7 @@ class InstallingSession {
InstallRequest request = requests.get(0);
try {
// Should directory scanning logic be moved to ApexManager for better test coverage?
- final File dir = request.mArgs.mOriginInfo.mResolvedFile;
+ final File dir = request.getOriginInfo().mResolvedFile;
final File[] apexes = dir.listFiles();
if (apexes == null) {
throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR,
@@ -580,7 +579,7 @@ class InstallingSession {
// The newly installed APEX will not be reverted even if
// processApkInstallRequests() fails. Need a way to keep info stored in apexd
// and PMS in sync in the face of install failures.
- request.mInstallResult.mApexInfo = apexInfo;
+ request.setApexInfo(apexInfo);
mPm.mHandler.post(() -> processApkInstallRequests(true, requests));
return;
} else {
@@ -588,10 +587,10 @@ class InstallingSession {
}
}
} catch (PackageManagerException e) {
- request.mInstallResult.setError("APEX installation failed", e);
+ request.setError("APEX installation failed", e);
}
PackageManagerService.invalidatePackageInfoCache();
- mPm.notifyInstallObserver(request.mInstallResult, request.mArgs.mObserver);
+ mPm.notifyInstallObserver(request);
}
/**
@@ -600,7 +599,7 @@ class InstallingSession {
*/
private class MultiPackageInstallingSession {
private final List<InstallingSession> mChildInstallingSessions;
- private final Map<InstallArgs, Integer> mCurrentState;
+ private final Map<InstallRequest, Integer> mCurrentState;
@NonNull
final PackageManagerService mPm;
final UserHandle mUser;
@@ -636,8 +635,8 @@ class InstallingSession {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
- public void tryProcessInstallRequest(InstallArgs args, int currentStatus) {
- mCurrentState.put(args, currentStatus);
+ public void tryProcessInstallRequest(InstallRequest request) {
+ mCurrentState.put(request, request.getReturnCode());
if (mCurrentState.size() != mChildInstallingSessions.size()) {
return;
}
@@ -651,9 +650,9 @@ class InstallingSession {
}
}
final List<InstallRequest> installRequests = new ArrayList<>(mCurrentState.size());
- for (Map.Entry<InstallArgs, Integer> entry : mCurrentState.entrySet()) {
- installRequests.add(new InstallRequest(entry.getKey(),
- new PackageInstalledInfo(completeStatus)));
+ for (Map.Entry<InstallRequest, Integer> entry : mCurrentState.entrySet()) {
+ entry.getKey().setReturnCode(completeStatus);
+ installRequests.add(entry.getKey());
}
int finalCompleteStatus = completeStatus;
mPm.mHandler.post(() -> processInstallRequests(
diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java
index 1ea4d629eef2..4e8b0a14ae1d 100644
--- a/services/core/java/com/android/server/pm/PackageHandler.java
+++ b/services/core/java/com/android/server/pm/PackageHandler.java
@@ -89,18 +89,14 @@ final class PackageHandler extends Handler {
case POST_INSTALL: {
if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
- PostInstallData data = mPm.mRunningInstalls.get(msg.arg1);
+ InstallRequest request = mPm.mRunningInstalls.get(msg.arg1);
final boolean didRestore = (msg.arg2 != 0);
mPm.mRunningInstalls.delete(msg.arg1);
- if (data != null && data.res.mFreezer != null) {
- data.res.mFreezer.close();
- }
-
- if (data != null && data.mPostInstallRunnable != null) {
- data.mPostInstallRunnable.run();
- } else if (data != null && data.args != null) {
- mInstallPackageHelper.handlePackagePostInstall(data.res, data.args, didRestore);
+ request.closeFreezer();
+ request.runPostInstallRunnable();
+ if (!request.isInstallForExistingUser()) {
+ mInstallPackageHelper.handlePackagePostInstall(request, didRestore);
} else if (DEBUG_INSTALL) {
// No post-install when we run restore from installExistingPackageForUser
Slog.i(TAG, "Nothing to do for post-install token " + msg.arg1);
@@ -111,7 +107,7 @@ final class PackageHandler extends Handler {
case DEFERRED_NO_KILL_POST_DELETE: {
InstallArgs args = (InstallArgs) msg.obj;
if (args != null) {
- mRemovePackageHelper.cleanUpResources(args);
+ mRemovePackageHelper.cleanUpResources(args.mCodeFile, args.mInstructionSets);
}
} break;
case DEFERRED_NO_KILL_INSTALL_OBSERVER:
diff --git a/services/core/java/com/android/server/pm/PackageInstalledInfo.java b/services/core/java/com/android/server/pm/PackageInstalledInfo.java
deleted file mode 100644
index 247abf3b6685..000000000000
--- a/services/core/java/com/android/server/pm/PackageInstalledInfo.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm;
-
-import static com.android.server.pm.PackageManagerService.TAG;
-
-import android.apex.ApexInfo;
-import android.util.ExceptionUtils;
-import android.util.Slog;
-
-import com.android.server.pm.pkg.AndroidPackage;
-
-import java.util.ArrayList;
-
-final class PackageInstalledInfo {
- String mName;
- int mUid;
- // The set of users that originally had this package installed.
- int[] mOrigUsers;
- // The set of users that now have this package installed.
- int[] mNewUsers;
- AndroidPackage mPkg;
- int mReturnCode;
- String mReturnMsg;
- String mInstallerPackageName;
- PackageRemovedInfo mRemovedInfo;
- // The set of packages consuming this shared library or null if no consumers exist.
- ArrayList<AndroidPackage> mLibraryConsumers;
- PackageFreezer mFreezer;
-
- // In some error cases we want to convey more info back to the observer
- String mOrigPackage;
- String mOrigPermission;
-
- // The ApexInfo returned by ApexManager#installPackage, used by rebootless APEX install
- ApexInfo mApexInfo;
-
- PackageInstalledInfo(int currentStatus) {
- mReturnCode = currentStatus;
- mUid = -1;
- mPkg = null;
- mRemovedInfo = null;
- }
-
- public void setError(int code, String msg) {
- setReturnCode(code);
- setReturnMessage(msg);
- Slog.w(TAG, msg);
- }
-
- public void setError(String msg, PackageManagerException e) {
- mReturnCode = e.error;
- setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e));
- Slog.w(TAG, msg, e);
- }
-
- public void setReturnCode(int returnCode) {
- mReturnCode = returnCode;
- }
-
- private void setReturnMessage(String returnMsg) {
- mReturnMsg = returnMsg;
- }
-}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 259202f86bc9..39a6eb7bee8d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -82,7 +82,6 @@ import android.content.pm.IDexModuleRegisterCallback;
import android.content.pm.IOnChecksumsReadyListener;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageDeleteObserver2;
-import android.content.pm.IPackageInstallObserver2;
import android.content.pm.IPackageLoadingProgressCallback;
import android.content.pm.IPackageManager;
import android.content.pm.IPackageMoveObserver;
@@ -826,10 +825,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Watched(manual = true)
private final ResolveInfo mInstantAppInstallerInfo = new ResolveInfo();
- private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>>
+ private final Map<String, InstallRequest>
mNoKillInstallObservers = Collections.synchronizedMap(new HashMap<>());
- private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>>
+ private final Map<String, InstallRequest>
mPendingKillInstallObservers = Collections.synchronizedMap(new HashMap<>());
// Internal interface for permission manager
@@ -908,7 +907,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// Stores a list of users whose package restrictions file needs to be updated
final ArraySet<Integer> mDirtyUsers = new ArraySet<>();
- final SparseArray<PostInstallData> mRunningInstalls = new SparseArray<>();
+ final SparseArray<InstallRequest> mRunningInstalls = new SparseArray<>();
int mNextInstallToken = 1; // nonzero; will be wrapped back to 1 when ++ overflows
final @NonNull String[] mRequiredVerifierPackages;
@@ -1155,32 +1154,30 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
void notifyInstallObserver(String packageName, boolean killApp) {
- final Pair<PackageInstalledInfo, IPackageInstallObserver2> pair =
+ final InstallRequest installRequest =
killApp ? mPendingKillInstallObservers.remove(packageName)
: mNoKillInstallObservers.remove(packageName);
- if (pair != null) {
- notifyInstallObserver(pair.first, pair.second);
+ if (installRequest != null) {
+ notifyInstallObserver(installRequest);
}
}
- void notifyInstallObserver(PackageInstalledInfo info,
- IPackageInstallObserver2 installObserver) {
- if (installObserver != null) {
+ void notifyInstallObserver(InstallRequest request) {
+ if (request.getObserver() != null) {
try {
- Bundle extras = extrasForInstallResult(info);
- installObserver.onPackageInstalled(info.mName, info.mReturnCode,
- info.mReturnMsg, extras);
+ Bundle extras = extrasForInstallResult(request);
+ request.getObserver().onPackageInstalled(request.getName(),
+ request.getReturnCode(), request.getReturnMsg(), extras);
} catch (RemoteException e) {
Slog.i(TAG, "Observer no longer exists.");
}
}
}
- void scheduleDeferredNoKillInstallObserver(PackageInstalledInfo info,
- IPackageInstallObserver2 observer) {
- String packageName = info.mPkg.getPackageName();
- mNoKillInstallObservers.put(packageName, Pair.create(info, observer));
+ void scheduleDeferredNoKillInstallObserver(InstallRequest request) {
+ String packageName = request.getPkg().getPackageName();
+ mNoKillInstallObservers.put(packageName, request);
Message message = mHandler.obtainMessage(DEFERRED_NO_KILL_INSTALL_OBSERVER, packageName);
mHandler.sendMessageDelayed(message, DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS);
}
@@ -1196,10 +1193,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
delay ? getPruneUnusedSharedLibrariesDelay() : 0);
}
- void scheduleDeferredPendingKillInstallObserver(PackageInstalledInfo info,
- IPackageInstallObserver2 observer) {
- final String packageName = info.mPkg.getPackageName();
- mPendingKillInstallObservers.put(packageName, Pair.create(info, observer));
+ void scheduleDeferredPendingKillInstallObserver(InstallRequest request) {
+ final String packageName = request.getPkg().getPackageName();
+ mPendingKillInstallObservers.put(packageName, request);
final Message message = mHandler.obtainMessage(DEFERRED_PENDING_KILL_INSTALL_OBSERVER,
packageName);
mHandler.sendMessageDelayed(message, DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS);
@@ -1312,21 +1308,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- private static Bundle extrasForInstallResult(PackageInstalledInfo res) {
+ private static Bundle extrasForInstallResult(InstallRequest request) {
Bundle extras = null;
- switch (res.mReturnCode) {
+ switch (request.getReturnCode()) {
case PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION: {
extras = new Bundle();
extras.putString(PackageManager.EXTRA_FAILURE_EXISTING_PERMISSION,
- res.mOrigPermission);
+ request.getOrigPermission());
extras.putString(PackageManager.EXTRA_FAILURE_EXISTING_PACKAGE,
- res.mOrigPackage);
+ request.getOrigPackage());
break;
}
case PackageManager.INSTALL_SUCCEEDED: {
extras = new Bundle();
extras.putBoolean(Intent.EXTRA_REPLACING,
- res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null);
+ request.getRemovedInfo() != null
+ && request.getRemovedInfo().mRemovedPackage != null);
break;
}
}
@@ -3111,14 +3108,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// state for observers to see the FIRST_LAUNCH signal.
mHandler.post(() -> {
for (int i = 0; i < mRunningInstalls.size(); i++) {
- final PostInstallData data = mRunningInstalls.valueAt(i);
- if (data.res.mReturnCode != PackageManager.INSTALL_SUCCEEDED) {
+ final InstallRequest installRequest = mRunningInstalls.valueAt(i);
+ if (installRequest.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
continue;
}
- if (packageName.equals(data.res.mPkg.getPackageName())) {
+ if (packageName.equals(installRequest.getPkg().getPackageName())) {
// right package; but is it for the right user?
- for (int uIndex = 0; uIndex < data.res.mNewUsers.length; uIndex++) {
- if (userId == data.res.mNewUsers[uIndex]) {
+ for (int uIndex = 0; uIndex < installRequest.getNewUsers().length; uIndex++) {
+ if (userId == installRequest.getNewUsers()[uIndex]) {
if (DEBUG_BACKUP) {
Slog.i(TAG, "Package " + packageName
+ " being restored so deferring FIRST_LAUNCH");
diff --git a/services/core/java/com/android/server/pm/PackageRemovedInfo.java b/services/core/java/com/android/server/pm/PackageRemovedInfo.java
index 28ad4b61d8c7..3c863d080d79 100644
--- a/services/core/java/com/android/server/pm/PackageRemovedInfo.java
+++ b/services/core/java/com/android/server/pm/PackageRemovedInfo.java
@@ -28,6 +28,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.PowerExemptionManager;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;
@@ -42,8 +43,8 @@ final class PackageRemovedInfo {
int[] mRemovedUsers = null;
int[] mBroadcastUsers = null;
int[] mInstantUserIds = null;
- SparseArray<Integer> mInstallReasons;
- SparseArray<Integer> mUninstallReasons;
+ SparseIntArray mInstallReasons;
+ SparseIntArray mUninstallReasons;
boolean mIsRemovedPackageSystemUpdate = false;
boolean mIsUpdate;
boolean mDataRemoved;
diff --git a/services/core/java/com/android/server/pm/PostInstallData.java b/services/core/java/com/android/server/pm/PostInstallData.java
deleted file mode 100644
index 65d2a659bb45..000000000000
--- a/services/core/java/com/android/server/pm/PostInstallData.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-
-/**
- * Record-keeping of restore-after-install operations that are currently in flight
- * between the Package Manager and the Backup Manager
- */
-public final class PostInstallData {
- @Nullable
- public final InstallArgs args;
- @NonNull
- public final PackageInstalledInfo res;
- @Nullable
- public final Runnable mPostInstallRunnable;
-
- PostInstallData(@Nullable InstallArgs args, @NonNull PackageInstalledInfo res,
- @Nullable Runnable postInstallRunnable) {
- this.args = args;
- this.res = res;
- mPostInstallRunnable = postInstallRunnable;
- }
-}
diff --git a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
index 0f7c6526da17..165b450ce65b 100644
--- a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
+++ b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
@@ -77,11 +77,10 @@ final class ReconcilePackageUtils {
}
// the following may be null if we're just reconciling on boot (and not during install)
- final InstallArgs installArgs = request.mInstallArgs.get(installPackageName);
- final PackageInstalledInfo res = request.mInstallResults.get(installPackageName);
+ final InstallRequest installRequest = request.mInstallRequests.get(installPackageName);
final PrepareResult prepareResult = request.mPreparedPackages.get(installPackageName);
- final boolean isInstall = installArgs != null;
- if (isInstall && (res == null || prepareResult == null)) {
+ final boolean isInstall = installRequest != null;
+ if (isInstall && prepareResult == null) {
throw new ReconcileFailure("Reconcile arguments are not balanced for "
+ installPackageName + "!");
}
@@ -92,7 +91,8 @@ final class ReconcilePackageUtils {
final boolean killApp = (scanResult.mRequest.mScanFlags & SCAN_DONT_KILL_APP) == 0;
final int deleteFlags = PackageManager.DELETE_KEEP_DATA
| (killApp ? 0 : PackageManager.DELETE_DONT_KILL_APP);
- deletePackageAction = DeletePackageHelper.mayDeletePackageLocked(res.mRemovedInfo,
+ deletePackageAction = DeletePackageHelper.mayDeletePackageLocked(
+ installRequest.getRemovedInfo(),
prepareResult.mOriginalPs, prepareResult.mDisabledPs,
deleteFlags, null /* all users */);
if (deletePackageAction == null) {
@@ -146,8 +146,8 @@ final class ReconcilePackageUtils {
request.mVersionInfos.get(installPackageName);
final boolean compareCompat = isCompatSignatureUpdateNeeded(versionInfo);
final boolean compareRecover = isRecoverSignatureUpdateNeeded(versionInfo);
- final boolean isRollback = installArgs != null
- && installArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK;
+ final boolean isRollback = installRequest != null
+ && installRequest.isRollback();
final boolean compatMatch =
PackageManagerServiceUtils.verifySignatures(signatureCheckPs,
sharedUserSetting, disabledPkgSetting,
@@ -257,8 +257,8 @@ final class ReconcilePackageUtils {
}
result.put(installPackageName,
- new ReconciledPackage(request, installArgs, scanResult.mPkgSetting,
- res, request.mPreparedPackages.get(installPackageName), scanResult,
+ new ReconciledPackage(request, installRequest, scanResult.mPkgSetting,
+ request.mPreparedPackages.get(installPackageName), scanResult,
deletePackageAction, allowedSharedLibInfos, signingDetails,
sharedUserSignaturesChanged, removeAppKeySetData));
}
diff --git a/services/core/java/com/android/server/pm/ReconcileRequest.java b/services/core/java/com/android/server/pm/ReconcileRequest.java
index 84b292ff4068..3568c153de91 100644
--- a/services/core/java/com/android/server/pm/ReconcileRequest.java
+++ b/services/core/java/com/android/server/pm/ReconcileRequest.java
@@ -34,20 +34,17 @@ final class ReconcileRequest {
public final Map<String, ScanResult> mScannedPackages;
public final Map<String, AndroidPackage> mAllPackages;
- public final Map<String, InstallArgs> mInstallArgs;
- public final Map<String, PackageInstalledInfo> mInstallResults;
+ public final Map<String, InstallRequest> mInstallRequests;
public final Map<String, PrepareResult> mPreparedPackages;
public final Map<String, Settings.VersionInfo> mVersionInfos;
ReconcileRequest(Map<String, ScanResult> scannedPackages,
- Map<String, InstallArgs> installArgs,
- Map<String, PackageInstalledInfo> installResults,
+ Map<String, InstallRequest> installRequests,
Map<String, PrepareResult> preparedPackages,
Map<String, AndroidPackage> allPackages,
Map<String, Settings.VersionInfo> versionInfos) {
mScannedPackages = scannedPackages;
- mInstallArgs = installArgs;
- mInstallResults = installResults;
+ mInstallRequests = installRequests;
mPreparedPackages = preparedPackages;
mAllPackages = allPackages;
mVersionInfos = versionInfos;
@@ -56,7 +53,7 @@ final class ReconcileRequest {
ReconcileRequest(Map<String, ScanResult> scannedPackages,
Map<String, AndroidPackage> allPackages,
Map<String, Settings.VersionInfo> versionInfos) {
- this(scannedPackages, Collections.emptyMap(), Collections.emptyMap(),
+ this(scannedPackages, Collections.emptyMap(),
Collections.emptyMap(), allPackages, versionInfos);
}
}
diff --git a/services/core/java/com/android/server/pm/ReconciledPackage.java b/services/core/java/com/android/server/pm/ReconciledPackage.java
index 3bb5a1b66338..d4da6c798b15 100644
--- a/services/core/java/com/android/server/pm/ReconciledPackage.java
+++ b/services/core/java/com/android/server/pm/ReconciledPackage.java
@@ -37,9 +37,8 @@ final class ReconciledPackage {
public final PackageSetting mPkgSetting;
public final ScanResult mScanResult;
// TODO: Remove install-specific details from the reconcile result
- public final PackageInstalledInfo mInstallResult;
@Nullable public final PrepareResult mPrepareResult;
- @Nullable public final InstallArgs mInstallArgs;
+ @Nullable public final InstallRequest mInstallRequest;
public final DeletePackageAction mDeletePackageAction;
public final List<SharedLibraryInfo> mAllowedSharedLibraryInfos;
public final SigningDetails mSigningDetails;
@@ -48,9 +47,8 @@ final class ReconciledPackage {
public final boolean mRemoveAppKeySetData;
ReconciledPackage(ReconcileRequest request,
- InstallArgs installArgs,
+ InstallRequest installRequest,
PackageSetting pkgSetting,
- PackageInstalledInfo installResult,
PrepareResult prepareResult,
ScanResult scanResult,
DeletePackageAction deletePackageAction,
@@ -59,9 +57,8 @@ final class ReconciledPackage {
boolean sharedUserSignaturesChanged,
boolean removeAppKeySetData) {
mRequest = request;
- mInstallArgs = installArgs;
+ mInstallRequest = installRequest;
mPkgSetting = pkgSetting;
- mInstallResult = installResult;
mPrepareResult = prepareResult;
mScanResult = scanResult;
mDeletePackageAction = deletePackageAction;
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index a02596538627..55d4b369632e 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -385,29 +385,29 @@ final class RemovePackageHelper {
}
}
- void cleanUpResources(InstallArgs args) {
+ void cleanUpResources(File codeFile, String[] instructionSets) {
synchronized (mPm.mInstallLock) {
- cleanUpResourcesLI(args);
+ cleanUpResourcesLI(codeFile, instructionSets);
}
}
// Need installer lock especially for dex file removal.
@GuardedBy("mPm.mInstallLock")
- private void cleanUpResourcesLI(InstallArgs args) {
+ private void cleanUpResourcesLI(File codeFile, String[] instructionSets) {
// Try enumerating all code paths before deleting
List<String> allCodePaths = Collections.EMPTY_LIST;
- if (args.mCodeFile != null && args.mCodeFile.exists()) {
+ if (codeFile != null && codeFile.exists()) {
final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing();
final ParseResult<PackageLite> result = ApkLiteParseUtils.parsePackageLite(
- input.reset(), args.mCodeFile, /* flags */ 0);
+ input.reset(), codeFile, /* flags */ 0);
if (result.isSuccess()) {
// Ignore error; we tried our best
allCodePaths = result.getResult().getAllApkPaths();
}
}
- removeCodePathLI(args.mCodeFile);
- removeDexFilesLI(allCodePaths, args.mInstructionSets);
+ removeCodePathLI(codeFile);
+ removeDexFilesLI(allCodePaths, instructionSets);
}
@GuardedBy("mPm.mInstallLock")