Loading services/core/java/android/content/pm/PackageManagerInternal.java +5 −0 Original line number Diff line number Diff line Loading @@ -656,6 +656,11 @@ public abstract class PackageManagerInternal { */ public abstract void notifyPackageUse(String packageName, int reason); /** * Notify the package is force stopped. */ public abstract void onPackageProcessKilledForUninstall(String packageName); /** * Returns a package object for the given package name. */ Loading services/core/java/com/android/server/am/ActivityManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -13595,6 +13595,8 @@ public class ActivityManagerService extends IActivityManager.Stub intent.getIntExtra(Intent.EXTRA_UID, -1)), false, true, true, false, fullUninstall, userId, removed ? "pkg removed" : "pkg changed"); getPackageManagerInternal() .onPackageProcessKilledForUninstall(ssp); } else { // Kill any app zygotes always, since they can't fork new // processes with references to the old code services/core/java/com/android/server/pm/InstallPackageHelper.java +6 −2 Original line number Diff line number Diff line Loading @@ -2893,9 +2893,13 @@ final class InstallPackageHelper { } } final boolean deferInstallObserver = succeeded && update && !killApp; final boolean deferInstallObserver = succeeded && update; if (deferInstallObserver) { if (killApp) { mPm.scheduleDeferredPendingKillInstallObserver(res, installObserver); } else { mPm.scheduleDeferredNoKillInstallObserver(res, installObserver); } } else { mPm.notifyInstallObserver(res, installObserver); } Loading services/core/java/com/android/server/pm/PackageHandler.java +6 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; import static com.android.server.pm.PackageManagerService.DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_INSTALL_OBSERVER; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_POST_DELETE; import static com.android.server.pm.PackageManagerService.DEFERRED_PENDING_KILL_INSTALL_OBSERVER; import static com.android.server.pm.PackageManagerService.DOMAIN_VERIFICATION; import static com.android.server.pm.PackageManagerService.ENABLE_ROLLBACK_STATUS; import static com.android.server.pm.PackageManagerService.ENABLE_ROLLBACK_TIMEOUT; Loading Loading @@ -126,10 +127,12 @@ final class PackageHandler extends Handler { } } } break; case DEFERRED_NO_KILL_INSTALL_OBSERVER: { String packageName = (String) msg.obj; case DEFERRED_NO_KILL_INSTALL_OBSERVER: case DEFERRED_PENDING_KILL_INSTALL_OBSERVER: { final String packageName = (String) msg.obj; if (packageName != null) { mPm.notifyInstallObserver(packageName); final boolean killApp = msg.what == DEFERRED_PENDING_KILL_INSTALL_OBSERVER; mPm.notifyInstallObserver(packageName, killApp); } } break; case WRITE_SETTINGS: { Loading services/core/java/com/android/server/pm/PackageManagerService.java +25 −4 Original line number Diff line number Diff line Loading @@ -840,6 +840,9 @@ public class PackageManagerService extends IPackageManager.Stub private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>> mNoKillInstallObservers = Collections.synchronizedMap(new HashMap<>()); private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>> mPendingKillInstallObservers = Collections.synchronizedMap(new HashMap<>()); // Internal interface for permission manager final PermissionManagerServiceInternal mPermissionManager; Loading Loading @@ -887,9 +890,11 @@ public class PackageManagerService extends IPackageManager.Stub static final int CHECK_PENDING_INTEGRITY_VERIFICATION = 26; static final int DOMAIN_VERIFICATION = 27; static final int PRUNE_UNUSED_STATIC_SHARED_LIBRARIES = 28; static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER = 29; static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000; private static final int DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS = 500; private static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS = 1000; static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds Loading Loading @@ -1166,13 +1171,14 @@ public class PackageManagerService extends IPackageManager.Stub Computer computer = snapshotComputer(); ArraySet<String> packagesToNotify = computer.getNotifyPackagesForReplacedReceived(packages); for (int index = 0; index < packagesToNotify.size(); index++) { notifyInstallObserver(packagesToNotify.valueAt(index)); notifyInstallObserver(packagesToNotify.valueAt(index), false /* killApp */); } } void notifyInstallObserver(String packageName) { Pair<PackageInstalledInfo, IPackageInstallObserver2> pair = mNoKillInstallObservers.remove(packageName); void notifyInstallObserver(String packageName, boolean killApp) { final Pair<PackageInstalledInfo, IPackageInstallObserver2> pair = killApp ? mPendingKillInstallObservers.remove(packageName) : mNoKillInstallObservers.remove(packageName); if (pair != null) { notifyInstallObserver(pair.first, pair.second); Loading Loading @@ -1211,6 +1217,15 @@ public class PackageManagerService extends IPackageManager.Stub delay ? getPruneUnusedSharedLibrariesDelay() : 0); } void scheduleDeferredPendingKillInstallObserver(PackageInstalledInfo info, IPackageInstallObserver2 observer) { final String packageName = info.mPkg.getPackageName(); mPendingKillInstallObservers.put(packageName, Pair.create(info, observer)); final Message message = mHandler.obtainMessage(DEFERRED_PENDING_KILL_INSTALL_OBSERVER, packageName); mHandler.sendMessageDelayed(message, DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS); } private static long getPruneUnusedSharedLibrariesDelay() { return SystemProperties.getLong("debug.pm.prune_unused_shared_libraries_delay", PRUNE_UNUSED_SHARED_LIBRARIES_DELAY); Loading Loading @@ -7392,6 +7407,12 @@ public class PackageManagerService extends IPackageManager.Stub } } @Override public void onPackageProcessKilledForUninstall(String packageName) { mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, true /* killApp */)); } @Override public SparseArray<String> getAppsWithSharedUserIds() { return mComputer.getAppsWithSharedUserIds(); Loading Loading
services/core/java/android/content/pm/PackageManagerInternal.java +5 −0 Original line number Diff line number Diff line Loading @@ -656,6 +656,11 @@ public abstract class PackageManagerInternal { */ public abstract void notifyPackageUse(String packageName, int reason); /** * Notify the package is force stopped. */ public abstract void onPackageProcessKilledForUninstall(String packageName); /** * Returns a package object for the given package name. */ Loading
services/core/java/com/android/server/am/ActivityManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -13595,6 +13595,8 @@ public class ActivityManagerService extends IActivityManager.Stub intent.getIntExtra(Intent.EXTRA_UID, -1)), false, true, true, false, fullUninstall, userId, removed ? "pkg removed" : "pkg changed"); getPackageManagerInternal() .onPackageProcessKilledForUninstall(ssp); } else { // Kill any app zygotes always, since they can't fork new // processes with references to the old code
services/core/java/com/android/server/pm/InstallPackageHelper.java +6 −2 Original line number Diff line number Diff line Loading @@ -2893,9 +2893,13 @@ final class InstallPackageHelper { } } final boolean deferInstallObserver = succeeded && update && !killApp; final boolean deferInstallObserver = succeeded && update; if (deferInstallObserver) { if (killApp) { mPm.scheduleDeferredPendingKillInstallObserver(res, installObserver); } else { mPm.scheduleDeferredNoKillInstallObserver(res, installObserver); } } else { mPm.notifyInstallObserver(res, installObserver); } Loading
services/core/java/com/android/server/pm/PackageHandler.java +6 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; import static com.android.server.pm.PackageManagerService.DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_INSTALL_OBSERVER; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_POST_DELETE; import static com.android.server.pm.PackageManagerService.DEFERRED_PENDING_KILL_INSTALL_OBSERVER; import static com.android.server.pm.PackageManagerService.DOMAIN_VERIFICATION; import static com.android.server.pm.PackageManagerService.ENABLE_ROLLBACK_STATUS; import static com.android.server.pm.PackageManagerService.ENABLE_ROLLBACK_TIMEOUT; Loading Loading @@ -126,10 +127,12 @@ final class PackageHandler extends Handler { } } } break; case DEFERRED_NO_KILL_INSTALL_OBSERVER: { String packageName = (String) msg.obj; case DEFERRED_NO_KILL_INSTALL_OBSERVER: case DEFERRED_PENDING_KILL_INSTALL_OBSERVER: { final String packageName = (String) msg.obj; if (packageName != null) { mPm.notifyInstallObserver(packageName); final boolean killApp = msg.what == DEFERRED_PENDING_KILL_INSTALL_OBSERVER; mPm.notifyInstallObserver(packageName, killApp); } } break; case WRITE_SETTINGS: { Loading
services/core/java/com/android/server/pm/PackageManagerService.java +25 −4 Original line number Diff line number Diff line Loading @@ -840,6 +840,9 @@ public class PackageManagerService extends IPackageManager.Stub private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>> mNoKillInstallObservers = Collections.synchronizedMap(new HashMap<>()); private final Map<String, Pair<PackageInstalledInfo, IPackageInstallObserver2>> mPendingKillInstallObservers = Collections.synchronizedMap(new HashMap<>()); // Internal interface for permission manager final PermissionManagerServiceInternal mPermissionManager; Loading Loading @@ -887,9 +890,11 @@ public class PackageManagerService extends IPackageManager.Stub static final int CHECK_PENDING_INTEGRITY_VERIFICATION = 26; static final int DOMAIN_VERIFICATION = 27; static final int PRUNE_UNUSED_STATIC_SHARED_LIBRARIES = 28; static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER = 29; static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000; private static final int DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS = 500; private static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS = 1000; static final int WRITE_SETTINGS_DELAY = 10*1000; // 10 seconds Loading Loading @@ -1166,13 +1171,14 @@ public class PackageManagerService extends IPackageManager.Stub Computer computer = snapshotComputer(); ArraySet<String> packagesToNotify = computer.getNotifyPackagesForReplacedReceived(packages); for (int index = 0; index < packagesToNotify.size(); index++) { notifyInstallObserver(packagesToNotify.valueAt(index)); notifyInstallObserver(packagesToNotify.valueAt(index), false /* killApp */); } } void notifyInstallObserver(String packageName) { Pair<PackageInstalledInfo, IPackageInstallObserver2> pair = mNoKillInstallObservers.remove(packageName); void notifyInstallObserver(String packageName, boolean killApp) { final Pair<PackageInstalledInfo, IPackageInstallObserver2> pair = killApp ? mPendingKillInstallObservers.remove(packageName) : mNoKillInstallObservers.remove(packageName); if (pair != null) { notifyInstallObserver(pair.first, pair.second); Loading Loading @@ -1211,6 +1217,15 @@ public class PackageManagerService extends IPackageManager.Stub delay ? getPruneUnusedSharedLibrariesDelay() : 0); } void scheduleDeferredPendingKillInstallObserver(PackageInstalledInfo info, IPackageInstallObserver2 observer) { final String packageName = info.mPkg.getPackageName(); mPendingKillInstallObservers.put(packageName, Pair.create(info, observer)); final Message message = mHandler.obtainMessage(DEFERRED_PENDING_KILL_INSTALL_OBSERVER, packageName); mHandler.sendMessageDelayed(message, DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS); } private static long getPruneUnusedSharedLibrariesDelay() { return SystemProperties.getLong("debug.pm.prune_unused_shared_libraries_delay", PRUNE_UNUSED_SHARED_LIBRARIES_DELAY); Loading Loading @@ -7392,6 +7407,12 @@ public class PackageManagerService extends IPackageManager.Stub } } @Override public void onPackageProcessKilledForUninstall(String packageName) { mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, true /* killApp */)); } @Override public SparseArray<String> getAppsWithSharedUserIds() { return mComputer.getAppsWithSharedUserIds(); Loading