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

Commit 060d5a0e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "When uninstalling, only kill the requested user." into nyc-dev

parents f829cb95 85f449ea
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -1813,12 +1813,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case KILL_APPLICATION_WITH_APPID_TRANSACTION: {
        case KILL_APPLICATION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            String pkg = data.readString();
            int appid = data.readInt();
            int appId = data.readInt();
            int userId = data.readInt();
            String reason = data.readString();
            killApplicationWithAppId(pkg, appid, reason);
            killApplication(pkg, appId, userId, reason);
            reply.writeNoException();
            return true;
        }
@@ -5291,15 +5292,16 @@ class ActivityManagerProxy implements IActivityManager
        reply.recycle();
    }

    public void killApplicationWithAppId(String pkg, int appid, String reason)
    public void killApplication(String pkg, int appId, int userId, String reason)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(pkg);
        data.writeInt(appid);
        data.writeInt(appId);
        data.writeInt(userId);
        data.writeString(reason);
        mRemote.transact(KILL_APPLICATION_WITH_APPID_TRANSACTION, data, reply, 0);
        mRemote.transact(KILL_APPLICATION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
+2 −2
Original line number Diff line number Diff line
@@ -398,7 +398,7 @@ public interface IActivityManager extends IInterface {

    public void addPackageDependency(String packageName) throws RemoteException;

    public void killApplicationWithAppId(String pkg, int appid, String reason)
    public void killApplication(String pkg, int appId, int userId, String reason)
            throws RemoteException;

    public void closeSystemDialogs(String reason) throws RemoteException;
@@ -852,7 +852,7 @@ public interface IActivityManager extends IInterface {
    int GET_UID_FOR_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+92;
    int HANDLE_INCOMING_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+93;
    int ADD_PACKAGE_DEPENDENCY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94;
    int KILL_APPLICATION_WITH_APPID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95;
    int KILL_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95;
    int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
    int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97;
    int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
+3 −2
Original line number Diff line number Diff line
@@ -827,8 +827,9 @@ class MountService extends IMountService.Stub
                if (provider != null) {
                    final IActivityManager am = ActivityManagerNative.getDefault();
                    try {
                        am.killApplicationWithAppId(provider.applicationInfo.packageName,
                                UserHandle.getAppId(provider.applicationInfo.uid), "vold reset");
                        am.killApplication(provider.applicationInfo.packageName,
                                UserHandle.getAppId(provider.applicationInfo.uid),
                                UserHandle.USER_ALL, "vold reset");
                        // We only need to run this once. It will kill all users' media processes.
                        break;
                    } catch (RemoteException e) {
+8 −8
Original line number Diff line number Diff line
@@ -1849,13 +1849,13 @@ public final class ActivityManagerService extends ActivityManagerNative
            } break;
            case KILL_APPLICATION_MSG: {
                synchronized (ActivityManagerService.this) {
                    int appid = msg.arg1;
                    boolean restart = (msg.arg2 == 1);
                    final int appId = msg.arg1;
                    final int userId = msg.arg2;
                    Bundle bundle = (Bundle)msg.obj;
                    String pkg = bundle.getString("pkg");
                    String reason = bundle.getString("reason");
                    forceStopPackageLocked(pkg, appid, restart, false, true, false,
                            false, UserHandle.USER_ALL, reason);
                    forceStopPackageLocked(pkg, appId, false, false, true, false,
                            false, userId, reason);
                }
            } break;
            case FINALIZE_PENDING_INTENT_MSG: {
@@ -5717,12 +5717,12 @@ public final class ActivityManagerService extends ActivityManagerNative
     * The pkg name and app id have to be specified.
     */
    @Override
    public void killApplicationWithAppId(String pkg, int appid, String reason) {
    public void killApplication(String pkg, int appId, int userId, String reason) {
        if (pkg == null) {
            return;
        }
        // Make sure the uid is valid.
        if (appid < 0) {
        if (appId < 0) {
            Slog.w(TAG, "Invalid appid specified for pkg : " + pkg);
            return;
        }
@@ -5731,8 +5731,8 @@ public final class ActivityManagerService extends ActivityManagerNative
        if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) {
            // Post an aysnc message to kill the application
            Message msg = mHandler.obtainMessage(KILL_APPLICATION_MSG);
            msg.arg1 = appid;
            msg.arg2 = 0;
            msg.arg1 = appId;
            msg.arg2 = userId;
            Bundle bundle = new Bundle();
            bundle.putString("pkg", pkg);
            bundle.putString("reason", reason);
+42 −14
Original line number Diff line number Diff line
@@ -9534,6 +9534,10 @@ public class PackageManagerService extends IPackageManager.Stub {
    }
    private void killApplication(String pkgName, int appId, String reason) {
        killApplication(pkgName, appId, UserHandle.USER_ALL, reason);
    }
    private void killApplication(String pkgName, int appId, int userId, String reason) {
        // Request the ActivityManager to kill the process(only for existing packages)
        // so that we do not end up in a confused state while the user is still using the older
        // version of the application while the new one gets installed.
@@ -9542,7 +9546,7 @@ public class PackageManagerService extends IPackageManager.Stub {
            IActivityManager am = ActivityManagerNative.getDefault();
            if (am != null) {
                try {
                    am.killApplicationWithAppId(pkgName, appId, reason);
                    am.killApplication(pkgName, appId, userId, reason);
                } catch (RemoteException e) {
                }
            }
@@ -15555,10 +15559,10 @@ public class PackageManagerService extends IPackageManager.Stub {
        final PackageRemovedInfo info = new PackageRemovedInfo();
        final boolean res;
        final UserHandle removeForUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0
                ? UserHandle.ALL : new UserHandle(userId);
        final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0
                ? UserHandle.USER_ALL : userId;
        if (isPackageDeviceAdmin(packageName, removeForUser.getIdentifier())) {
        if (isPackageDeviceAdmin(packageName, removeUser)) {
            Slog.w(TAG, "Not removing package " + packageName + ": has active device admin");
            return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
        }
@@ -15578,11 +15582,21 @@ public class PackageManagerService extends IPackageManager.Stub {
            info.origUsers = uninstalledPs.queryInstalledUsers(allUsers, true);
        }
        final int freezeUser;
        if (isUpdatedSystemApp(uninstalledPs)
                && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) {
            // We're downgrading a system app, which will apply to all users, so
            // freeze them all during the downgrade
            freezeUser = UserHandle.USER_ALL;
        } else {
            freezeUser = removeUser;
        }
        synchronized (mInstallLock) {
            if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageX: pkg=" + packageName + " user=" + userId);
            try (PackageFreezer freezer = freezePackageForDelete(packageName, deleteFlags,
                    "deletePackageX")) {
                res = deletePackageLIF(packageName, removeForUser, true, allUsers,
            try (PackageFreezer freezer = freezePackageForDelete(packageName, freezeUser,
                    deleteFlags, "deletePackageX")) {
                res = deletePackageLIF(packageName, UserHandle.of(removeUser), true, allUsers,
                        deleteFlags | REMOVE_CHATTY, info, true, null);
            }
            synchronized (mPackages) {
@@ -19837,24 +19851,38 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
    }
    public PackageFreezer freezePackage(String packageName, String killReason) {
        return new PackageFreezer(packageName, killReason);
        return freezePackage(packageName, UserHandle.USER_ALL, killReason);
    }
    public PackageFreezer freezePackage(String packageName, int userId, String killReason) {
        return new PackageFreezer(packageName, userId, killReason);
    }
    public PackageFreezer freezePackageForInstall(String packageName, int installFlags,
            String killReason) {
        return freezePackageForInstall(packageName, UserHandle.USER_ALL, installFlags, killReason);
    }
    public PackageFreezer freezePackageForInstall(String packageName, int userId, int installFlags,
            String killReason) {
        if ((installFlags & PackageManager.INSTALL_DONT_KILL_APP) != 0) {
            return new PackageFreezer();
        } else {
            return freezePackage(packageName, killReason);
            return freezePackage(packageName, userId, killReason);
        }
    }
    public PackageFreezer freezePackageForDelete(String packageName, int deleteFlags,
            String killReason) {
        return freezePackageForDelete(packageName, UserHandle.USER_ALL, deleteFlags, killReason);
    }
    public PackageFreezer freezePackageForDelete(String packageName, int userId, int deleteFlags,
            String killReason) {
        if ((deleteFlags & PackageManager.DELETE_DONT_KILL_APP) != 0) {
            return new PackageFreezer();
        } else {
            return freezePackage(packageName, killReason);
            return freezePackage(packageName, userId, killReason);
        }
    }
@@ -19885,14 +19913,14 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
            mCloseGuard.open("close");
        }
        public PackageFreezer(String packageName, String killReason) {
        public PackageFreezer(String packageName, int userId, String killReason) {
            synchronized (mPackages) {
                mPackageName = packageName;
                mWeFroze = mFrozenPackages.add(mPackageName);
                final PackageSetting ps = mSettings.mPackages.get(mPackageName);
                if (ps != null) {
                    killApplication(ps.name, ps.appId, killReason);
                    killApplication(ps.name, ps.appId, userId, killReason);
                }
                final PackageParser.Package p = mPackages.get(packageName);
@@ -19901,7 +19929,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
                    mChildren = new PackageFreezer[N];
                    for (int i = 0; i < N; i++) {
                        mChildren[i] = new PackageFreezer(p.childPackages.get(i).packageName,
                                killReason);
                                userId, killReason);
                    }
                } else {
                    mChildren = null;
@@ -20040,7 +20068,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
            seinfo = pkg.applicationInfo.seinfo;
            label = String.valueOf(pm.getApplicationLabel(pkg.applicationInfo));
            targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
            freezer = new PackageFreezer(packageName, "movePackageInternal");
            freezer = freezePackage(packageName, "movePackageInternal");
            installedUserIds = ps.queryInstalledUsers(sUserManager.getUserIds(), true);
        }