Pm.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.pm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PM_NOT_RUNNING_ERR = 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Pm().run(args); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run(String[] args) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PackageInfo> packages = mPm.getInstalledPackages(0 /* all */); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showApplicationPackage) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(info.applicationInfo.sourceDir); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.packageName); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = getResources(pii); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r.getString(res); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi.protectionLevel < startProtectionLevel 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || pi.protectionLevel > endProtectionLevel) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String protLevel = "unknown"; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(pi.protectionLevel) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_DANGEROUS: 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "dangerous"; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_NORMAL: 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "normal"; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE: 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signature"; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signatureOrSystem"; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " protectionLevel:" + protLevel); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageInstallObserver extends IPackageInstallObserver.Stub { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageInstalled(String name, int status) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized( this) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String installFailureToString(int result) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (result) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_ALREADY_EXISTS: 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_ALREADY_EXISTS"; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_INVALID_APK: 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_INVALID_APK"; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_INVALID_URI: 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_INVALID_URI"; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE: 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_INSUFFICIENT_STORAGE"; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE: 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_DUPLICATE_PACKAGE"; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_NO_SHARED_USER: 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_NO_SHARED_USER"; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE: 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_UPDATE_INCOMPATIBLE"; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE"; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY: 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_MISSING_SHARED_LIBRARY"; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE: 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_REPLACE_COULDNT_DELETE"; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_NOT_APK: 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_NOT_APK"; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST: 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_BAD_MANIFEST"; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION"; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES: 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_NO_CERTIFICATES"; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES: 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES"; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING: 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING"; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME: 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME"; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID: 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID"; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED"; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY: 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_PARSE_FAILED_MANIFEST_EMPTY"; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.INSTALL_FAILED_OLDER_SDK: 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = "INSTALL_FAILED_OLDER_SDK"; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s = Integer.toString(result); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int installFlags = 0; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project installFlags |= PackageManager.FORWARD_LOCK_PACKAGE; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String apkFilePath = nextArg(); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apkFilePath == null) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInstallObserver obs = new PackageInstallObserver(); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + installFailureToString(obs.result) 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageDeleted(boolean succeeded) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = succeeded; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runUninstall() { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int unInstallFlags = 0; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt = nextOption(); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt != null && opt.equals("-k")) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unInstallFlags = PackageManager.DONT_DELETE_DATA; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = deletePackage(pkg, unInstallFlags); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Failure"); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean deletePackage(String pkg, int unInstallFlags) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageDeleteObserver obs = new PackageDeleteObserver(); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.deletePackage(pkg, obs, unInstallFlags); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obs.result; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setApplicationEnabledSetting(pkg, state, 0); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getApplicationEnabledSetting(pkg))); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setComponentEnabledSetting(cn, state, 0); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getComponentEnabledSetting(cn))); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = mPm.getPackageInfo(pckg, 0); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("usage: pm [list|path|install|uninstall]"); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list packages [-f]"); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm install [-l] [-r] PATH"); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm uninstall [-k] PACKAGE"); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm enable PACKAGE_OR_COMPONENT"); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm disable PACKAGE_OR_COMPONENT"); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list packages command prints all packages. Use"); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -f option to see their associated file."); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list permission-groups command prints all known"); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("permission groups."); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list permissions command prints all known"); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("permissions, optionally only those in GROUP. Use"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -g option to organize by group. Use"); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -f option to print all information. Use"); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -s option for a short summary. Use"); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -d option to only list dangerous permissions. Use"); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -u option to list only the permissions users will see."); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list instrumentation command prints all instrumentations,"); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("or only those that target a specified package. Use the -f option"); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("to see their associated file."); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The path command prints the path to the .apk of a package."); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The install command installs a package to the system. Use"); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -l option to install the package with FORWARD_LOCK. Use"); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -r option to reinstall an exisiting app, keeping its data."); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The uninstall command removes a package from the system. Use"); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("the -k option to keep the data and cache directories around"); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("after the package removal."); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The enable and disable commands change the enabled state of"); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("a given package or component (written as \"package/class\")."); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 846