summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TYM Tsai <tymtsai@google.com> 2024-10-22 17:40:51 +0800
committer TYM Tsai <tymtsai@google.com> 2024-10-23 11:13:33 +0800
commitcfa6252c6383e3239262d7e94d7c3399bad1efc0 (patch)
tree8e1e1fa9183d6013c7063a5344ee642de34f8f73
parent2d60b51244dd2092f74f86212f24e0d7842bd026 (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
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java15
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java3
-rw-r--r--services/core/java/com/android/server/pm/InstallRequest.java10
-rw-r--r--services/core/java/com/android/server/pm/RemovePackageHelper.java10
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) {