diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/MovePackageHelper.java | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index c5ca06cc7b84..1f96205aa3cb 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -34,6 +34,7 @@ import android.content.pm.IPackageMoveObserver; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageStats; +import android.content.pm.UserInfo; import android.content.pm.parsing.ApkLiteParseUtils; import android.content.pm.parsing.PackageLite; import android.content.pm.parsing.result.ParseResult; @@ -48,6 +49,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; +import android.text.TextUtils; import android.util.MathUtils; import android.util.Slog; import android.util.SparseIntArray; @@ -220,6 +222,16 @@ public final class MovePackageHelper { "Not enough free space to move"); } + try { + for (int index = 0; index < installedUserIds.length; index++) { + prepareUserDataForVolumeIfRequired(volumeUuid, installedUserIds[index], storage); + } + } catch (RuntimeException e) { + freezer.close(); + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Failed to prepare user storage while moving app"); + } + mPm.mMoveCallbacks.notifyStatusChanged(moveId, 10); final CountDownLatch installedLatch = new CountDownLatch(1); @@ -368,6 +380,29 @@ public final class MovePackageHelper { return true; } + private void prepareUserDataForVolumeIfRequired(String volumeUuid, int userId, + StorageManager storageManager) { + if (TextUtils.isEmpty(volumeUuid) + || doesDataDirectoryExistForUser(volumeUuid, userId)) { + return; + } + if (DEBUG_INSTALL) { + Slog.d(TAG, "Preparing user directories for user u" + userId + " for UUID " + + volumeUuid); + } + final UserInfo user = mPm.mUserManager.getUserInfo(userId); + if (user == null) return; + // This call is same as StorageEventHelper#loadPrivatePackagesInner which prepares + // the storage before reconciling apps + storageManager.prepareUserStorage(volumeUuid, user.id, user.serialNumber, + StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + } + + private boolean doesDataDirectoryExistForUser(String uuid, int userId) { + final File userDirectoryFile = Environment.getDataUserCeDirectory(uuid, userId); + return userDirectoryFile != null && userDirectoryFile.exists(); + } + public static class MoveCallbacks extends Handler { private static final int MSG_CREATED = 1; private static final int MSG_STATUS_CHANGED = 2; |