diff options
| author | 2024-05-07 16:54:58 +0800 | |
|---|---|---|
| committer | 2024-05-14 05:56:34 +0800 | |
| commit | 7b612cc0243e36e253714aed39faccc455f32620 (patch) | |
| tree | 539eca29424c3dac32b836427f19b59026962cdf | |
| parent | b533e85d47622b9cebea23455401ad7608daca1d (diff) | |
Synchronize to kill application when clear data
When clear application data, PMS will ask to kill the application
immediately before return back to the caller.
Bug: 31009094
Test: atest CtsBackupHostTestCases
Change-Id: Id2b63e5872a38dbeca457361d59ae5a8f5a3dcc3
4 files changed, 54 insertions, 2 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index d8df447982a0..8e99e46be6ac 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -1282,4 +1282,15 @@ public abstract class ActivityManagerInternal { */ public abstract void addStartInfoTimestamp(int key, long timestampNs, int uid, int pid, int userId); + + /** + * It is similar {@link IActivityManager#killApplication(String, int, int, String, int)} but + * it immediately stop the package. + * + * <p>Note: Do not call this method from inside PMS's lock, otherwise it'll run into + * watchdog reset. + * @hide + */ + public abstract void killApplicationSync(String pkgName, int appId, int userId, + String reason, int exitInfoReason); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1b3b19808dad..32a4cba3714f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19967,6 +19967,26 @@ public class ActivityManagerService extends IActivityManager.Stub addStartInfoTimestampInternal(key, timestampNs, userId, uid); } + + @Override + public void killApplicationSync(String pkgName, int appId, int userId, + String reason, int exitInfoReason) { + if (pkgName == null) { + return; + } + // Make sure the uid is valid. + if (appId < 0) { + Slog.w(TAG, "Invalid appid specified for pkg : " + pkgName); + return; + } + synchronized (ActivityManagerService.this) { + ActivityManagerService.this.forceStopPackageLocked(pkgName, appId, + /* callerWillRestart= */ false, /*purgeCache= */ false, + /* doit= */ true, /* evenPersistent= */ false, + /* uninstalling= */ false, /* packageStateStopped= */ false, + userId, reason, exitInfoReason); + } + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, TimeoutRecord timeoutRecord) { diff --git a/services/core/java/com/android/server/pm/PackageFreezer.java b/services/core/java/com/android/server/pm/PackageFreezer.java index 7c5615771607..0afda4598bcb 100644 --- a/services/core/java/com/android/server/pm/PackageFreezer.java +++ b/services/core/java/com/android/server/pm/PackageFreezer.java @@ -18,6 +18,7 @@ package com.android.server.pm; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.pm.Flags; import android.content.pm.PackageManager; import dalvik.system.CloseGuard; @@ -76,8 +77,13 @@ final class PackageFreezer implements AutoCloseable { ps = mPm.mSettings.getPackageLPr(mPackageName); } if (ps != null) { - mPm.killApplication(ps.getPackageName(), ps.getAppId(), userId, killReason, - exitInfoReason); + if (Flags.waitApplicationKilled()) { + mPm.killApplicationSync(ps.getPackageName(), ps.getAppId(), userId, killReason, + exitInfoReason); + } else { + mPm.killApplication(ps.getPackageName(), ps.getAppId(), userId, killReason, + exitInfoReason); + } } mCloseGuard.open("close"); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ae485ede1bec..c935f188bc57 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -53,6 +53,7 @@ import android.annotation.StringRes; import android.annotation.UserIdInt; import android.annotation.WorkerThread; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.ApplicationExitInfo; import android.app.ApplicationPackageManager; @@ -3132,6 +3133,20 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + void killApplicationSync(String pkgName, @AppIdInt int appId, + @UserIdInt int userId, String reason, int exitInfoReason) { + ActivityManagerInternal mAmi = LocalServices.getService(ActivityManagerInternal.class); + if (mAmi != null) { + if (Thread.holdsLock(mLock)) { + // holds PM's lock, go back killApplication to avoid it run into watchdog reset. + Slog.e(TAG, "Holds PM's locker, unable kill application synchronized"); + killApplication(pkgName, appId, userId, reason, exitInfoReason); + } else { + mAmi.killApplicationSync(pkgName, appId, userId, reason, exitInfoReason); + } + } + } + @Override public void notifyPackageAdded(String packageName, int uid) { mPackageObserverHelper.notifyAdded(packageName, uid); |