Pm.java revision 5ab2157bf1f105b02d3e2913cd3a33f9765b74ca
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; 330e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.content.pm.ParceledListSlice; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 390e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.os.Parcel; 400b285499db739ba50f2f839d633e763c70e67f96Amith Yamasaniimport android.os.Process; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 4523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field; 4623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 5523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 5823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 6223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet private static final String PM_NOT_RUNNING_ERR = 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 650b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani private static final int ROOT_UID = 0; 6623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Pm().run(args); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run(String[] args) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 8723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 108690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if ("clear".equals(op)) { 109690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn runClear(); 110690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 111690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 112690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1230ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn if ("disable-user".equals(op)) { 1240ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); 1250ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return; 1260ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn } 1270ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn 12846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("set-install-location".equals(op)) { 12940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runSetInstallLocation(); 13040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 13140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 13240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 13346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("get-install-location".equals(op)) { 13440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runGetInstallLocation(); 13540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 13640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 13740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 1380b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if ("createUser".equals(op)) { 1390b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani runCreateUser(); 1400b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 1410b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 1420b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1430b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if ("removeUser".equals(op)) { 1440b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani runRemoveUser(); 1450b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 1460b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 1470b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 17523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 179039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 196039c68e75606e837cf021815a0210836724574adDianne Hackborn } else if ("features".equals(type)) { 197039c68e75606e837cf021815a0210836724574adDianne Hackborn runListFeatures(); 198e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("libraries".equals(type)) { 199e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn runListLibraries(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 212e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int getFlags = 0; 213e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean listDisabled = false, listEnabled = false; 2140f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn boolean listSystem = false, listThirdParty = false; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 224e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-d")) { 225e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listDisabled = true; 226e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-e")) { 227e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listEnabled = true; 2280f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-s")) { 2290f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listSystem = true; 2300f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-3")) { 2310f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listThirdParty = true; 232e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-u")) { 233e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 246e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String filter = nextArg(); 247e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2490e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags); 25023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 254e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (filter != null && !info.packageName.contains(filter)) { 255e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn continue; 256e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2570f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn final boolean isSystem = 2580f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0; 259e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ((!listDisabled || !info.applicationInfo.enabled) && 2600f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listEnabled || info.applicationInfo.enabled) && 2610f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listSystem || isSystem) && 2620f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listThirdParty || !isSystem)) { 263e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("package:"); 264e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (showApplicationPackage) { 265e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print(info.applicationInfo.sourceDir); 266e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("="); 267e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 268e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(info.packageName); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2770e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root @SuppressWarnings("unchecked") 2780e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags) 2790e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root throws RemoteException { 2800e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>(); 2810e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root PackageInfo lastItem = null; 2820e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root ParceledListSlice<PackageInfo> slice; 2830e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 2840e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root do { 2850e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final String lastKey = lastItem != null ? lastItem.packageName : null; 2860e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root slice = pm.getInstalledPackages(flags, lastKey); 2870e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR); 2880e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } while (!slice.isLastSlice()); 2890e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 2900e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root return packageInfos; 2910e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } 2920e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 294039c68e75606e837cf021815a0210836724574adDianne Hackborn * Lists all of the features supported by the current device. 295039c68e75606e837cf021815a0210836724574adDianne Hackborn * 296039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 297039c68e75606e837cf021815a0210836724574adDianne Hackborn */ 298039c68e75606e837cf021815a0210836724574adDianne Hackborn private void runListFeatures() { 299039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 300039c68e75606e837cf021815a0210836724574adDianne Hackborn List<FeatureInfo> list = new ArrayList<FeatureInfo>(); 301039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo[] rawList = mPm.getSystemAvailableFeatures(); 302039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int i=0; i<rawList.length; i++) { 303039c68e75606e837cf021815a0210836724574adDianne Hackborn list.add(rawList[i]); 304039c68e75606e837cf021815a0210836724574adDianne Hackborn } 305babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6bJoe Malin 306039c68e75606e837cf021815a0210836724574adDianne Hackborn 307039c68e75606e837cf021815a0210836724574adDianne Hackborn // Sort by name 308039c68e75606e837cf021815a0210836724574adDianne Hackborn Collections.sort(list, new Comparator<FeatureInfo>() { 309039c68e75606e837cf021815a0210836724574adDianne Hackborn public int compare(FeatureInfo o1, FeatureInfo o2) { 310039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == o2.name) return 0; 311039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == null) return -1; 312039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o2.name == null) return 1; 313039c68e75606e837cf021815a0210836724574adDianne Hackborn return o1.name.compareTo(o2.name); 314039c68e75606e837cf021815a0210836724574adDianne Hackborn } 315039c68e75606e837cf021815a0210836724574adDianne Hackborn }); 316039c68e75606e837cf021815a0210836724574adDianne Hackborn 317039c68e75606e837cf021815a0210836724574adDianne Hackborn int count = (list != null) ? list.size() : 0; 318039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int p = 0; p < count; p++) { 319039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo fi = list.get(p); 320039c68e75606e837cf021815a0210836724574adDianne Hackborn System.out.print("feature:"); 321039c68e75606e837cf021815a0210836724574adDianne Hackborn if (fi.name != null) System.out.println(fi.name); 322039c68e75606e837cf021815a0210836724574adDianne Hackborn else System.out.println("reqGlEsVersion=0x" 323039c68e75606e837cf021815a0210836724574adDianne Hackborn + Integer.toHexString(fi.reqGlEsVersion)); 324039c68e75606e837cf021815a0210836724574adDianne Hackborn } 325039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 326039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(e.toString()); 327039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 328039c68e75606e837cf021815a0210836724574adDianne Hackborn } 329039c68e75606e837cf021815a0210836724574adDianne Hackborn } 330039c68e75606e837cf021815a0210836724574adDianne Hackborn 331039c68e75606e837cf021815a0210836724574adDianne Hackborn /** 332e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Lists all of the libraries supported by the current device. 333e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * 334e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 335e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 336e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void runListLibraries() { 337e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn try { 338e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<String> list = new ArrayList<String>(); 339e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] rawList = mPm.getSystemSharedLibraryNames(); 340e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<rawList.length; i++) { 341e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn list.add(rawList[i]); 342e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 343e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 344e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 345e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Sort by name 346e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn Collections.sort(list, new Comparator<String>() { 347e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public int compare(String o1, String o2) { 348e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == o2) return 0; 349e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == null) return -1; 350e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o2 == null) return 1; 351e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return o1.compareTo(o2); 352e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 353e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn }); 354e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 355e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int count = (list != null) ? list.size() : 0; 356e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int p = 0; p < count; p++) { 357e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String lib = list.get(p); 358e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("library:"); 359e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(lib); 360e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 361e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } catch (RemoteException e) { 362e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(e.toString()); 363e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 364e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 365e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 367e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 36923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 43223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4491c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (res != 0) { 4501c3274ca12a6931568693b897c269107f0346eabAli Utku Selen Resources r = getResources(pii); 4511c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (r != null) { 4521c3274ca12a6931568693b897c269107f0346eabAli Utku Selen return r.getString(res); 4531c3274ca12a6931568693b897c269107f0346eabAli Utku Selen } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 55223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi.protectionLevel < startProtectionLevel 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || pi.protectionLevel > endProtectionLevel) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String protLevel = "unknown"; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(pi.protectionLevel) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_DANGEROUS: 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "dangerous"; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_NORMAL: 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "normal"; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE: 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signature"; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protLevel = "signatureOrSystem"; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " protectionLevel:" + protLevel); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageInstallObserver extends IPackageInstallObserver.Stub { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageInstalled(String name, int status) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized( this) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 66523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet /** 66623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * Converts a failure code into a string by using reflection to find a matching constant 66723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * in PackageManager. 66823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet */ 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String installFailureToString(int result) { 67023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet Field[] fields = PackageManager.class.getFields(); 67123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet for (Field f: fields) { 67223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (f.getType() == int.class) { 67323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet int modifiers = f.getModifiers(); 67423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // only look at public final static fields. 67523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (((modifiers & Modifier.FINAL) != 0) && 67623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.PUBLIC) != 0) && 67723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.STATIC) != 0)) { 67823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet String fieldName = f.getName(); 67923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (fieldName.startsWith("INSTALL_FAILED_") || 68023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet fieldName.startsWith("INSTALL_PARSE_FAILED_")) { 68123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // get the int value and compare it to result. 68223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet try { 68323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (result == f.getInt(null)) { 68423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return fieldName; 68523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 68623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } catch (IllegalAccessException e) { 68723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // this shouldn't happen since we only look for public static fields. 68823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 68923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 69023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 69123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 69223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 69323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 69423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // couldn't find a matching constant? return the value 69523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return Integer.toString(result); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 69840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runSetInstallLocation() { 69940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc; 70040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 70140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String arg = nextArg(); 70240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (arg == null) { 70340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: no install location specified."); 70440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 70540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 70640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 70740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 70840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu loc = Integer.parseInt(arg); 70940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (NumberFormatException e) { 71040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 71140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 71240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 71340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 71440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 71540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (!mPm.setInstallLocation(loc)) { 71640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 71740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 71840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 71940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 72040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 72140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 72240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 72340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 72440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 72540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runGetInstallLocation() { 72640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 72740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc = mPm.getInstallLocation(); 72840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String locStr = "invalid"; 72940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_AUTO) { 73040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "auto"; 73140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { 73240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "internal"; 73340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 73440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "external"; 73540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 73640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.out.println(loc + "[" + locStr + "]"); 73740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 73840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 73940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 74040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 74140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 74240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int installFlags = 0; 745c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski String installerPackageName = null; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 750ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 752ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 753c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } else if (opt.equals("-i")) { 754c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName = nextOptionData(); 755c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski if (installerPackageName == null) { 756c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski System.err.println("Error: no value specified for -i"); 757c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski showUsage(); 758c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski return; 759c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } 760ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } else if (opt.equals("-t")) { 761ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_TEST; 762af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } else if (opt.equals("-s")) { 7638946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Override if -s option is specified. 7645b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFlags |= PackageManager.INSTALL_EXTERNAL; 76514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (opt.equals("-f")) { 76614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Override if -s option is specified. 76714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFlags |= PackageManager.INSTALL_INTERNAL; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7755ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri apkURI; 7765ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri verificationURI; 7775ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 7785ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate apkURI, must be present 7795ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String apkFilePath = nextArg(); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 7815ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (apkFilePath != null) { 7825ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root apkURI = Uri.fromFile(new File(apkFilePath)); 7835ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7895ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate verificationURI, optionally present 7905ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String verificationFilePath = nextArg(); 7915ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (verificationFilePath != null) { 7925ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root System.err.println("\tver: " + verificationFilePath); 7935ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = Uri.fromFile(new File(verificationFilePath)); 7945ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 7955ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = null; 7965ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } 7975ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInstallObserver obs = new PackageInstallObserver(); 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8005ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root mPm.installPackageWithVerification(apkURI, obs, installFlags, installerPackageName, 8015ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI, null); 80223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + installFailureToString(obs.result) 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 8240b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani public void runCreateUser() { 8250b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani // Need to be run as root 8260b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (Process.myUid() != ROOT_UID) { 8270b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: createUser must be run as root"); 8280b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8290b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8300b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String name; 8310b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 8320b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 8330b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user name specified."); 8340b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8350b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8360b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8370b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani name = arg; 8380b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8390b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (mPm.createUser(name, 0) == null) { 8400b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: couldn't create user."); 8410b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8420b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8430b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 8440b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 8450b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 8460b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8470b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 8480b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8490b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 8500b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani public void runRemoveUser() { 8510b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani // Need to be run as root 8520b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (Process.myUid() != ROOT_UID) { 8530b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: removeUser must be run as root"); 8540b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8550b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8560b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani int userId; 8570b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 8580b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 8590b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user id specified."); 8600b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8610b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8620b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8630b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8640b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani userId = Integer.parseInt(arg); 8650b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (NumberFormatException e) { 8660b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: user id has to be a number."); 8670b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8680b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8690b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8700b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8710b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (!mPm.removeUser(userId)) { 8720b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: couldn't remove user."); 8730b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8740b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8750b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 8760b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 8770b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 8780b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8790b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8800b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result; 88423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 885c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root public void packageDeleted(String packageName, int returnCode) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 888c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root result = returnCode == PackageManager.DELETE_SUCCEEDED; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runUninstall() { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int unInstallFlags = 0; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt = nextOption(); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt != null && opt.equals("-k")) { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unInstallFlags = PackageManager.DONT_DELETE_DATA; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = deletePackage(pkg, unInstallFlags); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Failure"); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean deletePackage(String pkg, int unInstallFlags) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageDeleteObserver obs = new PackageDeleteObserver(); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.deletePackage(pkg, obs, unInstallFlags); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obs.result; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 936690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn class ClearDataObserver extends IPackageDataObserver.Stub { 937690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean finished; 938690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean result; 939690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 940690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn @Override 941690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 942690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (this) { 943690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn finished = true; 944690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn result = succeeded; 945690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn notifyAll(); 946690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 947690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 948690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 949690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 950690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 951690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn private void runClear() { 952690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn String pkg = nextArg(); 953690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (pkg == null) { 954690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Error: no package specified"); 955690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn showUsage(); 956690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 957690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 958690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 959690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 960690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 961690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (!ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs)) { 962690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 963690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 964690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 965690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (obs) { 966690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn while (!obs.finished) { 967690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 968690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn obs.wait(); 969690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (InterruptedException e) { 970690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 971690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 972690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 973690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 974690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (obs.result) { 975690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Success"); 976690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } else { 977690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 978690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 979690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (RemoteException e) { 980690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(e.toString()); 981690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 982690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 983690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 984690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 9930ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER: 9940ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return "disabled-user"; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 99823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setApplicationEnabledSetting(pkg, state, 0); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getApplicationEnabledSetting(pkg))); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.setComponentEnabledSetting(cn, state, 0); 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getComponentEnabledSetting(cn))); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = mPm.getPackageInfo(pckg, 0); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 104623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 105023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 106423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 111246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-e] [-u] [FILTER]"); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 111523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 1116039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(" pm list features"); 1117e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list libraries"); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 111914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH"); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm uninstall [-k] PACKAGE"); 1121690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(" pm clear PACKAGE"); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm enable PACKAGE_OR_COMPONENT"); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm disable PACKAGE_OR_COMPONENT"); 112446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm disable-user PACKAGE_OR_COMPONENT"); 112546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]"); 112646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm get-install-location"); 11270b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(" pm createUser USER_NAME"); 11280b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(" pm removeUser USER_ID"); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 113046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list packages: prints all packages, optionally only"); 113146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those whose package name contains the text in FILTER. Options:"); 113246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: see their associated file."); 113346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: filter to only show disbled packages."); 113446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -e: filter to only show enabled packages."); 113546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: filter to only show system packages."); 113646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -3: filter to only show third party packages."); 113746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: also include uninstalled packages."); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 113946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permission-groups: prints all known permission groups."); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 114146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permissions: prints all known permissions, optionally only"); 114246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those in GROUP. Options:"); 114346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -g: organize by group."); 114446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: print all information."); 114546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: short summary."); 114646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: only list dangerous permissions."); 114746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: list only the permissions users will see."); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 114946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list instrumentation: use to list all test packages; optionally"); 115046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" supply <TARGET-PACKAGE> to list the test packages for a particular"); 115146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" application. Options:"); 115246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: list the .apk file for the test package."); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 115446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list features: prints all features of the system."); 1155039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(""); 115646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm path: print the path to the .apk of the given PACKAGE."); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 115846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm install: installs a package to the system. Options:"); 115946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -l: install the package with FORWARD_LOCK."); 116046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -r: reinstall an exisiting app, keeping its data."); 116146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -t: allow test .apks to be installed."); 116246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -i: specify the installer package name."); 116346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: install package on sdcard."); 116446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: install package on internal flash."); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 116646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm uninstall: removes a package from the system. Options:"); 116746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -k: keep the data and cache directories around after package removal."); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 116946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm clear: deletes all data associated with a package."); 1170690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(""); 117146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm enable, disable, disable-user: these commands change the enabled state"); 117246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" of a given package or component (written as \"package/class\")."); 117340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 117446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm get-install-location: returns the current install location."); 117546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 117646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 117746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 117840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 117946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm set-install-location: changes the default install location."); 118046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" NOTE: this is only intended for debugging; using this can cause"); 118146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" applications to break and other undersireable behavior."); 118246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 118346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 118446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1187