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

Commit 2f11dc5e authored by John Wu's avatar John Wu
Browse files

Introduce "Best Effort" shared UID migration strategy

Remove/disable all appId migration code in the system.

Introduce 2 levels of shared UID migration:
NEW_INSTALL_ONLY   = 1
BEST_EFFORT        = 2

The strategy to be used at the moment can be toggled by the system
property: "persist.debug.pm.shared_uid_migration_strategy".

The default strategy for now is BEST_EFFORT.

Test: atest CtsSharedUserMigrationTestCases
Bug: 220015249
Change-Id: If0e1148fdfd27a1dc4bf0066b2a661c6389488fe
parent 99497f45
Loading
Loading
Loading
Loading
+23 −28
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures
import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists;
import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride;
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
import static com.android.server.pm.SharedUidMigration.BEST_EFFORT;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -287,6 +288,12 @@ final class InstallPackageHelper {
        SharedUserSetting sharedUserSetting = mPm.mSettings.getSharedUserSettingLPr(pkgSetting);
        if (sharedUserSetting != null) {
            sharedUserSetting.addPackage(pkgSetting);
            if (parsedPackage.isLeavingSharedUid()
                    && SharedUidMigration.applyStrategy(BEST_EFFORT)
                    && sharedUserSetting.isSingleUser()) {
                // Attempt the transparent shared UID migration
                mPm.mSettings.convertSharedUserSettingsLPw(sharedUserSetting);
            }
        }
        if (reconciledPkg.mInstallArgs != null
                && reconciledPkg.mInstallArgs.mForceQueryableOverride) {
@@ -2216,23 +2223,8 @@ final class InstallPackageHelper {
                }
                incrementalStorages.add(storage);
            }
            int previousAppId = 0;
            if (reconciledPkg.mScanResult.needsNewAppId()) {
                // Only set previousAppId if the app is migrating out of shared UID
                previousAppId = reconciledPkg.mScanResult.mPreviousAppId;

                if (pkg.shouldInheritKeyStoreKeys()) {
                    // Migrate keystore data
                    mAppDataHelper.migrateKeyStoreData(
                            previousAppId, reconciledPkg.mPkgSetting.getAppId());
                }

                if (reconciledPkg.mInstallResult.mRemovedInfo.mRemovedAppId == previousAppId) {
                    // If the previous app ID is removed, clear the keys
                    mAppDataHelper.clearKeystoreData(UserHandle.USER_ALL, previousAppId);
                }
            }
            mAppDataHelper.prepareAppDataPostCommitLIF(pkg, previousAppId);
            // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
            mAppDataHelper.prepareAppDataPostCommitLIF(pkg, 0);
            if (reconciledPkg.mPrepareResult.mClearCodeCache) {
                mAppDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL,
                        FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
@@ -3026,8 +3018,7 @@ final class InstallPackageHelper {
                    installPackageFromSystemLIF(stubPkg.getPath(),
                            mPm.mUserManager.getUserIds() /*allUserHandles*/,
                            null /*origUserHandles*/,
                            true /*writeSettings*/,
                            Process.INVALID_UID /*previousAppId*/);
                            true /*writeSettings*/);
                } catch (PackageManagerException pme) {
                    // Serious WTF; we have to be able to install the stub
                    Slog.wtf(TAG, "Failed to restore system package:" + stubPkg.getPackageName(),
@@ -3154,10 +3145,8 @@ final class InstallPackageHelper {
        try {
            synchronized (mPm.mInstallLock) {
                final int[] origUsers = outInfo == null ? null : outInfo.mOrigUsers;
                final int previousAppId = disabledPs.getAppId() != deletedPs.getAppId()
                        ? deletedPs.getAppId() : Process.INVALID_UID;
                installPackageFromSystemLIF(disabledPs.getPathString(), allUserHandles,
                        origUsers, writeSettings, previousAppId);
                        origUsers, writeSettings);
            }
        } catch (PackageManagerException e) {
            Slog.w(TAG, "Failed to restore system package:" + deletedPs.getPackageName() + ": "
@@ -3200,7 +3189,7 @@ final class InstallPackageHelper {
    @GuardedBy("mPm.mInstallLock")
    private void installPackageFromSystemLIF(@NonNull String codePathString,
            @NonNull int[] allUserHandles, @Nullable int[] origUserHandles,
            boolean writeSettings, int previousAppId)
            boolean writeSettings)
            throws PackageManagerException {
        final File codePath = new File(codePathString);
        @ParsingPackageUtils.ParseFlags int parseFlags =
@@ -3223,13 +3212,12 @@ final class InstallPackageHelper {

        mAppDataHelper.prepareAppDataAfterInstallLIF(pkg);

        setPackageInstalledForSystemPackage(pkg, allUserHandles,
                origUserHandles, writeSettings, previousAppId);
        setPackageInstalledForSystemPackage(pkg, allUserHandles, origUserHandles, writeSettings);
    }

    private void setPackageInstalledForSystemPackage(@NonNull AndroidPackage pkg,
            @NonNull int[] allUserHandles, @Nullable int[] origUserHandles,
            boolean writeSettings, int previousAppId) {
            boolean writeSettings) {
        // writer
        synchronized (mPm.mLock) {
            PackageSetting ps = mPm.mSettings.getPackageLPr(pkg.getPackageName());
@@ -3263,7 +3251,7 @@ final class InstallPackageHelper {

            // The method below will take care of removing obsolete permissions and granting
            // install permissions.
            mPm.mPermissionManager.onPackageInstalled(pkg, previousAppId,
            mPm.mPermissionManager.onPackageInstalled(pkg, Process.INVALID_UID,
                    PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT,
                    UserHandle.USER_ALL);
            for (final int userId : allUserHandles) {
@@ -3701,7 +3689,14 @@ final class InstallPackageHelper {
            }
            disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr(
                    parsedPackage.getPackageName());
            if (parsedPackage.getSharedUserId() != null && !parsedPackage.isLeavingSharedUid()) {

            boolean ignoreSharedUserId = false;
            if (installedPkgSetting == null) {
                // We can directly ignore sharedUserSetting for new installs
                ignoreSharedUserId = parsedPackage.isLeavingSharedUid();
            }

            if (!ignoreSharedUserId && parsedPackage.getSharedUserId() != null) {
                sharedUserSetting = mPm.mSettings.getSharedUserLPw(
                        parsedPackage.getSharedUserId(),
                        0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/);
+6 −0
Original line number Diff line number Diff line
@@ -215,6 +215,8 @@ public class Installer extends SystemService {
        if (!checkBeforeRemote()) {
            return buildPlaceholderCreateAppDataResult();
        }
        // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
        args.previousAppId = 0;
        try {
            return mInstalld.createAppData(args);
        } catch (Exception e) {
@@ -229,6 +231,10 @@ public class Installer extends SystemService {
            Arrays.fill(results, buildPlaceholderCreateAppDataResult());
            return results;
        }
        // Hardcode previousAppId to 0 to disable any data migration (http://b/221088088)
        for (final CreateAppDataArgs arg : args) {
            arg.previousAppId = 0;
        }
        try {
            return mInstalld.createAppDataBatched(args);
        } catch (Exception e) {
+1 −0
Original line number Diff line number Diff line
@@ -477,6 +477,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal

    public void setSharedUserAppId(int sharedUserAppId) {
        mSharedUserAppId = sharedUserAppId;
        onChanged();
    }

    @Override
+5 −1
Original line number Diff line number Diff line
@@ -284,7 +284,11 @@ final class RemovePackageHelper {
                    List<AndroidPackage> sharedUserPkgs =
                            sus != null ? sus.getPackages() : Collections.emptyList();
                    mPermissionManager.onPackageUninstalled(packageName, deletedPs.getAppId(),
                            deletedPs.getPkg(), sharedUserPkgs, UserHandle.USER_ALL);
                            deletedPkg, sharedUserPkgs, UserHandle.USER_ALL);
                    // After permissions are handled, check if the shared user can be migrated
                    if (sus != null) {
                        mPm.mSettings.checkAndConvertSharedUserSettingsLPw(sus);
                    }
                }
                mPm.clearPackagePreferredActivitiesLPw(
                        deletedPs.getPackageName(), changedUsers, UserHandle.USER_ALL);
+10 −20
Original line number Diff line number Diff line
@@ -165,16 +165,7 @@ final class ScanPackageUtils {
            }
        }

        int previousAppId = Process.INVALID_UID;

        if (pkgSetting != null && oldSharedUserSetting != sharedUserSetting) {
            if (oldSharedUserSetting != null && sharedUserSetting == null) {
                previousAppId = pkgSetting.getAppId();
                // Log that something is leaving shareduid and keep going
                Slog.i(TAG,
                        "Package " + parsedPackage.getPackageName() + " shared user changed from "
                                + oldSharedUserSetting.name + " to " + "<nothing>.");
            } else {
            PackageManagerService.reportSettingsProblem(Log.WARN,
                    "Package " + parsedPackage.getPackageName() + " shared user changed from "
                            + (oldSharedUserSetting != null
@@ -184,7 +175,6 @@ final class ScanPackageUtils {
                            + "; replacing with new");
            pkgSetting = null;
        }
        }

        String[] usesSdkLibraries = null;
        if (!parsedPackage.getUsesSdkLibraries().isEmpty()) {
@@ -474,8 +464,8 @@ final class ScanPackageUtils {

        return new ScanResult(request, true, pkgSetting, changedAbiCodePath,
                !createNewPackage /* existingSettingCopied */,
                previousAppId, sdkLibraryInfo, staticSharedLibraryInfo,
                dynamicSharedLibraryInfos);
                Process.INVALID_UID /* previousAppId */ , sdkLibraryInfo,
                staticSharedLibraryInfo, dynamicSharedLibraryInfos);
    }

    /**
Loading