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

Commit f8d52afa authored by JW Wang's avatar JW Wang Committed by Android (Google) Code Review
Browse files

Merge changes Ia233ca64,I2d0bc216,I94003873 into rvc-dev

* changes:
  Remove unused code (3/n)
  Use session id to search for rollbacks (2/n)
  Include session id when sending broadcasts (1/n)
parents 3e7dd917 298239b5
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -845,18 +845,11 @@ public abstract class PackageManagerInternal {
            "android.content.pm.extra.ENABLE_ROLLBACK_TOKEN";

    /**
     * Extra field name for the installFlags of a request to enable rollback
     * Extra field name for the session id of a request to enable rollback
     * for a package.
     */
    public static final String EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS =
            "android.content.pm.extra.ENABLE_ROLLBACK_INSTALL_FLAGS";

    /**
     * Extra field name for the user id an install is associated with when
     * enabling rollback.
     */
    public static final String EXTRA_ENABLE_ROLLBACK_USER =
            "android.content.pm.extra.ENABLE_ROLLBACK_USER";
    public static final String EXTRA_ENABLE_ROLLBACK_SESSION_ID =
            "android.content.pm.extra.ENABLE_ROLLBACK_SESSION_ID";

    /**
     * Used as the {@code enableRollbackCode} argument for
+2 −2
Original line number Diff line number Diff line
@@ -1689,8 +1689,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        }

        mRelinquished = true;
        return new PackageManagerService.ActiveInstallSession(mPackageName, stageDir,
                localObserver, params, mInstallerUid, mInstallSource, user, mSigningDetails);
        return new PackageManagerService.ActiveInstallSession(mPackageName, stageDir, localObserver,
                sessionId, params, mInstallerUid, mInstallSource, user, mSigningDetails);
    }

    private static void maybeRenameFile(File from, File to) throws PackageManagerException {
+17 −10
Original line number Diff line number Diff line
@@ -1967,6 +1967,7 @@ public class PackageManagerService extends IPackageManager.Stub
                }
                case ENABLE_ROLLBACK_TIMEOUT: {
                    final int enableRollbackToken = msg.arg1;
                    final int sessionId = msg.arg2;
                    final InstallParams params = mPendingEnableRollback.get(enableRollbackToken);
                    if (params != null) {
                        final InstallArgs args = params.mArgs;
@@ -1982,8 +1983,8 @@ public class PackageManagerService extends IPackageManager.Stub
                        Intent rollbackTimeoutIntent = new Intent(
                                Intent.ACTION_CANCEL_ENABLE_ROLLBACK);
                        rollbackTimeoutIntent.putExtra(
                                PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN,
                                enableRollbackToken);
                                PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID,
                                sessionId);
                        rollbackTimeoutIntent.addFlags(
                                Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
                        mContext.sendBroadcastAsUser(rollbackTimeoutIntent, UserHandle.SYSTEM,
@@ -14260,6 +14261,7 @@ public class PackageManagerService extends IPackageManager.Stub
        final long requiredInstalledVersionCode;
        final boolean forceQueryableOverride;
        final int mDataLoaderType;
        final int mSessionId;
        InstallParams(OriginInfo origin, MoveInfo move, IPackageInstallObserver2 observer,
                int installFlags, InstallSource installSource, String volumeUuid,
@@ -14283,6 +14285,7 @@ public class PackageManagerService extends IPackageManager.Stub
            this.requiredInstalledVersionCode = requiredInstalledVersionCode;
            this.forceQueryableOverride = false;
            this.mDataLoaderType = dataLoaderType;
            this.mSessionId = -1;
        }
        InstallParams(ActiveInstallSession activeInstallSession) {
@@ -14318,6 +14321,7 @@ public class PackageManagerService extends IPackageManager.Stub
            forceQueryableOverride = sessionParams.forceQueryableOverride;
            mDataLoaderType = (sessionParams.dataLoaderParams != null)
                    ? sessionParams.dataLoaderParams.getType() : DataLoaderType.NONE;
            mSessionId = activeInstallSession.getSessionId();
        }
        @Override
@@ -14549,13 +14553,9 @@ public class PackageManagerService extends IPackageManager.Stub
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN,
                            enableRollbackToken);
                    enableRollbackIntent.putExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS,
                            installFlags);
                    enableRollbackIntent.putExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER,
                            getRollbackUser().getIdentifier());
                    enableRollbackIntent.setDataAndType(Uri.fromFile(new File(origin.resolvedPath)),
                            PACKAGE_MIME_TYPE);
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID,
                            mSessionId);
                    enableRollbackIntent.setType(PACKAGE_MIME_TYPE);
                    enableRollbackIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    // Allow the broadcast to be sent before boot complete.
@@ -14581,6 +14581,7 @@ public class PackageManagerService extends IPackageManager.Stub
                                    final Message msg = mHandler.obtainMessage(
                                            ENABLE_ROLLBACK_TIMEOUT);
                                    msg.arg1 = enableRollbackToken;
                                    msg.arg2 = mSessionId;
                                    mHandler.sendMessageDelayed(msg, rollbackTimeout);
                                }
                            }, null, 0, null, null);
@@ -24590,6 +24591,7 @@ public class PackageManagerService extends IPackageManager.Stub
        private final String mPackageName;
        private final File mStagedDir;
        private final IPackageInstallObserver2 mObserver;
        private final int mSessionId;
        private final PackageInstaller.SessionParams mSessionParams;
        private final int mInstallerUid;
        @NonNull private final InstallSource mInstallSource;
@@ -24597,11 +24599,12 @@ public class PackageManagerService extends IPackageManager.Stub
        private final SigningDetails mSigningDetails;
        ActiveInstallSession(String packageName, File stagedDir, IPackageInstallObserver2 observer,
                PackageInstaller.SessionParams sessionParams, int installerUid,
                int sessionId, PackageInstaller.SessionParams sessionParams, int installerUid,
                InstallSource installSource, UserHandle user, SigningDetails signingDetails) {
            mPackageName = packageName;
            mStagedDir = stagedDir;
            mObserver = observer;
            mSessionId = sessionId;
            mSessionParams = sessionParams;
            mInstallerUid = installerUid;
            mInstallSource = Preconditions.checkNotNull(installSource);
@@ -24621,6 +24624,10 @@ public class PackageManagerService extends IPackageManager.Stub
            return mObserver;
        }
        public int getSessionId() {
            return mSessionId;
        }
        public PackageInstaller.SessionParams getSessionParams() {
            return mSessionParams;
        }
+0 −27
Original line number Diff line number Diff line
@@ -158,13 +158,6 @@ class Rollback {
     */
    @Nullable public final String mInstallerPackageName;

    /**
     * This array holds all of the rollback tokens associated with package sessions included in
     * this rollback.
     */
    @GuardedBy("mLock")
    private final IntArray mTokens = new IntArray();

    /**
     * Session ids for all packages in the install. For multi-package sessions, this is the list
     * of child session ids. For normal sessions, this list is a single element with the normal
@@ -768,26 +761,6 @@ class Rollback {
        }
    }

    /**
     * Adds a rollback token to be associated with this rollback. This may be used to
     * identify which rollback should be removed in case {@link PackageManager} sends an
     * {@link Intent#ACTION_CANCEL_ENABLE_ROLLBACK} intent.
     */
    void addToken(int token) {
        synchronized (mLock) {
            mTokens.add(token);
        }
    }

    /**
     * Returns true if this rollback is associated with the provided {@code token}.
     */
    boolean hasToken(int token) {
        synchronized (mLock) {
            return mTokens.indexOf(token) != -1;
        }
    }

    /**
     * Returns true if this rollback contains the provided {@code packageSessionId}.
     */
+21 −81
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.Manifest;
import android.annotation.AnyThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.annotation.WorkerThread;
import android.app.AppOpsManager;
import android.content.BroadcastReceiver;
@@ -201,18 +200,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                if (Intent.ACTION_PACKAGE_ENABLE_ROLLBACK.equals(intent.getAction())) {
                    int token = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1);
                    int installFlags = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, 0);
                    int user = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, 0);

                    File newPackageCodePath = new File(intent.getData().getPath());
                    int sessionId = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID, -1);

                    queueSleepIfNeeded();

                    getHandler().post(() -> {
                        boolean success =
                                enableRollback(installFlags, newPackageCodePath, user, token);
                        boolean success = enableRollback(sessionId);
                        int ret = PackageManagerInternal.ENABLE_ROLLBACK_SUCCEEDED;
                        if (!success) {
                            ret = PackageManagerInternal.ENABLE_ROLLBACK_FAILED;
@@ -238,19 +232,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (Intent.ACTION_CANCEL_ENABLE_ROLLBACK.equals(intent.getAction())) {
                    int token = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_TOKEN, -1);
                    int sessionId = intent.getIntExtra(
                            PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID, -1);
                    if (LOCAL_LOGV) {
                        Slog.v(TAG, "broadcast=ACTION_CANCEL_ENABLE_ROLLBACK token=" + token);
                        Slog.v(TAG, "broadcast=ACTION_CANCEL_ENABLE_ROLLBACK id=" + sessionId);
                    }
                    synchronized (mLock) {
                        for (int i = 0; i < mRollbacks.size(); ++i) {
                            Rollback rollback = mRollbacks.get(i);
                            if (rollback.hasToken(token) && rollback.isEnabling()) {
                                mRollbacks.remove(i);
                        Rollback rollback = getRollbackForSessionLocked(sessionId);
                        if (rollback != null && rollback.isEnabling()) {
                            mRollbacks.remove(rollback);
                            rollback.delete(mAppDataRollbackHelper);
                                break;
                            }
                        }
                    }
                }
@@ -684,24 +675,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        return mHandlerThread.getThreadHandler();
    }

    // Returns true if <code>session</code> has installFlags and code path
    // matching the installFlags and new package code path given to
    // enableRollback.
    @WorkerThread
    private boolean sessionMatchesForEnableRollback(PackageInstaller.SessionInfo session,
            int installFlags, File newPackageCodePath) {
        if (session == null || session.resolvedBaseCodePath == null) {
            return false;
        }

        File packageCodePath = new File(session.resolvedBaseCodePath).getParentFile();
        if (newPackageCodePath.equals(packageCodePath) && installFlags == session.installFlags) {
            return true;
        }

        return false;
    }

    @AnyThread
    private Context getContextAsUser(UserHandle user) {
        try {
@@ -716,58 +689,26 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
     * staged for install with rollback enabled. Called before the package has
     * been installed.
     *
     * @param installFlags information about what is being installed.
     * @param newPackageCodePath path to the package about to be installed.
     * @param user the user that owns the install session to enable rollback on.
     * @param token the distinct rollback token sent by package manager.
     * @param sessionId the id of the install session
     * @return true if enabling the rollback succeeds, false otherwise.
     */
    @WorkerThread
    private boolean enableRollback(
            int installFlags, File newPackageCodePath, @UserIdInt int user, int token) {
    private boolean enableRollback(int sessionId) {
        if (LOCAL_LOGV) {
            Slog.v(TAG, "enableRollback user=" + user + " token=" + token
                    + " path=" + newPackageCodePath.getAbsolutePath());
            Slog.v(TAG, "enableRollback sessionId=" + sessionId);
        }

        // Find the session id associated with this install.
        // TODO: It would be nice if package manager or package installer told
        // us the session directly, rather than have to search for it
        // ourselves.

        // getAllSessions only returns sessions for the associated user.
        // Create a context with the right user so we can find the matching
        // session.
        final Context context = getContextAsUser(UserHandle.of(user));
        if (context == null) {
            Slog.e(TAG, "Unable to create context for install session user.");
        PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
        PackageInstaller.SessionInfo packageSession = installer.getSessionInfo(sessionId);
        if (packageSession == null) {
            Slog.e(TAG, "Unable to find session for enabled rollback.");
            return false;
        }

        PackageInstaller.SessionInfo parentSession = null;
        PackageInstaller.SessionInfo packageSession = null;
        PackageInstaller installer = context.getPackageManager().getPackageInstaller();
        for (PackageInstaller.SessionInfo info : installer.getAllSessions()) {
            if (info.isMultiPackage()) {
                for (int childId : info.getChildSessionIds()) {
                    PackageInstaller.SessionInfo child = installer.getSessionInfo(childId);
                    if (sessionMatchesForEnableRollback(child, installFlags, newPackageCodePath)) {
                        // TODO: Check we only have one matching session?
                        parentSession = info;
                        packageSession = child;
                        break;
                    }
                }
            } else if (sessionMatchesForEnableRollback(info, installFlags, newPackageCodePath)) {
                // TODO: Check we only have one matching session?
                parentSession = info;
                packageSession = info;
                break;
            }
        }

        if (parentSession == null || packageSession == null) {
            Slog.e(TAG, "Unable to find session for enabled rollback.");
        PackageInstaller.SessionInfo parentSession = packageSession.hasParentSessionId()
                ? installer.getSessionInfo(packageSession.getParentSessionId()) : packageSession;
        if (parentSession == null) {
            Slog.e(TAG, "Unable to find parent session for enabled rollback.");
            return false;
        }

@@ -804,7 +745,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                newRollback = createNewRollbackLocked(parentSession);
            }
        }
        newRollback.addToken(token);

        return enableRollbackForPackageSession(newRollback, packageSession);
    }