Use session id to search for rollbacks (2/n)

1. #enableRollback is greatly simplified since now we can get session
   objects directly using the session id.
2. ACTION_CANCEL_ENABLE_ROLLBACK handler now uses the session id to
   search for rollbacks to delete. Since 'token' is not used, we will be
   able to remove unused code and APIs later.

(Cherry-picked from 0a5a4db24c)

Bug: 149663536
Test: atest RollbackTest
Merged-In: I2d0bc2166348ff7b5cdee7ac0b31a61023e33cb8
Change-Id: I2d0bc2166348ff7b5cdee7ac0b31a61023e33cb8
This commit is contained in:
JW Wang
2020-02-17 16:30:52 +08:00
parent 0757179ff8
commit 635382efc6

View File

@@ -205,14 +205,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_INSTALL_FLAGS, 0);
int user = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_USER, 0);
int sessionId = intent.getIntExtra(
PackageManagerInternal.EXTRA_ENABLE_ROLLBACK_SESSION_ID, -1);
File newPackageCodePath = new File(intent.getData().getPath());
queueSleepIfNeeded();
getHandler().post(() -> {
boolean success =
enableRollback(installFlags, newPackageCodePath, user, token);
boolean success = enableRollback(
sessionId, installFlags, newPackageCodePath, user, token);
int ret = PackageManagerInternal.ENABLE_ROLLBACK_SUCCEEDED;
if (!success) {
ret = PackageManagerInternal.ENABLE_ROLLBACK_FAILED;
@@ -240,17 +242,16 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
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);
}
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.delete(mAppDataRollbackHelper);
break;
}
Rollback rollback = getRollbackForSessionLocked(sessionId);
if (rollback != null && rollback.isEnabling()) {
mRollbacks.remove(rollback);
rollback.delete(mAppDataRollbackHelper);
}
}
}
@@ -723,51 +724,24 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
* @return true if enabling the rollback succeeds, false otherwise.
*/
@WorkerThread
private boolean enableRollback(
private boolean enableRollback(int sessionId,
int installFlags, File newPackageCodePath, @UserIdInt int user, int token) {
if (LOCAL_LOGV) {
Slog.v(TAG, "enableRollback user=" + user + " token=" + token
+ " path=" + newPackageCodePath.getAbsolutePath());
}
// 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;
}