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

Commit 7b612cc0 authored by TYM Tsai's avatar TYM Tsai
Browse files

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
parent b533e85d
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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);
}
+20 −0
Original line number Diff line number Diff line
@@ -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) {
+8 −2
Original line number Diff line number Diff line
@@ -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,9 +77,14 @@ final class PackageFreezer implements AutoCloseable {
            ps = mPm.mSettings.getPackageLPr(mPackageName);
        }
        if (ps != null) {
            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");
    }

+15 −0
Original line number Diff line number Diff line
@@ -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);