Pm.java revision 690d20bb53ba2485f59d128b365eff991d5cc3e6
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 1940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapuimport com.android.internal.content.PackageHelper; 2040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 21690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.app.ActivityManagerNative; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 24039c68e75606e837cf021815a0210836724574adDianne Hackbornimport android.content.pm.FeatureInfo; 25690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.content.pm.IPackageDataObserver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 4040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapuimport android.provider.Settings; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 4323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field; 4423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 5323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 5623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 6023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet private static final String PM_NOT_RUNNING_ERR = 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 6323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Pm().run(args); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run(String[] args) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 8423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 105690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if ("clear".equals(op)) { 106690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn runClear(); 107690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 108690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 109690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 12040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if ("setInstallLocation".equals(op)) { 12140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runSetInstallLocation(); 12240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 12340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 12440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 12540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if ("getInstallLocation".equals(op)) { 12640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runGetInstallLocation(); 12740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 12840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 12940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 15723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 161039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 162e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 178039c68e75606e837cf021815a0210836724574adDianne Hackborn } else if ("features".equals(type)) { 179039c68e75606e837cf021815a0210836724574adDianne Hackborn runListFeatures(); 180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("libraries".equals(type)) { 181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn runListLibraries(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 194e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int getFlags = 0; 195e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean listDisabled = false, listEnabled = false; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 205e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-d")) { 206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listDisabled = true; 207e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-e")) { 208e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listEnabled = true; 209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-u")) { 210e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 223e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String filter = nextArg(); 224e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 226e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<PackageInfo> packages = mPm.getInstalledPackages(getFlags); 22723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 231e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (filter != null && !info.packageName.contains(filter)) { 232e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn continue; 233e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 234e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ((!listDisabled || !info.applicationInfo.enabled) && 235e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn (!listEnabled || info.applicationInfo.enabled)) { 236e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("package:"); 237e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (showApplicationPackage) { 238e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print(info.applicationInfo.sourceDir); 239e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("="); 240e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 241e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(info.packageName); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 251039c68e75606e837cf021815a0210836724574adDianne Hackborn * Lists all of the features supported by the current device. 252039c68e75606e837cf021815a0210836724574adDianne Hackborn * 253039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 254039c68e75606e837cf021815a0210836724574adDianne Hackborn */ 255039c68e75606e837cf021815a0210836724574adDianne Hackborn private void runListFeatures() { 256039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 257039c68e75606e837cf021815a0210836724574adDianne Hackborn List<FeatureInfo> list = new ArrayList<FeatureInfo>(); 258039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo[] rawList = mPm.getSystemAvailableFeatures(); 259039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int i=0; i<rawList.length; i++) { 260039c68e75606e837cf021815a0210836724574adDianne Hackborn list.add(rawList[i]); 261039c68e75606e837cf021815a0210836724574adDianne Hackborn } 262039c68e75606e837cf021815a0210836724574adDianne Hackborn 263039c68e75606e837cf021815a0210836724574adDianne Hackborn 264039c68e75606e837cf021815a0210836724574adDianne Hackborn // Sort by name 265039c68e75606e837cf021815a0210836724574adDianne Hackborn Collections.sort(list, new Comparator<FeatureInfo>() { 266039c68e75606e837cf021815a0210836724574adDianne Hackborn public int compare(FeatureInfo o1, FeatureInfo o2) { 267039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == o2.name) return 0; 268039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == null) return -1; 269039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o2.name == null) return 1; 270039c68e75606e837cf021815a0210836724574adDianne Hackborn return o1.name.compareTo(o2.name); 271039c68e75606e837cf021815a0210836724574adDianne Hackborn } 272039c68e75606e837cf021815a0210836724574adDianne Hackborn }); 273039c68e75606e837cf021815a0210836724574adDianne Hackborn 274039c68e75606e837cf021815a0210836724574adDianne Hackborn int count = (list != null) ? list.size() : 0; 275039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int p = 0; p < count; p++) { 276039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo fi = list.get(p); 277039c68e75606e837cf021815a0210836724574adDianne Hackborn System.out.print("feature:"); 278039c68e75606e837cf021815a0210836724574adDianne Hackborn if (fi.name != null) System.out.println(fi.name); 279039c68e75606e837cf021815a0210836724574adDianne Hackborn else System.out.println("reqGlEsVersion=0x" 280039c68e75606e837cf021815a0210836724574adDianne Hackborn + Integer.toHexString(fi.reqGlEsVersion)); 281039c68e75606e837cf021815a0210836724574adDianne Hackborn } 282039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 283039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(e.toString()); 284039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 285039c68e75606e837cf021815a0210836724574adDianne Hackborn } 286039c68e75606e837cf021815a0210836724574adDianne Hackborn } 287039c68e75606e837cf021815a0210836724574adDianne Hackborn 288039c68e75606e837cf021815a0210836724574adDianne Hackborn /** 289e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Lists all of the libraries supported by the current device. 290e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * 291e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 292e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 293e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void runListLibraries() { 294e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn try { 295e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<String> list = new ArrayList<String>(); 296e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] rawList = mPm.getSystemSharedLibraryNames(); 297e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<rawList.length; i++) { 298e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn list.add(rawList[i]); 299e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 300e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 301e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 302e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Sort by name 303e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn Collections.sort(list, new Comparator<String>() { 304e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public int compare(String o1, String o2) { 305e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == o2) return 0; 306e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == null) return -1; 307e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o2 == null) return 1; 308e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return o1.compareTo(o2); 309e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 310e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn }); 311e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 312e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int count = (list != null) ? list.size() : 0; 313e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int p = 0; p < count; p++) { 314e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String lib = list.get(p); 315e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("library:"); 316e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(lib); 317e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 318e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } catch (RemoteException e) { 319e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(e.toString()); 320e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 321e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 322e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 323e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 324e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 32623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 38923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = getResources(pii); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r != null) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r.getString(res); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 50723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi.protectionLevel < startProtectionLevel 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || pi.protectionLevel > endProtectionLevel) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String protLevel = "unknown"; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(pi.protectionLevel) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_DANGEROUS: 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "dangerous"; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_NORMAL: 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "normal"; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE: 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signature"; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signatureOrSystem"; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " protectionLevel:" + protLevel); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 60623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageInstallObserver extends IPackageInstallObserver.Stub { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageInstalled(String name, int status) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized( this) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 62023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet /** 62123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * Converts a failure code into a string by using reflection to find a matching constant 62223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * in PackageManager. 62323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet */ 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String installFailureToString(int result) { 62523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet Field[] fields = PackageManager.class.getFields(); 62623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet for (Field f: fields) { 62723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (f.getType() == int.class) { 62823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet int modifiers = f.getModifiers(); 62923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // only look at public final static fields. 63023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (((modifiers & Modifier.FINAL) != 0) && 63123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.PUBLIC) != 0) && 63223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.STATIC) != 0)) { 63323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet String fieldName = f.getName(); 63423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (fieldName.startsWith("INSTALL_FAILED_") || 63523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet fieldName.startsWith("INSTALL_PARSE_FAILED_")) { 63623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // get the int value and compare it to result. 63723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet try { 63823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (result == f.getInt(null)) { 63923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return fieldName; 64023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } catch (IllegalAccessException e) { 64223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // this shouldn't happen since we only look for public static fields. 64323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 64823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 64923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // couldn't find a matching constant? return the value 65023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return Integer.toString(result); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 65340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runSetInstallLocation() { 65440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc; 65540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 65640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String arg = nextArg(); 65740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (arg == null) { 65840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: no install location specified."); 65940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 66040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 66140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 66240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 66340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu loc = Integer.parseInt(arg); 66440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (NumberFormatException e) { 66540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 66640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 66740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 66840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 66940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 67040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (!mPm.setInstallLocation(loc)) { 67140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 67240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 67340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 67440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 67540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 67640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 67740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 67840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 67940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 68040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runGetInstallLocation() { 68140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 68240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc = mPm.getInstallLocation(); 68340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String locStr = "invalid"; 68440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_AUTO) { 68540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "auto"; 68640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { 68740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "internal"; 68840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 68940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "external"; 69040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 69140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.out.println(loc + "[" + locStr + "]"); 69240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 69340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 69440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 69540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 69640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 69740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int installFlags = 0; 700c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski String installerPackageName = null; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 705ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 707ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 708c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } else if (opt.equals("-i")) { 709c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName = nextOptionData(); 710c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski if (installerPackageName == null) { 711c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski System.err.println("Error: no value specified for -i"); 712c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski showUsage(); 713c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski return; 714c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } 715ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } else if (opt.equals("-t")) { 716ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_TEST; 717af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } else if (opt.equals("-s")) { 7188946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Override if -s option is specified. 7195b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFlags |= PackageManager.INSTALL_EXTERNAL; 72014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (opt.equals("-f")) { 72114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Override if -s option is specified. 72214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFlags |= PackageManager.INSTALL_INTERNAL; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String apkFilePath = nextArg(); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (apkFilePath == null) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInstallObserver obs = new PackageInstallObserver(); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 740c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags, 741c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName); 74223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + installFailureToString(obs.result) 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result; 76723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageDeleted(boolean succeeded) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = succeeded; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runUninstall() { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int unInstallFlags = 0; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt = nextOption(); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt != null && opt.equals("-k")) { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unInstallFlags = PackageManager.DONT_DELETE_DATA; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = deletePackage(pkg, unInstallFlags); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Failure"); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean deletePackage(String pkg, int unInstallFlags) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageDeleteObserver obs = new PackageDeleteObserver(); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.deletePackage(pkg, obs, unInstallFlags); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obs.result; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn class ClearDataObserver extends IPackageDataObserver.Stub { 820690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean finished; 821690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean result; 822690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 823690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn @Override 824690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 825690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (this) { 826690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn finished = true; 827690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn result = succeeded; 828690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn notifyAll(); 829690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 830690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 831690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 832690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 833690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 834690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn private void runClear() { 835690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn String pkg = nextArg(); 836690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (pkg == null) { 837690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Error: no package specified"); 838690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn showUsage(); 839690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 840690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 841690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 842690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 843690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 844690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (!ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs)) { 845690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 846690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 847690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 848690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (obs) { 849690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn while (!obs.finished) { 850690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 851690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn obs.wait(); 852690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (InterruptedException e) { 853690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 854690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 855690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 856690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 857690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (obs.result) { 858690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Success"); 859690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } else { 860690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 861690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 862690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (RemoteException e) { 863690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(e.toString()); 864690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 865690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 866690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 867690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setApplicationEnabledSetting(pkg, state, 0); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getApplicationEnabledSetting(pkg))); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setComponentEnabledSetting(cn, state, 0); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getComponentEnabledSetting(cn))); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = mPm.getPackageInfo(pckg, 0); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 92723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 93123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("usage: pm [list|path|install|uninstall]"); 994e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list packages [-f] [-d] [-e] [-u] [FILTER]"); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 99723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 998039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(" pm list features"); 999e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list libraries"); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 100114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH"); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm uninstall [-k] PACKAGE"); 1003690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(" pm clear PACKAGE"); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm enable PACKAGE_OR_COMPONENT"); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm disable PACKAGE_OR_COMPONENT"); 100640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" pm setInstallLocation [0/auto] [1/internal] [2/external]"); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1008e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println("The list packages command prints all packages, optionally only"); 1009e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println("those whose package name contains the text in FILTER. Options:"); 1010ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -f: see their associated file."); 1011e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" -d: filter to include disbled packages."); 1012e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" -e: filter to include enabled packages."); 1013e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" -u: also include uninstalled packages."); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list permission-groups command prints all known"); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("permission groups."); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list permissions command prints all known"); 1019ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println("permissions, optionally only those in GROUP. Options:"); 1020ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -g: organize by group."); 1021ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -f: print all information."); 1022ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -s: short summary."); 1023ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -d: only list dangerous permissions."); 1024ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -u: list only the permissions users will see."); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The list instrumentation command prints all instrumentations,"); 1027ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println("or only those that target a specified package. Options:"); 1028ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -f: see their associated file."); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1030039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println("The list features command prints all features of the system."); 1031039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(""); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The path command prints the path to the .apk of a package."); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1034ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println("The install command installs a package to the system. Options:"); 1035ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -l: install the package with FORWARD_LOCK."); 1036ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -r: reinstall an exisiting app, keeping its data."); 1037ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -t: allow test .apks to be installed."); 1038ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -i: specify the installer package name."); 1039af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu System.err.println(" -s: install package on sdcard."); 104014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu System.err.println(" -f: install package on internal flash."); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1042ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println("The uninstall command removes a package from the system. Options:"); 1043ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn System.err.println(" -k: keep the data and cache directories around."); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("after the package removal."); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1046690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("The clear command deletes all data associated with a package."); 1047690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(""); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("The enable and disable commands change the enabled state of"); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("a given package or component (written as \"package/class\")."); 105040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 105140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("The getInstallLocation command gets the current install location"); 105240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 0 [auto]: Let system decide the best location"); 105340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 1 [internal]: Install on internal device storage"); 105440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 2 [external]: Install on external media"); 105540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 105640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("The setInstallLocation command changes the default install location"); 105740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 0 [auto]: Let system decide the best location"); 105840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 1 [internal]: Install on internal device storage"); 105940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(" 2 [external]: Install on external media"); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1062