Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7b94c76 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by The Android Automerger
Browse files

Apply non-FBE migration early during boot.

On non-FBE devices, we offer to migrate CE/DE storage of certain
system apps during boot.  However, if this migration happens after
app code has started to run, we end up clobbering open files such
as databases.

The right way to solve this is to apply all migration early during
boot (in the PMS constructor) before any app code can start.

Bug: 28512897, 28525109
Change-Id: I17eb9a09e5862d873b86c05ce35874a34386e433
parent 713b80c4
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -2676,8 +2676,14 @@ public class PackageManagerService extends IPackageManager.Stub {
            // Prepare storage for system user really early during boot,
            // since core system apps like SettingsProvider and SystemUI
            // can't wait for user to start
            final int storageFlags;
            if (StorageManager.isFileEncryptedNativeOrEmulated()) {
                storageFlags = StorageManager.FLAG_STORAGE_DE;
            } else {
                storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
            }
            reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.USER_SYSTEM,
                    StorageManager.FLAG_STORAGE_DE);
                    storageFlags);
            // If this is first boot after an OTA, and a normal boot, then
            // we need to clear code cache directories.
@@ -19089,7 +19095,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
        // First look for stale data that doesn't belong, and check if things
        // have changed since we did our last restorecon
        if ((flags & StorageManager.FLAG_STORAGE_CE) != 0) {
            if (!StorageManager.isUserKeyUnlocked(userId)) {
            if (StorageManager.isFileEncryptedNativeOrEmulated()
                    && !StorageManager.isUserKeyUnlocked(userId)) {
                throw new RuntimeException(
                        "Yikes, someone asked us to reconcile CE storage while " + userId
                                + " was still locked; this would have caused massive data loss!");