Merge change 27106 into eclair

* changes:
  Use reflection to figure out a readable string from install error code.
This commit is contained in:
Android (Google) Code Review
2009-09-25 17:15:10 -04:00

View File

@@ -34,6 +34,8 @@ import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import java.io.File; import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@@ -42,21 +44,21 @@ import java.util.WeakHashMap;
public final class Pm { public final class Pm {
IPackageManager mPm; IPackageManager mPm;
private WeakHashMap<String, Resources> mResourceCache private WeakHashMap<String, Resources> mResourceCache
= new WeakHashMap<String, Resources>(); = new WeakHashMap<String, Resources>();
private String[] mArgs; private String[] mArgs;
private int mNextArg; private int mNextArg;
private String mCurArgData; private String mCurArgData;
private static final String PM_NOT_RUNNING_ERR = private static final String PM_NOT_RUNNING_ERR =
"Error: Could not access the Package Manager. Is the system running?"; "Error: Could not access the Package Manager. Is the system running?";
public static void main(String[] args) { public static void main(String[] args) {
new Pm().run(args); new Pm().run(args);
} }
public void run(String[] args) { public void run(String[] args) {
boolean validCommand = false; boolean validCommand = false;
if (args.length < 1) { if (args.length < 1) {
@@ -73,37 +75,37 @@ public final class Pm {
mArgs = args; mArgs = args;
String op = args[0]; String op = args[0];
mNextArg = 1; mNextArg = 1;
if ("list".equals(op)) { if ("list".equals(op)) {
runList(); runList();
return; return;
} }
if ("path".equals(op)) { if ("path".equals(op)) {
runPath(); runPath();
return; return;
} }
if ("install".equals(op)) { if ("install".equals(op)) {
runInstall(); runInstall();
return; return;
} }
if ("uninstall".equals(op)) { if ("uninstall".equals(op)) {
runUninstall(); runUninstall();
return; return;
} }
if ("enable".equals(op)) { if ("enable".equals(op)) {
runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
return; return;
} }
if ("disable".equals(op)) { if ("disable".equals(op)) {
runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
return; return;
} }
try { try {
if (args.length == 1) { if (args.length == 1) {
if (args[0].equalsIgnoreCase("-l")) { if (args[0].equalsIgnoreCase("-l")) {
@@ -128,10 +130,10 @@ public final class Pm {
} }
} }
} }
/** /**
* Execute the list sub-command. * Execute the list sub-command.
* *
* pm list [package | packages] * pm list [package | packages]
* pm list permission-groups * pm list permission-groups
* pm list permissions * pm list permissions
@@ -157,7 +159,7 @@ public final class Pm {
showUsage(); showUsage();
} }
} }
/** /**
* Lists all the installed packages. * Lists all the installed packages.
*/ */
@@ -182,10 +184,10 @@ public final class Pm {
showUsage(); showUsage();
return; return;
} }
try { try {
List<PackageInfo> packages = mPm.getInstalledPackages(0 /* all */); List<PackageInfo> packages = mPm.getInstalledPackages(0 /* all */);
int count = packages.size(); int count = packages.size();
for (int p = 0 ; p < count ; p++) { for (int p = 0 ; p < count ; p++) {
PackageInfo info = packages.get(p); PackageInfo info = packages.get(p);
@@ -201,10 +203,10 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
/** /**
* Lists all of the installed instrumentation, or all for a given package * Lists all of the installed instrumentation, or all for a given package
* *
* pm list instrumentation [package] [-f] * pm list instrumentation [package] [-f]
*/ */
private void runListInstrumentation() { private void runListInstrumentation() {
@@ -260,14 +262,14 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
/** /**
* Lists all the known permission groups. * Lists all the known permission groups.
*/ */
private void runListPermissionGroups() { private void runListPermissionGroups() {
try { try {
List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0);
int count = pgs.size(); int count = pgs.size();
for (int p = 0 ; p < count ; p++) { for (int p = 0 ; p < count ; p++) {
PermissionGroupInfo pgi = pgs.get(p); PermissionGroupInfo pgi = pgs.get(p);
@@ -279,7 +281,7 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) {
if (nonLocalized != null) { if (nonLocalized != null) {
return nonLocalized.toString(); return nonLocalized.toString();
@@ -290,7 +292,7 @@ public final class Pm {
} }
return null; return null;
} }
/** /**
* Lists all the permissions in a group. * Lists all the permissions in a group.
*/ */
@@ -321,7 +323,7 @@ public final class Pm {
return; return;
} }
} }
String grp = nextOption(); String grp = nextOption();
ArrayList<String> groupList = new ArrayList<String>(); ArrayList<String> groupList = new ArrayList<String>();
if (groups) { if (groups) {
@@ -334,7 +336,7 @@ public final class Pm {
} else { } else {
groupList.add(grp); groupList.add(grp);
} }
if (dangerousOnly) { if (dangerousOnly) {
System.out.println("Dangerous Permissions:"); System.out.println("Dangerous Permissions:");
System.out.println(""); System.out.println("");
@@ -365,7 +367,7 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
private void doListPermissions(ArrayList<String> groupList, private void doListPermissions(ArrayList<String> groupList,
boolean groups, boolean labels, boolean summary, boolean groups, boolean labels, boolean summary,
int startProtectionLevel, int endProtectionLevel) int startProtectionLevel, int endProtectionLevel)
@@ -385,7 +387,7 @@ public final class Pm {
pgi.nonLocalizedLabel) + ": "); pgi.nonLocalizedLabel) + ": ");
} else { } else {
System.out.print(pgi.name + ": "); System.out.print(pgi.name + ": ");
} }
} else { } else {
System.out.println((labels ? "+ " : "") System.out.println((labels ? "+ " : "")
@@ -468,13 +470,13 @@ public final class Pm {
} }
} }
} }
if (summary) { if (summary) {
System.out.println(""); System.out.println("");
} }
} }
} }
private void runPath() { private void runPath() {
String pkg = nextArg(); String pkg = nextArg();
if (pkg == null) { if (pkg == null) {
@@ -484,7 +486,7 @@ public final class Pm {
} }
displayPackageFilePath(pkg); displayPackageFilePath(pkg);
} }
class PackageInstallObserver extends IPackageInstallObserver.Stub { class PackageInstallObserver extends IPackageInstallObserver.Stub {
boolean finished; boolean finished;
int result; int result;
@@ -497,95 +499,40 @@ public final class Pm {
} }
} }
} }
/**
* Converts a failure code into a string by using reflection to find a matching constant
* in PackageManager.
*/
private String installFailureToString(int result) { private String installFailureToString(int result) {
String s; Field[] fields = PackageManager.class.getFields();
switch (result) { for (Field f: fields) {
case PackageManager.INSTALL_FAILED_ALREADY_EXISTS: if (f.getType() == int.class) {
s = "INSTALL_FAILED_ALREADY_EXISTS"; int modifiers = f.getModifiers();
break; // only look at public final static fields.
case PackageManager.INSTALL_FAILED_INVALID_APK: if (((modifiers & Modifier.FINAL) != 0) &&
s = "INSTALL_FAILED_INVALID_APK"; ((modifiers & Modifier.PUBLIC) != 0) &&
break; ((modifiers & Modifier.STATIC) != 0)) {
case PackageManager.INSTALL_FAILED_INVALID_URI: String fieldName = f.getName();
s = "INSTALL_FAILED_INVALID_URI"; if (fieldName.startsWith("INSTALL_FAILED_") ||
break; fieldName.startsWith("INSTALL_PARSE_FAILED_")) {
case PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE: // get the int value and compare it to result.
s = "INSTALL_FAILED_INSUFFICIENT_STORAGE"; try {
break; if (result == f.getInt(null)) {
case PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE: return fieldName;
s = "INSTALL_FAILED_DUPLICATE_PACKAGE"; }
break; } catch (IllegalAccessException e) {
case PackageManager.INSTALL_FAILED_NO_SHARED_USER: // this shouldn't happen since we only look for public static fields.
s = "INSTALL_FAILED_NO_SHARED_USER"; }
break; }
case PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE: }
s = "INSTALL_FAILED_UPDATE_INCOMPATIBLE"; }
break;
case PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE:
s = "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE";
break;
case PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY:
s = "INSTALL_FAILED_MISSING_SHARED_LIBRARY";
break;
case PackageManager.INSTALL_FAILED_DEXOPT:
s = "INSTALL_FAILED_DEXOPT";
break;
case PackageManager.INSTALL_FAILED_OLDER_SDK:
s = "INSTALL_FAILED_OLDER_SDK";
break;
case PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER:
s = "INSTALL_FAILED_CONFLICTING_PROVIDER";
break;
case PackageManager.INSTALL_FAILED_NEWER_SDK:
s = "INSTALL_FAILED_NEWER_SDK";
break;
case PackageManager.INSTALL_FAILED_TEST_ONLY:
s = "INSTALL_FAILED_TEST_ONLY";
break;
case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE:
s = "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE";
break;
case PackageManager.INSTALL_FAILED_MISSING_FEATURE:
s = "INSTALL_FAILED_MISSING_FEATURE";
break;
case PackageManager.INSTALL_PARSE_FAILED_NOT_APK:
s = "INSTALL_PARSE_FAILED_NOT_APK";
break;
case PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST:
s = "INSTALL_PARSE_FAILED_BAD_MANIFEST";
break;
case PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION:
s = "INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION";
break;
case PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES:
s = "INSTALL_PARSE_FAILED_NO_CERTIFICATES";
break;
case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES:
s = "INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES";
break;
case PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING:
s = "INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING";
break;
case PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME:
s = "INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME";
break;
case PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID:
s = "INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID";
break;
case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:
s = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED";
break;
case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY:
s = "INSTALL_PARSE_FAILED_MANIFEST_EMPTY";
break;
default:
s = Integer.toString(result);
break;
} }
return s;
// couldn't find a matching constant? return the value
return Integer.toString(result);
} }
private void runInstall() { private void runInstall() {
int installFlags = 0; int installFlags = 0;
String installerPackageName = null; String installerPackageName = null;
@@ -624,7 +571,7 @@ public final class Pm {
try { try {
mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags, mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,
installerPackageName); installerPackageName);
synchronized (obs) { synchronized (obs) {
while (!obs.finished) { while (!obs.finished) {
try { try {
@@ -645,11 +592,11 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
class PackageDeleteObserver extends IPackageDeleteObserver.Stub { class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
boolean finished; boolean finished;
boolean result; boolean result;
public void packageDeleted(boolean succeeded) { public void packageDeleted(boolean succeeded) {
synchronized (this) { synchronized (this) {
finished = true; finished = true;
@@ -658,7 +605,7 @@ public final class Pm {
} }
} }
} }
private void runUninstall() { private void runUninstall() {
int unInstallFlags = 0; int unInstallFlags = 0;
@@ -712,7 +659,7 @@ public final class Pm {
} }
return "unknown"; return "unknown";
} }
private void runSetEnabledSetting(int state) { private void runSetEnabledSetting(int state) {
String pkg = nextArg(); String pkg = nextArg();
if (pkg == null) { if (pkg == null) {
@@ -760,11 +707,11 @@ public final class Pm {
System.err.println(PM_NOT_RUNNING_ERR); System.err.println(PM_NOT_RUNNING_ERR);
} }
} }
private Resources getResources(PackageItemInfo pii) { private Resources getResources(PackageItemInfo pii) {
Resources res = mResourceCache.get(pii.packageName); Resources res = mResourceCache.get(pii.packageName);
if (res != null) return res; if (res != null) return res;
try { try {
ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0); ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0);
AssetManager am = new AssetManager(); AssetManager am = new AssetManager();
@@ -778,7 +725,7 @@ public final class Pm {
return null; return null;
} }
} }
private String nextOption() { private String nextOption() {
if (mNextArg >= mArgs.length) { if (mNextArg >= mArgs.length) {
return null; return null;
@@ -830,7 +777,7 @@ public final class Pm {
System.err.println(" pm list packages [-f]"); System.err.println(" pm list packages [-f]");
System.err.println(" pm list permission-groups"); System.err.println(" pm list permission-groups");
System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
System.err.println(" pm path PACKAGE"); System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH"); System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH");
System.err.println(" pm uninstall [-k] PACKAGE"); System.err.println(" pm uninstall [-k] PACKAGE");