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

Commit 285bdf3e authored by John Wu's avatar John Wu Committed by Automerger Merge Worker
Browse files

Merge "Introduce "Best Effort" shared UID migration strategy" into tm-dev am: b7a52924

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16982773

Change-Id: I90c75ca3efeb4f84a0d0e3ac5da665bb6870219c
parents 57a3234c b7a52924
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
@@ -220,6 +220,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) {
@@ -234,6 +236,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