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

Commit cb7b88fc authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] app data helper

A separate class for handling app data directory setup and reconciling
apps data duing boot.

Notice that I moved some related booting sequence into the new class.

BUG: 199428170
Test: manual
Change-Id: I0d2e0f70b815f0f8e340de9ee876d6ac5c8a6ee9
parent 36bd9805
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1251,4 +1251,9 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP
     * @return the number of freed bytes or -1 if there was an error in the process.
     */
    public abstract long deleteOatArtifactsOfPackage(String packageName);

    /**
     * Reconcile all app data for the given user.
     */
    public abstract void reconcileAppsData(int userId, int flags, boolean migrateAppsData);
}
+588 −0

File added.

Preview size limit exceeded, changes collapsed.

+10 −12
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.incremental.IncrementalManager;
import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
@@ -78,33 +77,32 @@ final class DeletePackageHelper {
    private static final boolean DEBUG_SD_INSTALL = false;

    private final PackageManagerService mPm;
    private final IncrementalManager mIncrementalManager;
    private final Installer mInstaller;
    private final UserManagerInternal mUserManagerInternal;
    private final PermissionManagerServiceInternal mPermissionManager;
    private final RemovePackageHelper mRemovePackageHelper;
    private final InitAndSystemPackageHelper mInitAndSystemPackageHelper;
    private final AppDataHelper mAppDataHelper;

    // TODO(b/198166813): remove PMS dependency
    DeletePackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper,
            InitAndSystemPackageHelper initAndSystemPackageHelper) {
            InitAndSystemPackageHelper initAndSystemPackageHelper,
            AppDataHelper appDataHelper) {
        mPm = pm;
        mIncrementalManager = mPm.mInjector.getIncrementalManager();
        mInstaller = mPm.mInjector.getInstaller();
        mUserManagerInternal = mPm.mInjector.getUserManagerInternal();
        mPermissionManager = mPm.mInjector.getPermissionManagerServiceInternal();
        mRemovePackageHelper = removePackageHelper;
        mInitAndSystemPackageHelper = initAndSystemPackageHelper;
        mAppDataHelper = appDataHelper;
    }

    DeletePackageHelper(PackageManagerService pm) {
        mPm = pm;
        mIncrementalManager = mPm.mInjector.getIncrementalManager();
        mInstaller = mPm.mInjector.getInstaller();
        mAppDataHelper = new AppDataHelper(mPm);
        mUserManagerInternal = mPm.mInjector.getUserManagerInternal();
        mPermissionManager = mPm.mInjector.getPermissionManagerServiceInternal();
        mRemovePackageHelper = new RemovePackageHelper(mPm);
        mInitAndSystemPackageHelper = new InitAndSystemPackageHelper(mPm, mRemovePackageHelper);
        mRemovePackageHelper = new RemovePackageHelper(mPm, mAppDataHelper);
        mInitAndSystemPackageHelper = new InitAndSystemPackageHelper(mPm, mRemovePackageHelper,
                mAppDataHelper);
    }

    /**
@@ -457,7 +455,7 @@ final class DeletePackageHelper {
            pkg = mPm.mPackages.get(ps.getPackageName());
        }

        mRemovePackageHelper.destroyAppProfilesLIF(pkg);
        mAppDataHelper.destroyAppProfilesLIF(pkg);

        final SharedUserSetting sus = ps.getSharedUser();
        List<AndroidPackage> sharedUserPkgs = sus != null ? sus.getPackages() : null;
@@ -472,7 +470,7 @@ final class DeletePackageHelper {
                        + nextUserId);
            }
            if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) {
                mRemovePackageHelper.destroyAppDataLIF(pkg, nextUserId,
                mAppDataHelper.destroyAppDataLIF(pkg, nextUserId,
                        FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL);
            }
            PackageManagerService.removeKeystoreDataIfNeeded(mUserManagerInternal, nextUserId,
+9 −5
Original line number Diff line number Diff line
@@ -88,11 +88,14 @@ import java.util.concurrent.ExecutorService;
final class InitAndSystemPackageHelper {
    private final PackageManagerService mPm;
    private final RemovePackageHelper mRemovePackageHelper;
    private final AppDataHelper mAppDataHelper;

    // TODO(b/198166813): remove PMS dependency
    InitAndSystemPackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper) {
    InitAndSystemPackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper,
            AppDataHelper appDataHelper) {
        mPm = pm;
        mRemovePackageHelper = removePackageHelper;
        mAppDataHelper = appDataHelper;
    }

    /**
@@ -571,7 +574,7 @@ final class InitAndSystemPackageHelper {
                         mPm.freezePackage(stubPkg.getPackageName(), "setEnabledSetting")) {
                pkg = installStubPackageLI(stubPkg, parseFlags, 0 /*scanFlags*/);
                synchronized (mPm.mLock) {
                    mPm.prepareAppDataAfterInstallLIF(pkg);
                    mAppDataHelper.prepareAppDataAfterInstallLIF(pkg);
                    try {
                        mPm.updateSharedLibrariesLocked(pkg, stubPkgSetting, null, null,
                                Collections.unmodifiableMap(mPm.mPackages));
@@ -615,8 +618,9 @@ final class InitAndSystemPackageHelper {
                }
                return false;
            }
            mPm.clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE
                    | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
            mAppDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL,
                    FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
                            | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
            mPm.getDexManager().notifyPackageUpdated(pkg.getPackageName(),
                    pkg.getBaseApkPath(), pkg.getSplitCodePaths());
        }
@@ -839,7 +843,7 @@ final class InitAndSystemPackageHelper {
            Slog.e(TAG, "updateAllSharedLibrariesLPw failed: " + e.getMessage());
        }

        mPm.prepareAppDataAfterInstallLIF(pkg);
        mAppDataHelper.prepareAppDataAfterInstallLIF(pkg);

        // writer
        synchronized (mPm.mLock) {
+5 −3
Original line number Diff line number Diff line
@@ -1840,6 +1840,7 @@ final class InstallParams extends HandlerParams {
     */
    private void executePostCommitSteps(CommitRequest commitRequest) {
        final ArraySet<IncrementalStorage> incrementalStorages = new ArraySet<>();
        final AppDataHelper appDataHelper = new AppDataHelper(mPm);
        for (ReconciledPackage reconciledPkg : commitRequest.mReconciledPackages.values()) {
            final boolean instantApp = ((reconciledPkg.mScanResult.mRequest.mScanFlags
                    & SCAN_AS_INSTANT_APP) != 0);
@@ -1856,10 +1857,11 @@ final class InstallParams extends HandlerParams {
                }
                incrementalStorages.add(storage);
            }
            mPm.prepareAppDataAfterInstallLIF(pkg);
            appDataHelper.prepareAppDataAfterInstallLIF(pkg);
            if (reconciledPkg.mPrepareResult.mClearCodeCache) {
                mPm.clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE
                        | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
                appDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL,
                        FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
                                | Installer.FLAG_CLEAR_CODE_CACHE_ONLY);
            }
            if (reconciledPkg.mPrepareResult.mReplace) {
                mPm.getDexManager().notifyPackageUpdated(pkg.getPackageName(),
Loading