summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Buynytskyy <alexbuy@google.com> 2023-12-07 03:40:50 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-12-07 03:40:50 +0000
commita9aedbf0ff1f0e2d03fce94750de91c11314e7d2 (patch)
tree0e9b37b85816c22a754220321abf8f0a5d8985c9
parent4dfa961668583aa8d98c2b5d0e7444abddc8e86b (diff)
parent9e5fabe814fc6d457459cd1e8f761234795bfef2 (diff)
Merge "Create data folder for archived installs." into main
-rw-r--r--services/core/java/com/android/server/pm/AppDataHelper.java55
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java4
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java20
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) {