summaryrefslogtreecommitdiffstats
path: root/cmds/pm
diff options
context:
space:
mode:
authorKenny Guy <kennyguy@google.com>2014-05-14 19:53:22 +0100
committerKenny Guy <kennyguy@google.com>2014-05-23 18:37:34 +0100
commit1bdbd4be02aec4fd164ba41c164735639b9c7e15 (patch)
tree419c917e1813053a43af5af700563bb021bbcffb /cmds/pm
parent27692098d7afb77237a98d25da2e6cdfe0a85883 (diff)
downloadframeworks_base-1bdbd4be02aec4fd164ba41c164735639b9c7e15.zip
frameworks_base-1bdbd4be02aec4fd164ba41c164735639b9c7e15.tar.gz
frameworks_base-1bdbd4be02aec4fd164ba41c164735639b9c7e15.tar.bz2
Add ability to uninstall per user to adb shell pm.
Default is still uninstall for all users, but if --user is passed in it will just uninstall for that user. For system apps if --user is supplied it will uninstall rather than revert to the current system version. Change-Id: If1be0f78f01391f7ac6b53150dfeeccd0c002899
Diffstat (limited to 'cmds/pm')
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java49
1 files changed, 43 insertions, 6 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 5454b46..b7c2c22 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -1146,12 +1146,22 @@ public final class Pm {
}
private void runUninstall() {
- int unInstallFlags = PackageManager.DELETE_ALL_USERS;
+ int unInstallFlags = 0;
+ int userId = UserHandle.USER_ALL;
String opt;
while ((opt=nextOption()) != null) {
if (opt.equals("-k")) {
unInstallFlags |= PackageManager.DELETE_KEEP_DATA;
+ } else if (opt.equals("--user")) {
+ String param = nextArg();
+ if (isNumber(param)) {
+ userId = Integer.parseInt(param);
+ } else {
+ showUsage();
+ System.err.println("Error: Invalid user: " + param);
+ return;
+ }
} else {
System.err.println("Error: Unknown option: " + opt);
return;
@@ -1164,7 +1174,34 @@ public final class Pm {
showUsage();
return;
}
- boolean result = deletePackage(pkg, unInstallFlags);
+
+ if (userId == UserHandle.USER_ALL) {
+ userId = UserHandle.USER_OWNER;
+ unInstallFlags |= PackageManager.DELETE_ALL_USERS;
+ } else {
+ PackageInfo info;
+ try {
+ info = mPm.getPackageInfo(pkg, 0, userId);
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(PM_NOT_RUNNING_ERR);
+ return;
+ }
+ if (info == null) {
+ System.err.println("Failure - not installed for " + userId);
+ return;
+ }
+ final boolean isSystem =
+ (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+ // If we are being asked to delete a system app for just one
+ // user set flag so it disables rather than reverting to system
+ // version of the app.
+ if (isSystem) {
+ unInstallFlags |= PackageManager.DELETE_SYSTEM_APP;
+ }
+ }
+
+ boolean result = deletePackage(pkg, unInstallFlags, userId);
if (result) {
System.out.println("Success");
} else {
@@ -1172,10 +1209,10 @@ public final class Pm {
}
}
- private boolean deletePackage(String pkg, int unInstallFlags) {
+ private boolean deletePackage(String pkg, int unInstallFlags, int userId) {
PackageDeleteObserver obs = new PackageDeleteObserver();
try {
- mPm.deletePackageAsUser(pkg, obs, UserHandle.USER_OWNER, unInstallFlags);
+ mPm.deletePackageAsUser(pkg, obs, userId, unInstallFlags);
synchronized (obs) {
while (!obs.finished) {
@@ -1571,7 +1608,7 @@ public final class Pm {
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f]");
System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>]");
System.err.println(" [--originating-uri <URI>] [--referrer <URI>] PATH");
- System.err.println(" pm uninstall [-k] PACKAGE");
+ System.err.println(" pm uninstall [-k] [--user USER_ID] PACKAGE");
System.err.println(" pm clear [--user USER_ID] PACKAGE");
System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT");
System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT");
@@ -1585,7 +1622,7 @@ public final class Pm {
System.err.println(" pm get-install-location");
System.err.println(" pm set-permission-enforced PERMISSION [true|false]");
System.err.println(" pm trim-caches DESIRED_FREE_SPACE");
- System.err.println(" pm create-user [--relatedTo USER_ID] [--managed] USER_NAME");
+ System.err.println(" pm create-user [--profileOf USER_ID] [--managed] USER_NAME");
System.err.println(" pm remove-user USER_ID");
System.err.println(" pm get-max-users");
System.err.println("");