diff options
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") |