Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -11094,6 +11094,7 @@ package android.content { field public static final String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE"; field @Deprecated public static final String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE"; field public static final String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS"; field public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL"; field public static final String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT"; field public static final String EXTRA_ASSIST_INPUT_DEVICE_ID = "android.intent.extra.ASSIST_INPUT_DEVICE_ID"; field public static final String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD"; core/java/android/content/Intent.java +8 −0 Original line number Diff line number Diff line Loading @@ -6269,6 +6269,14 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_ADDED} and * {@link android.content.Intent#ACTION_PACKAGE_REMOVED} intents to indicate that * the package is being archived. Either by removing the existing APK, or by installing * a package without an APK. */ public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that this is a system update uninstall. Loading services/core/java/com/android/server/pm/BroadcastHelper.java +6 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.server.pm; import static android.os.PowerExemptionManager.REASON_LOCKED_BOOT_COMPLETED; import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED; import static android.safetylabel.SafetyLabelConstants.SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED; import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; import static com.android.server.pm.PackageManagerService.PACKAGE_SCHEME; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; Loading Loading @@ -323,14 +322,17 @@ public final class BroadcastHelper { } } public void sendPackageAddedForNewUsers(String packageName, @AppIdInt int appId, int[] userIds, int[] instantUserIds, int dataLoaderType, SparseArray<int[]> broadcastAllowlist) { public void sendPackageAddedForNewUsers(String packageName, @AppIdInt int appId, int[] userIds, int[] instantUserIds, boolean isArchived, int dataLoaderType, SparseArray<int[]> broadcastAllowlist) { Bundle extras = new Bundle(1); // Set to UID of the first user, EXTRA_UID is automatically updated in sendPackageBroadcast final int uid = UserHandle.getUid( (ArrayUtils.isEmpty(userIds) ? instantUserIds[0] : userIds[0]), appId); extras.putInt(Intent.EXTRA_UID, uid); if (isArchived) { extras.putBoolean(Intent.EXTRA_ARCHIVAL, true); } extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, Loading services/core/java/com/android/server/pm/DeletePackageHelper.java +3 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import static android.content.pm.PackageManager.DELETE_KEEP_DATA; import static android.content.pm.PackageManager.DELETE_SUCCEEDED; import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION; import static com.android.server.pm.PackageManagerService.DEBUG_REMOVE; Loading Loading @@ -120,13 +119,14 @@ final class DeletePackageHelper { */ public int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags, boolean removedBySystem) { final boolean isArchived = false; // TODO(b/278553670) Pass true during archival. final PackageRemovedInfo info = new PackageRemovedInfo(mPm); final boolean res; final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 ? UserHandle.USER_ALL : userId; final PackageSetting uninstalledPs; final PackageSetting disabledSystemPs; final AndroidPackage pkg; Loading Loading @@ -250,7 +250,7 @@ final class DeletePackageHelper { if (res) { final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0; info.sendPackageRemovedBroadcasts(killApp, removedBySystem); info.sendPackageRemovedBroadcasts(killApp, removedBySystem, isArchived); info.sendSystemPackageUpdatedBroadcasts(); PackageMetrics.onUninstallSucceeded(info, deleteFlags, removeUser); } Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +44 −22 Original line number Diff line number Diff line Loading @@ -729,8 +729,10 @@ final class InstallPackageHelper { mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg()); } } // TODO(b/278553670) Store archive state for the user. boolean isArchived = (pkgSetting.getPkg() == null); mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId, DataLoaderType.NONE); isArchived, DataLoaderType.NONE); synchronized (mPm.mLock) { mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId }); } Loading Loading @@ -1713,7 +1715,6 @@ final class InstallPackageHelper { installedUsers = ps.queryInstalledUsers(allUsers, true); uninstalledUsers = ps.queryInstalledUsers(allUsers, false); // don't allow an upgrade from full to ephemeral if (isInstantApp) { if (request.getUserId() == UserHandle.USER_ALL) { Loading Loading @@ -2798,6 +2799,7 @@ final class InstallPackageHelper { final int dataLoaderType = request.getDataLoaderType(); final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED; final boolean update = request.isUpdate(); final boolean archived = request.isArchived(); final String packageName = request.getName(); final PackageStateInternal pkgSetting = succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null; Loading Loading @@ -2837,7 +2839,7 @@ final class InstallPackageHelper { false /* mediaStatus */, true /* replacing */, pkgNames, uids); } request.getRemovedInfo().sendPackageRemovedBroadcasts( killApp, false /*removedBySystem*/); killApp, false /*removedBySystem*/, false /*isArchived*/); } final String installerPackageName = Loading Loading @@ -2896,6 +2898,9 @@ final class InstallPackageHelper { if (update) { extras.putBoolean(Intent.EXTRA_REPLACING, true); } if (archived) { extras.putBoolean(Intent.EXTRA_ARCHIVAL, true); } extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType); // If a package is a static shared library, then only the installer of the package Loading @@ -2919,7 +2924,7 @@ final class InstallPackageHelper { boolean isSystem = request.isInstallSystem(); mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName, isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds, dataLoaderType); firstUserIds, firstInstantUserIds, archived, dataLoaderType); // Send PACKAGE_ADDED broadcast for users that don't see // the package for the first time Loading Loading @@ -3034,6 +3039,7 @@ final class InstallPackageHelper { if (DEBUG_INSTALL) { Slog.i(TAG, "upgrading pkg " + request.getPkg() + " is external"); } if (!archived) { final String[] pkgNames = new String[]{packageName}; final int[] uids = new int[]{request.getPkg().getUid()}; mBroadcastHelper.sendResourcesChangedBroadcast(mPm::snapshotComputer, Loading @@ -3041,6 +3047,7 @@ final class InstallPackageHelper { mPm.notifyResourcesChanged(true /* mediaStatus */, true /* replacing */, pkgNames, uids); } } } else if (!ArrayUtils.isEmpty(request.getLibraryConsumers())) { // if static shared lib // No need to kill consumers if it's installation of new version static shared lib. final Computer snapshot = mPm.snapshotComputer(); Loading Loading @@ -3092,6 +3099,7 @@ final class InstallPackageHelper { VMRuntime.getRuntime().requestConcurrentGC(); } if (!archived) { final Computer snapshot = mPm.snapshotComputer(); // Notify DexManager that the package was installed for new users. // The updated users should already be indexed and the package code paths Loading @@ -3106,6 +3114,20 @@ final class InstallPackageHelper { mDexManager.notifyPackageInstalled(info, userId); } } } else { // Now send PACKAGE_REMOVED + EXTRA_REPLACING broadcast. final PackageRemovedInfo info = new PackageRemovedInfo(mPm); info.mRemovedPackage = packageName; info.mInstallerPackageName = request.getInstallerPackageName(); info.mRemovedUsers = firstUserIds; info.mBroadcastUsers = firstUserIds; info.mRemovedAppId = request.getAppId(); info.mRemovedPackageVersionCode = request.getPkg().getLongVersionCode(); info.mRemovedForAllUsers = true; info.sendPackageRemovedBroadcasts(false /*killApp*/, false /*removedBySystem*/, true /*isArchived*/); } } final boolean deferInstallObserver = succeeded && update; Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -11094,6 +11094,7 @@ package android.content { field public static final String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE"; field @Deprecated public static final String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE"; field public static final String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS"; field public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL"; field public static final String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT"; field public static final String EXTRA_ASSIST_INPUT_DEVICE_ID = "android.intent.extra.ASSIST_INPUT_DEVICE_ID"; field public static final String EXTRA_ASSIST_INPUT_HINT_KEYBOARD = "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
core/java/android/content/Intent.java +8 −0 Original line number Diff line number Diff line Loading @@ -6269,6 +6269,14 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_ADDED} and * {@link android.content.Intent#ACTION_PACKAGE_REMOVED} intents to indicate that * the package is being archived. Either by removing the existing APK, or by installing * a package without an APK. */ public static final String EXTRA_ARCHIVAL = "android.intent.extra.ARCHIVAL"; /** * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} * intents to indicate that this is a system update uninstall. Loading
services/core/java/com/android/server/pm/BroadcastHelper.java +6 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.server.pm; import static android.os.PowerExemptionManager.REASON_LOCKED_BOOT_COMPLETED; import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED; import static android.safetylabel.SafetyLabelConstants.SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED; import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; import static com.android.server.pm.PackageManagerService.PACKAGE_SCHEME; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; Loading Loading @@ -323,14 +322,17 @@ public final class BroadcastHelper { } } public void sendPackageAddedForNewUsers(String packageName, @AppIdInt int appId, int[] userIds, int[] instantUserIds, int dataLoaderType, SparseArray<int[]> broadcastAllowlist) { public void sendPackageAddedForNewUsers(String packageName, @AppIdInt int appId, int[] userIds, int[] instantUserIds, boolean isArchived, int dataLoaderType, SparseArray<int[]> broadcastAllowlist) { Bundle extras = new Bundle(1); // Set to UID of the first user, EXTRA_UID is automatically updated in sendPackageBroadcast final int uid = UserHandle.getUid( (ArrayUtils.isEmpty(userIds) ? instantUserIds[0] : userIds[0]), appId); extras.putInt(Intent.EXTRA_UID, uid); if (isArchived) { extras.putBoolean(Intent.EXTRA_ARCHIVAL, true); } extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, Loading
services/core/java/com/android/server/pm/DeletePackageHelper.java +3 −3 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import static android.content.pm.PackageManager.DELETE_KEEP_DATA; import static android.content.pm.PackageManager.DELETE_SUCCEEDED; import static android.content.pm.PackageManager.MATCH_KNOWN_PACKAGES; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION; import static com.android.server.pm.PackageManagerService.DEBUG_REMOVE; Loading Loading @@ -120,13 +119,14 @@ final class DeletePackageHelper { */ public int deletePackageX(String packageName, long versionCode, int userId, int deleteFlags, boolean removedBySystem) { final boolean isArchived = false; // TODO(b/278553670) Pass true during archival. final PackageRemovedInfo info = new PackageRemovedInfo(mPm); final boolean res; final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 ? UserHandle.USER_ALL : userId; final PackageSetting uninstalledPs; final PackageSetting disabledSystemPs; final AndroidPackage pkg; Loading Loading @@ -250,7 +250,7 @@ final class DeletePackageHelper { if (res) { final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0; info.sendPackageRemovedBroadcasts(killApp, removedBySystem); info.sendPackageRemovedBroadcasts(killApp, removedBySystem, isArchived); info.sendSystemPackageUpdatedBroadcasts(); PackageMetrics.onUninstallSucceeded(info, deleteFlags, removeUser); } Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +44 −22 Original line number Diff line number Diff line Loading @@ -729,8 +729,10 @@ final class InstallPackageHelper { mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg()); } } // TODO(b/278553670) Store archive state for the user. boolean isArchived = (pkgSetting.getPkg() == null); mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId, DataLoaderType.NONE); isArchived, DataLoaderType.NONE); synchronized (mPm.mLock) { mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId }); } Loading Loading @@ -1713,7 +1715,6 @@ final class InstallPackageHelper { installedUsers = ps.queryInstalledUsers(allUsers, true); uninstalledUsers = ps.queryInstalledUsers(allUsers, false); // don't allow an upgrade from full to ephemeral if (isInstantApp) { if (request.getUserId() == UserHandle.USER_ALL) { Loading Loading @@ -2798,6 +2799,7 @@ final class InstallPackageHelper { final int dataLoaderType = request.getDataLoaderType(); final boolean succeeded = request.getReturnCode() == PackageManager.INSTALL_SUCCEEDED; final boolean update = request.isUpdate(); final boolean archived = request.isArchived(); final String packageName = request.getName(); final PackageStateInternal pkgSetting = succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null; Loading Loading @@ -2837,7 +2839,7 @@ final class InstallPackageHelper { false /* mediaStatus */, true /* replacing */, pkgNames, uids); } request.getRemovedInfo().sendPackageRemovedBroadcasts( killApp, false /*removedBySystem*/); killApp, false /*removedBySystem*/, false /*isArchived*/); } final String installerPackageName = Loading Loading @@ -2896,6 +2898,9 @@ final class InstallPackageHelper { if (update) { extras.putBoolean(Intent.EXTRA_REPLACING, true); } if (archived) { extras.putBoolean(Intent.EXTRA_ARCHIVAL, true); } extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType); // If a package is a static shared library, then only the installer of the package Loading @@ -2919,7 +2924,7 @@ final class InstallPackageHelper { boolean isSystem = request.isInstallSystem(); mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName, isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds, dataLoaderType); firstUserIds, firstInstantUserIds, archived, dataLoaderType); // Send PACKAGE_ADDED broadcast for users that don't see // the package for the first time Loading Loading @@ -3034,6 +3039,7 @@ final class InstallPackageHelper { if (DEBUG_INSTALL) { Slog.i(TAG, "upgrading pkg " + request.getPkg() + " is external"); } if (!archived) { final String[] pkgNames = new String[]{packageName}; final int[] uids = new int[]{request.getPkg().getUid()}; mBroadcastHelper.sendResourcesChangedBroadcast(mPm::snapshotComputer, Loading @@ -3041,6 +3047,7 @@ final class InstallPackageHelper { mPm.notifyResourcesChanged(true /* mediaStatus */, true /* replacing */, pkgNames, uids); } } } else if (!ArrayUtils.isEmpty(request.getLibraryConsumers())) { // if static shared lib // No need to kill consumers if it's installation of new version static shared lib. final Computer snapshot = mPm.snapshotComputer(); Loading Loading @@ -3092,6 +3099,7 @@ final class InstallPackageHelper { VMRuntime.getRuntime().requestConcurrentGC(); } if (!archived) { final Computer snapshot = mPm.snapshotComputer(); // Notify DexManager that the package was installed for new users. // The updated users should already be indexed and the package code paths Loading @@ -3106,6 +3114,20 @@ final class InstallPackageHelper { mDexManager.notifyPackageInstalled(info, userId); } } } else { // Now send PACKAGE_REMOVED + EXTRA_REPLACING broadcast. final PackageRemovedInfo info = new PackageRemovedInfo(mPm); info.mRemovedPackage = packageName; info.mInstallerPackageName = request.getInstallerPackageName(); info.mRemovedUsers = firstUserIds; info.mBroadcastUsers = firstUserIds; info.mRemovedAppId = request.getAppId(); info.mRemovedPackageVersionCode = request.getPkg().getLongVersionCode(); info.mRemovedForAllUsers = true; info.sendPackageRemovedBroadcasts(false /*killApp*/, false /*removedBySystem*/, true /*isArchived*/); } } final boolean deferInstallObserver = succeeded && update; Loading