From 28bdd94cf0909eb9500fd521cd84d7f400228e72 Mon Sep 17 00:00:00 2001 From: Jakob Schneider Date: Fri, 15 Sep 2023 16:22:18 +0100 Subject: Add broadcasts for archiving and unarchiving. Bug: 290911359 Test: PackageInstallerArchiveTest Change-Id: If37d3fda7de8419aa320c6cc9be6dce77231f5b8 --- core/java/android/content/pm/PackageManager.java | 9 +++++++++ .../core/java/com/android/server/pm/DeletePackageHelper.java | 4 ++-- services/core/java/com/android/server/pm/PackageArchiver.java | 6 +++++- .../src/com/android/server/pm/PackageArchiverTest.java | 3 ++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index cdab431558df..3bd6a099ba2f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2548,6 +2548,15 @@ public abstract class PackageManager { */ public static final int DELETE_DONT_KILL_APP = 0x00000008; + /** + * Flag parameter for {@link #deletePackage} to indicate that the deletion is an archival. This + * flag is only for internal usage as part of + * {@link PackageInstaller#requestArchive(String, IntentSender)}. + * + * @hide + */ + public static final int DELETE_ARCHIVE = 0x00000010; + /** * Flag parameter for {@link #deletePackage} to indicate that package deletion * should be chatty. diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 7d59210044d0..caf263dac823 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -24,6 +24,7 @@ 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; @@ -119,8 +120,6 @@ 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; @@ -250,6 +249,7 @@ final class DeletePackageHelper { if (res) { final boolean killApp = (deleteFlags & PackageManager.DELETE_DONT_KILL_APP) == 0; + final boolean isArchived = (deleteFlags & PackageManager.DELETE_ARCHIVE) != 0; info.sendPackageRemovedBroadcasts(killApp, removedBySystem, isArchived); info.sendSystemPackageUpdatedBroadcasts(); PackageMetrics.onUninstallSucceeded(info, deleteFlags, removeUser); diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java index e8be748a85d1..803b6e45cdca 100644 --- a/services/core/java/com/android/server/pm/PackageArchiver.java +++ b/services/core/java/com/android/server/pm/PackageArchiver.java @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED; +import static android.content.pm.PackageManager.DELETE_ARCHIVE; import static android.content.pm.PackageManager.DELETE_KEEP_DATA; import static android.os.PowerExemptionManager.REASON_PACKAGE_UNARCHIVE; import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED; @@ -142,7 +143,10 @@ public class PackageArchiver { mPm.mInstallerService.uninstall( new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), - callerPackageName, DELETE_KEEP_DATA, intentSender, userId, + callerPackageName, + DELETE_ARCHIVE | DELETE_KEEP_DATA, + intentSender, + userId, binderUid); }) .exceptionally( diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java index 614fd11e0517..b97fd4b3277b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java @@ -17,6 +17,7 @@ package com.android.server.pm; import static android.content.Intent.FLAG_RECEIVER_FOREGROUND; +import static android.content.pm.PackageManager.DELETE_ARCHIVE; import static android.content.pm.PackageManager.DELETE_KEEP_DATA; import static com.google.common.truth.Truth.assertThat; @@ -275,7 +276,7 @@ public class PackageArchiverTest { verify(mInstallerService).uninstall( eq(new VersionedPackage(PACKAGE, PackageManager.VERSION_CODE_HIGHEST)), - eq(CALLER_PACKAGE), eq(DELETE_KEEP_DATA), eq(mIntentSender), + eq(CALLER_PACKAGE), eq(DELETE_ARCHIVE | DELETE_KEEP_DATA), eq(mIntentSender), eq(UserHandle.CURRENT.getIdentifier()), anyInt()); assertThat(mPackageSetting.readUserState( UserHandle.CURRENT.getIdentifier()).getArchiveState()).isEqualTo( -- cgit v1.2.3-59-g8ed1b