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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user