diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl index 9c1318ee52da0..081f263b698e7 100644 --- a/core/java/android/content/pm/IPackageInstallerSession.aidl +++ b/core/java/android/content/pm/IPackageInstallerSession.aidl @@ -69,4 +69,5 @@ interface IPackageInstallerSession { ParcelFileDescriptor getAppMetadataFd(); ParcelFileDescriptor openWriteAppMetadata(); + void removeAppMetadata(); } diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index d1f28ee42ed4f..f752c166fd69c 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1956,16 +1956,22 @@ public class PackageInstaller { /** * Optionally set the app metadata. The size of this data cannot exceed the maximum allowed. * Any existing data from the previous install will not be retained even if no data is set - * for the current install session. + * for the current install session. Setting data to null or an empty PersistableBundle will + * remove any metadata that has previously been set in the same session. * - * @param data a PersistableBundle containing the app metadata. If this is set to null then - * any existing app metadata will be removed. + * @param data a PersistableBundle containing the app metadata. * @throws IOException if writing the data fails. */ public void setAppMetadata(@Nullable PersistableBundle data) throws IOException { - if (data == null) { + if (data == null || data.isEmpty()) { + try { + mSession.removeAppMetadata(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } return; } + Objects.requireNonNull(data); try (OutputStream outputStream = openWriteAppMetadata()) { data.writeToStream(outputStream); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 47e18f1df774d..7a9d8ac4c235a 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1520,7 +1520,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { public ParcelFileDescriptor getAppMetadataFd() { assertCallerIsOwnerOrRoot(); synchronized (mLock) { - assertPreparedAndNotCommittedOrDestroyedLocked("openRead"); + assertPreparedAndNotCommittedOrDestroyedLocked("getAppMetadataFd"); + if (getStagedAppMetadataFile() == null) { + return null; + } try { return openReadInternalLocked(APP_METADATA_FILE_NAME); } catch (IOException e) { @@ -1529,6 +1532,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } + @Override + public void removeAppMetadata() { + File file = getStagedAppMetadataFile(); + if (file != null) { + file.delete(); + } + } + private static long getAppMetadataSizeLimit() { final long token = Binder.clearCallingIdentity(); try {