Merge change 27106 into eclair
* changes: Use reflection to figure out a readable string from install error code.
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user