diff options
| author | 2024-10-22 17:40:51 +0800 | |
|---|---|---|
| committer | 2024-10-23 11:13:33 +0800 | |
| commit | cfa6252c6383e3239262d7e94d7c3399bad1efc0 (patch) | |
| tree | 8e1e1fa9183d6013c7063a5344ee642de34f8f73 | |
| parent | 2d60b51244dd2092f74f86212f24e0d7842bd026 (diff) | |
Keeps art profile for pre-dexopt
When pre-dexopt, the profile is created before commit install package. There are also
clear app data and the profile during commiting. So add a flag to avoid
to delete the profile for pre-dexopt.
Bug: 321139675
Flag: android.content.pm.improve_install_freeze
Test: atest CtsStorageHostTestCases:android.appsecurity.cts.StorageHostTest#testVerifyStatsByDataType
Test: atest CtsPackageManagerTestCases
Test: atest CtsInstallHostTestCases
Test: atest CtsCompilationTestCases
Change-Id: If22165407f5edf11d383d169ea02a6c853f3e19e
4 files changed, 27 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 8398ffc75f0d..f6e518a4fed7 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -397,7 +397,7 @@ final class DeletePackageHelper { try { executeDeletePackageLIF(action, packageName, deleteCodeAndResources, - allUserHandles, writeSettings); + allUserHandles, writeSettings, /* keepArtProfile= */ false); } catch (SystemDeleteException e) { if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageLI: system deletion failure", e); return false; @@ -433,11 +433,11 @@ final class DeletePackageHelper { } public void executeDeletePackage(DeletePackageAction action, String packageName, - boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings) - throws SystemDeleteException { + boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings, + boolean keepArtProfile) throws SystemDeleteException { try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) { executeDeletePackageLIF(action, packageName, deleteCodeAndResources, allUserHandles, - writeSettings); + writeSettings, keepArtProfile); } } @@ -445,11 +445,14 @@ final class DeletePackageHelper { @GuardedBy("mPm.mInstallLock") private void executeDeletePackageLIF(DeletePackageAction action, String packageName, boolean deleteCodeAndResources, - @NonNull int[] allUserHandles, boolean writeSettings) throws SystemDeleteException { + @NonNull int[] allUserHandles, boolean writeSettings, boolean keepArtProfile) + throws SystemDeleteException { final PackageSetting ps = action.mDeletingPs; final PackageRemovedInfo outInfo = action.mRemovedInfo; final UserHandle user = action.mUser; - final int flags = action.mFlags; + final int flags = + keepArtProfile ? action.mFlags | Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES + : action.mFlags; final boolean systemApp = PackageManagerServiceUtils.isSystemApp(ps); // We need to get the permission state before package state is (potentially) destroyed. diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 83292b775ddc..355184e1c758 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1101,6 +1101,7 @@ final class InstallPackageHelper { request.setError(e.error, e.getMessage()); return; } + request.setKeepArtProfile(true); DexOptHelper.performDexoptIfNeeded(request, mDexManager, mContext, null); } } @@ -2406,7 +2407,7 @@ final class InstallPackageHelper { // Settings will be written during the call to updateSettingsLI(). mDeletePackageHelper.executeDeletePackage( reconciledPkg.mDeletePackageAction, packageName, - true, allUsers, false); + true, allUsers, false, installRequest.isKeepArtProfile()); } catch (SystemDeleteException e) { if (mPm.mIsEngBuild) { throw new RuntimeException("Unexpected failure", e); diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index 089bbb7b0022..b0fe3a97af6e 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -169,6 +169,8 @@ final class InstallRequest { private final boolean mHasAppMetadataFileFromInstaller; + private boolean mKeepArtProfile = false; + // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); @@ -1059,4 +1061,12 @@ final class InstallRequest { mPackageMetrics.onStepFinished(PackageMetrics.STEP_FREEZE_INSTALL); } } + + void setKeepArtProfile(boolean keepArtProfile) { + mKeepArtProfile = keepArtProfile; + } + + boolean isKeepArtProfile() { + return mKeepArtProfile; + } } diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index f9a8968b8ad6..f01a74e8d60d 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -258,9 +258,10 @@ final class RemovePackageHelper { */ public void clearPackageStateForUserLIF(PackageSetting ps, int userId, int flags) { final String packageName = ps.getPackageName(); - // Step 1: always destroy app profiles. - mAppDataHelper.destroyAppProfilesLIF(packageName); - + // Step 1: always destroy app profiles except when explicitly preserved + if ((flags & Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES) == 0) { + mAppDataHelper.destroyAppProfilesLIF(packageName); + } final AndroidPackage pkg; final SharedUserSetting sus; synchronized (mPm.mLock) { @@ -277,7 +278,8 @@ final class RemovePackageHelper { resolvedPkg = PackageImpl.buildFakeForDeletion(packageName, ps.getVolumeUuid()); } - int appDataDeletionFlags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL; + int appDataDeletionFlags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL + | (flags & Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES); // Personal data is preserved if the DELETE_KEEP_DATA flag is on if ((flags & PackageManager.DELETE_KEEP_DATA) != 0) { if ((flags & PackageManager.DELETE_ARCHIVE) != 0) { |