Loading core/java/android/content/pm/IPackageInstaller.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,9 @@ interface IPackageInstaller { void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags, void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags, in IntentSender statusReceiver, int userId); in IntentSender statusReceiver, int userId); void uninstallExistingPackage(in VersionedPackage versionedPackage, String callerPackageName, in IntentSender statusReceiver, int userId); void installExistingPackage(String packageName, int installFlags, int installReason, void installExistingPackage(String packageName, int installFlags, int installReason, in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions); in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions); Loading core/java/android/content/pm/IPackageManager.aidl +10 −0 Original line number Original line Diff line number Diff line Loading @@ -235,6 +235,16 @@ interface IPackageManager { void deletePackageVersioned(in VersionedPackage versionedPackage, void deletePackageVersioned(in VersionedPackage versionedPackage, IPackageDeleteObserver2 observer, int userId, int flags); IPackageDeleteObserver2 observer, int userId, int flags); /** * Delete a package for a specific user. * * @param versionedPackage The package to delete. * @param observer a callback to use to notify when the package deletion in finished. * @param userId the id of the user for whom to delete the package */ void deleteExistingPackageAsUser(in VersionedPackage versionedPackage, IPackageDeleteObserver2 observer, int userId); @UnsupportedAppUsage @UnsupportedAppUsage String getInstallerPackageName(in String packageName); String getInstallerPackageName(in String packageName); Loading core/java/android/content/pm/PackageInstaller.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -720,6 +720,27 @@ public class PackageInstaller { } } } } /** * Uninstall the given package for the user for which this installer was created if the package * will still exist for other users on the device. * * @param packageName The package to install. * @param statusReceiver Where to deliver the result. * * {@hide} */ @RequiresPermission(Manifest.permission.DELETE_PACKAGES) public void uninstallExistingPackage(@NonNull String packageName, @Nullable IntentSender statusReceiver) { Objects.requireNonNull(packageName, "packageName cannot be null"); try { mInstaller.uninstallExistingPackage( new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), mInstallerPackageName, statusReceiver, mUserId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** {@hide} */ /** {@hide} */ @SystemApi @SystemApi Loading services/core/java/com/android/server/pm/PackageInstallerService.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -933,6 +933,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } } @Override public void uninstallExistingPackage(VersionedPackage versionedPackage, String callerPackageName, IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null); mPermissionManager.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext, statusReceiver, versionedPackage.getPackageName(), false, userId); mPm.deleteExistingPackageAsUser(versionedPackage, adapter.getBinder(), userId); } @Override @Override public void installExistingPackage(String packageName, int installFlags, int installReason, public void installExistingPackage(String packageName, int installFlags, int installReason, IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) { IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) { Loading services/core/java/com/android/server/pm/PackageManagerService.java +39 −0 Original line number Original line Diff line number Diff line Loading @@ -17910,9 +17910,47 @@ public class PackageManagerService extends IPackageManager.Stub new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); } } @Override public void deleteExistingPackageAsUser(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); Preconditions.checkNotNull(versionedPackage); Preconditions.checkNotNull(observer); final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); int installedForUsersCount = 0; synchronized (mLock) { // Normalize package name to handle renamed packages and static libs final String internalPkgName = resolveInternalPackageNameLPr(packageName, versionCode); final PackageSetting ps = mSettings.getPackageLPr(internalPkgName); if (ps != null) { int[] installedUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), true); installedForUsersCount = installedUsers.length; } } if (installedForUsersCount > 1) { deletePackageVersionedInternal(versionedPackage, observer, userId, 0, true); } else { try { observer.onPackageDeleted(packageName, PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); } catch (RemoteException re) { } } } @Override @Override public void deletePackageVersioned(VersionedPackage versionedPackage, public void deletePackageVersioned(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { deletePackageVersionedInternal(versionedPackage, observer, userId, deleteFlags, false); } private void deletePackageVersionedInternal(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags, final boolean allowSilentUninstall) { final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); android.Manifest.permission.DELETE_PACKAGES, null); Loading @@ -17933,6 +17971,7 @@ public class PackageManagerService extends IPackageManager.Stub final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid(); if (!isOrphaned(internalPackageName) if (!isOrphaned(internalPackageName) && !allowSilentUninstall && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { mHandler.post(() -> { mHandler.post(() -> { try { try { Loading
core/java/android/content/pm/IPackageInstaller.aidl +3 −0 Original line number Original line Diff line number Diff line Loading @@ -51,6 +51,9 @@ interface IPackageInstaller { void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags, void uninstall(in VersionedPackage versionedPackage, String callerPackageName, int flags, in IntentSender statusReceiver, int userId); in IntentSender statusReceiver, int userId); void uninstallExistingPackage(in VersionedPackage versionedPackage, String callerPackageName, in IntentSender statusReceiver, int userId); void installExistingPackage(String packageName, int installFlags, int installReason, void installExistingPackage(String packageName, int installFlags, int installReason, in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions); in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions); Loading
core/java/android/content/pm/IPackageManager.aidl +10 −0 Original line number Original line Diff line number Diff line Loading @@ -235,6 +235,16 @@ interface IPackageManager { void deletePackageVersioned(in VersionedPackage versionedPackage, void deletePackageVersioned(in VersionedPackage versionedPackage, IPackageDeleteObserver2 observer, int userId, int flags); IPackageDeleteObserver2 observer, int userId, int flags); /** * Delete a package for a specific user. * * @param versionedPackage The package to delete. * @param observer a callback to use to notify when the package deletion in finished. * @param userId the id of the user for whom to delete the package */ void deleteExistingPackageAsUser(in VersionedPackage versionedPackage, IPackageDeleteObserver2 observer, int userId); @UnsupportedAppUsage @UnsupportedAppUsage String getInstallerPackageName(in String packageName); String getInstallerPackageName(in String packageName); Loading
core/java/android/content/pm/PackageInstaller.java +21 −0 Original line number Original line Diff line number Diff line Loading @@ -720,6 +720,27 @@ public class PackageInstaller { } } } } /** * Uninstall the given package for the user for which this installer was created if the package * will still exist for other users on the device. * * @param packageName The package to install. * @param statusReceiver Where to deliver the result. * * {@hide} */ @RequiresPermission(Manifest.permission.DELETE_PACKAGES) public void uninstallExistingPackage(@NonNull String packageName, @Nullable IntentSender statusReceiver) { Objects.requireNonNull(packageName, "packageName cannot be null"); try { mInstaller.uninstallExistingPackage( new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), mInstallerPackageName, statusReceiver, mUserId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** {@hide} */ /** {@hide} */ @SystemApi @SystemApi Loading
services/core/java/com/android/server/pm/PackageInstallerService.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -933,6 +933,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } } @Override public void uninstallExistingPackage(VersionedPackage versionedPackage, String callerPackageName, IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null); mPermissionManager.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext, statusReceiver, versionedPackage.getPackageName(), false, userId); mPm.deleteExistingPackageAsUser(versionedPackage, adapter.getBinder(), userId); } @Override @Override public void installExistingPackage(String packageName, int installFlags, int installReason, public void installExistingPackage(String packageName, int installFlags, int installReason, IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) { IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) { Loading
services/core/java/com/android/server/pm/PackageManagerService.java +39 −0 Original line number Original line Diff line number Diff line Loading @@ -17910,9 +17910,47 @@ public class PackageManagerService extends IPackageManager.Stub new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); new LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); } } @Override public void deleteExistingPackageAsUser(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); Preconditions.checkNotNull(versionedPackage); Preconditions.checkNotNull(observer); final String packageName = versionedPackage.getPackageName(); final long versionCode = versionedPackage.getLongVersionCode(); int installedForUsersCount = 0; synchronized (mLock) { // Normalize package name to handle renamed packages and static libs final String internalPkgName = resolveInternalPackageNameLPr(packageName, versionCode); final PackageSetting ps = mSettings.getPackageLPr(internalPkgName); if (ps != null) { int[] installedUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), true); installedForUsersCount = installedUsers.length; } } if (installedForUsersCount > 1) { deletePackageVersionedInternal(versionedPackage, observer, userId, 0, true); } else { try { observer.onPackageDeleted(packageName, PackageManager.DELETE_FAILED_INTERNAL_ERROR, null); } catch (RemoteException re) { } } } @Override @Override public void deletePackageVersioned(VersionedPackage versionedPackage, public void deletePackageVersioned(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { deletePackageVersionedInternal(versionedPackage, observer, userId, deleteFlags, false); } private void deletePackageVersionedInternal(VersionedPackage versionedPackage, final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags, final boolean allowSilentUninstall) { final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); android.Manifest.permission.DELETE_PACKAGES, null); Loading @@ -17933,6 +17971,7 @@ public class PackageManagerService extends IPackageManager.Stub final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid(); if (!isOrphaned(internalPackageName) if (!isOrphaned(internalPackageName) && !allowSilentUninstall && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { mHandler.post(() -> { mHandler.post(() -> { try { try {