Loading services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +13 −72 Original line number Original line Diff line number Diff line Loading @@ -16,16 +16,11 @@ package com.android.server.rollback; package com.android.server.rollback; import static com.android.internal.util.FrameworkStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN; import android.annotation.AnyThread; import android.annotation.AnyThread; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.WorkerThread; import android.annotation.WorkerThread; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; import android.content.pm.VersionedPackage; import android.content.rollback.PackageRollbackInfo; import android.content.rollback.PackageRollbackInfo; Loading Loading @@ -240,64 +235,6 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { return null; return null; } } @WorkerThread private BroadcastReceiver listenForStagedSessionReady(RollbackManager rollbackManager, int rollbackId, @Nullable VersionedPackage logPackage) { assertInWorkerThread(); BroadcastReceiver sessionUpdatedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { handleStagedSessionChange(rollbackManager, rollbackId, this /* BroadcastReceiver */, logPackage); } }; IntentFilter sessionUpdatedFilter = new IntentFilter(PackageInstaller.ACTION_SESSION_UPDATED); mContext.registerReceiver(sessionUpdatedReceiver, sessionUpdatedFilter, null, mHandler); return sessionUpdatedReceiver; } @WorkerThread private void handleStagedSessionChange(RollbackManager rollbackManager, int rollbackId, BroadcastReceiver listener, @Nullable VersionedPackage logPackage) { assertInWorkerThread(); PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller(); List<RollbackInfo> recentRollbacks = rollbackManager.getRecentlyCommittedRollbacks(); for (int i = 0; i < recentRollbacks.size(); i++) { RollbackInfo recentRollback = recentRollbacks.get(i); int sessionId = recentRollback.getCommittedSessionId(); if ((rollbackId == recentRollback.getRollbackId()) && (sessionId != PackageInstaller.SessionInfo.INVALID_ID)) { PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); if (sessionInfo.isStagedSessionReady() && markStagedSessionHandled(rollbackId)) { mContext.unregisterReceiver(listener); saveStagedRollbackId(rollbackId, logPackage); WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED, WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN, ""); } else if (sessionInfo.isStagedSessionFailed() && markStagedSessionHandled(rollbackId)) { WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN, ""); mContext.unregisterReceiver(listener); } } } // Wait for all pending staged sessions to get handled before rebooting. if (isPendingStagedSessionsEmpty()) { mContext.getSystemService(PowerManager.class).reboot("Rollback staged install"); } } /** /** * Returns {@code true} if staged session associated with {@code rollbackId} was marked * Returns {@code true} if staged session associated with {@code rollbackId} was marked * as handled, {@code false} if already handled. * as handled, {@code false} if already handled. Loading Loading @@ -447,12 +384,12 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { if (status == RollbackManager.STATUS_SUCCESS) { if (status == RollbackManager.STATUS_SUCCESS) { if (rollback.isStaged()) { if (rollback.isStaged()) { int rollbackId = rollback.getRollbackId(); int rollbackId = rollback.getRollbackId(); mPendingStagedRollbackIds.add(rollbackId); saveStagedRollbackId(rollbackId, logPackage); BroadcastReceiver listener = WatchdogRollbackLogger.logEvent(logPackage, listenForStagedSessionReady(rollbackManager, rollbackId, FrameworkStatsLog logPackage); .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED, handleStagedSessionChange(rollbackManager, rollbackId, listener, reasonToLog, failedPackageToLog); logPackage); } else { } else { WatchdogRollbackLogger.logEvent(logPackage, WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog FrameworkStatsLog Loading @@ -460,14 +397,18 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { reasonToLog, failedPackageToLog); reasonToLog, failedPackageToLog); } } } else { } else { if (rollback.isStaged()) { markStagedSessionHandled(rollback.getRollbackId()); } WatchdogRollbackLogger.logEvent(logPackage, WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, reasonToLog, failedPackageToLog); reasonToLog, failedPackageToLog); } } if (rollback.isStaged()) { markStagedSessionHandled(rollback.getRollbackId()); // Wait for all pending staged sessions to get handled before rebooting. if (isPendingStagedSessionsEmpty()) { mContext.getSystemService(PowerManager.class).reboot("Rollback staged install"); } } }; }; final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> { final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> { Loading Loading
services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +13 −72 Original line number Original line Diff line number Diff line Loading @@ -16,16 +16,11 @@ package com.android.server.rollback; package com.android.server.rollback; import static com.android.internal.util.FrameworkStatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN; import android.annotation.AnyThread; import android.annotation.AnyThread; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.WorkerThread; import android.annotation.WorkerThread; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; import android.content.pm.VersionedPackage; import android.content.rollback.PackageRollbackInfo; import android.content.rollback.PackageRollbackInfo; Loading Loading @@ -240,64 +235,6 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { return null; return null; } } @WorkerThread private BroadcastReceiver listenForStagedSessionReady(RollbackManager rollbackManager, int rollbackId, @Nullable VersionedPackage logPackage) { assertInWorkerThread(); BroadcastReceiver sessionUpdatedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { handleStagedSessionChange(rollbackManager, rollbackId, this /* BroadcastReceiver */, logPackage); } }; IntentFilter sessionUpdatedFilter = new IntentFilter(PackageInstaller.ACTION_SESSION_UPDATED); mContext.registerReceiver(sessionUpdatedReceiver, sessionUpdatedFilter, null, mHandler); return sessionUpdatedReceiver; } @WorkerThread private void handleStagedSessionChange(RollbackManager rollbackManager, int rollbackId, BroadcastReceiver listener, @Nullable VersionedPackage logPackage) { assertInWorkerThread(); PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller(); List<RollbackInfo> recentRollbacks = rollbackManager.getRecentlyCommittedRollbacks(); for (int i = 0; i < recentRollbacks.size(); i++) { RollbackInfo recentRollback = recentRollbacks.get(i); int sessionId = recentRollback.getCommittedSessionId(); if ((rollbackId == recentRollback.getRollbackId()) && (sessionId != PackageInstaller.SessionInfo.INVALID_ID)) { PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); if (sessionInfo.isStagedSessionReady() && markStagedSessionHandled(rollbackId)) { mContext.unregisterReceiver(listener); saveStagedRollbackId(rollbackId, logPackage); WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED, WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN, ""); } else if (sessionInfo.isStagedSessionFailed() && markStagedSessionHandled(rollbackId)) { WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_REASON__REASON_UNKNOWN, ""); mContext.unregisterReceiver(listener); } } } // Wait for all pending staged sessions to get handled before rebooting. if (isPendingStagedSessionsEmpty()) { mContext.getSystemService(PowerManager.class).reboot("Rollback staged install"); } } /** /** * Returns {@code true} if staged session associated with {@code rollbackId} was marked * Returns {@code true} if staged session associated with {@code rollbackId} was marked * as handled, {@code false} if already handled. * as handled, {@code false} if already handled. Loading Loading @@ -447,12 +384,12 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { if (status == RollbackManager.STATUS_SUCCESS) { if (status == RollbackManager.STATUS_SUCCESS) { if (rollback.isStaged()) { if (rollback.isStaged()) { int rollbackId = rollback.getRollbackId(); int rollbackId = rollback.getRollbackId(); mPendingStagedRollbackIds.add(rollbackId); saveStagedRollbackId(rollbackId, logPackage); BroadcastReceiver listener = WatchdogRollbackLogger.logEvent(logPackage, listenForStagedSessionReady(rollbackManager, rollbackId, FrameworkStatsLog logPackage); .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED, handleStagedSessionChange(rollbackManager, rollbackId, listener, reasonToLog, failedPackageToLog); logPackage); } else { } else { WatchdogRollbackLogger.logEvent(logPackage, WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog FrameworkStatsLog Loading @@ -460,14 +397,18 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver { reasonToLog, failedPackageToLog); reasonToLog, failedPackageToLog); } } } else { } else { if (rollback.isStaged()) { markStagedSessionHandled(rollback.getRollbackId()); } WatchdogRollbackLogger.logEvent(logPackage, WatchdogRollbackLogger.logEvent(logPackage, FrameworkStatsLog FrameworkStatsLog .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, .WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE, reasonToLog, failedPackageToLog); reasonToLog, failedPackageToLog); } } if (rollback.isStaged()) { markStagedSessionHandled(rollback.getRollbackId()); // Wait for all pending staged sessions to get handled before rebooting. if (isPendingStagedSessionsEmpty()) { mContext.getSystemService(PowerManager.class).reboot("Rollback staged install"); } } }; }; final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> { final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> { Loading