diff options
| author | 2023-12-07 03:40:50 +0000 | |
|---|---|---|
| committer | 2023-12-07 03:40:50 +0000 | |
| commit | a9aedbf0ff1f0e2d03fce94750de91c11314e7d2 (patch) | |
| tree | 0e9b37b85816c22a754220321abf8f0a5d8985c9 | |
| parent | 4dfa961668583aa8d98c2b5d0e7444abddc8e86b (diff) | |
| parent | 9e5fabe814fc6d457459cd1e8f761234795bfef2 (diff) | |
Merge "Create data folder for archived installs." into main
3 files changed, 42 insertions, 37 deletions
diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index ef529375adb3..79d17534ab26 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -26,7 +26,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.pm.PackageManager; -import android.content.pm.UserInfo; import android.os.CreateAppDataArgs; import android.os.Environment; import android.os.FileUtils; @@ -57,6 +56,7 @@ import dalvik.system.VMRuntime; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; @@ -97,7 +97,22 @@ public class AppDataHelper { synchronized (mPm.mLock) { ps = mPm.mSettings.getPackageLPr(pkg.getPackageName()); } - prepareAppDataPostCommitLIF(ps, 0 /* previousAppId */); + + prepareAppDataPostCommitLIF(ps, 0 /* previousAppId */, getInstalledUsersForPackage(ps)); + } + + private int[] getInstalledUsersForPackage(PackageSetting ps) { + UserManagerInternal umInternal = mInjector.getUserManagerInternal(); + var users = umInternal.getUsers(false /*excludeDying*/); + int[] userIds = new int[users.size()]; + int userIdsCount = 0; + for (int i = 0, size = users.size(); i < size; ++i) { + int userId = users.get(i).id; + if (ps.getInstalled(userId)) { + userIds[userIdsCount++] = userId; + } + } + return Arrays.copyOf(userIds, userIdsCount); } /** @@ -106,7 +121,7 @@ public class AppDataHelper { * @see #prepareAppDataAfterInstallLIF */ @GuardedBy("mPm.mInstallLock") - public void prepareAppDataPostCommitLIF(PackageSetting ps, int previousAppId) { + public void prepareAppDataPostCommitLIF(PackageSetting ps, int previousAppId, int[] userIds) { synchronized (mPm.mLock) { mPm.mSettings.writeKernelMappingLPr(ps); } @@ -121,31 +136,29 @@ public class AppDataHelper { UserManagerInternal umInternal = mInjector.getUserManagerInternal(); StorageManagerInternal smInternal = mInjector.getLocalService( StorageManagerInternal.class); - for (UserInfo user : umInternal.getUsers(false /*excludeDying*/)) { + for (int userId : userIds) { final int flags; - if (StorageManager.isCeStorageUnlocked(user.id) - && smInternal.isCeStoragePrepared(user.id)) { + if (StorageManager.isCeStorageUnlocked(userId) + && smInternal.isCeStoragePrepared(userId)) { flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; - } else if (umInternal.isUserRunning(user.id)) { + } else if (umInternal.isUserRunning(userId)) { flags = StorageManager.FLAG_STORAGE_DE; } else { continue; } - if (ps.getInstalled(user.id)) { - // TODO: when user data is locked, mark that we're still dirty - prepareAppData(batch, ps, previousAppId, user.id, flags).thenRun(() -> { - // Note: this code block is executed with the Installer lock - // already held, since it's invoked as a side-effect of - // executeBatchLI() - if (umInternal.isUserUnlockingOrUnlocked(user.id)) { - // Prepare app data on external storage; currently this is used to - // setup any OBB dirs that were created by the installer correctly. - int uid = UserHandle.getUid(user.id, ps.getAppId()); - smInternal.prepareAppDataAfterInstall(ps.getPackageName(), uid); - } - }); - } + // TODO: when user data is locked, mark that we're still dirty + prepareAppData(batch, ps, previousAppId, userId, flags).thenRun(() -> { + // Note: this code block is executed with the Installer lock + // already held, since it's invoked as a side-effect of + // executeBatchLI() + if (umInternal.isUserUnlockingOrUnlocked(userId)) { + // Prepare app data on external storage; currently this is used to + // setup any OBB dirs that were created by the installer correctly. + int uid = UserHandle.getUid(userId, ps.getAppId()); + smInternal.prepareAppDataAfterInstall(ps.getPackageName(), uid); + } + }); } executeBatchLI(batch); } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 686d72dafc76..83a6f10f0e2a 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -732,7 +732,7 @@ final class InstallPackageHelper { synchronized (mPm.mInstallLock) { // We don't need to freeze for a brand new install mAppDataHelper.prepareAppDataPostCommitLIF( - pkgSetting, /* previousAppId= */0); + pkgSetting, /* previousAppId= */0, new int[] { userId }); } } // TODO(b/278553670) Store archive state for the user. @@ -2448,7 +2448,7 @@ final class InstallPackageHelper { } // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088) - mAppDataHelper.prepareAppDataPostCommitLIF(ps, 0); + mAppDataHelper.prepareAppDataPostCommitLIF(ps, 0, installRequest.getNewUsers()); if (installRequest.isClearCodeCache()) { mAppDataHelper.clearAppDataLeafLIF(packageName, ps.getVolumeUuid(), UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java index 4b3992e63202..fe80f743ffc3 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java @@ -93,8 +93,8 @@ public class PackageUserStateUtils { * this object exists means that the package must be installed or has data on at least one user; * <li> If it is not installed but still has data (i.e., it was previously uninstalled with * {@link PackageManager#DELETE_KEEP_DATA}), return true if the caller requested - * {@link PackageManager#MATCH_UNINSTALLED_PACKAGES}. - * Always available for {@link PackageManager#MATCH_ARCHIVED_PACKAGES}. + * {@link PackageManager#MATCH_UNINSTALLED_PACKAGES} or + * {@link PackageManager#MATCH_ARCHIVED_PACKAGES}; * </ul><p> */ public static boolean isAvailable(@NonNull PackageUserState state, long flags) { @@ -109,19 +109,11 @@ public class PackageUserStateUtils { if (state.isInstalled()) { if (!state.isHidden()) { return true; - } else { - return matchDataExists; - } + } else return matchDataExists; + } else { + // not installed + return matchDataExists && state.dataExists(); } - - // not installed - if (matchUninstalled) { - return state.dataExists(); - } - - // archived or installed as archived - // TODO(b/314808978): Create data folders during install-archived. - return matchArchived; } public static boolean reportIfDebug(boolean result, long flags) { |