Pm.java revision 719a6320a789e76566d6416d5ec35491d21f5c44
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 19690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.app.ActivityManagerNative; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 22039c68e75606e837cf021815a0210836724574adDianne Hackbornimport android.content.pm.FeatureInfo; 23690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.content.pm.IPackageDataObserver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 310e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.content.pm.ParceledListSlice; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 34742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 38742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.Binder; 390b285499db739ba50f2f839d633e763c70e67f96Amith Yamasaniimport android.os.Process; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.content.PackageHelper; 44742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 4623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field; 4723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 5623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 5923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 6323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet private static final String PM_NOT_RUNNING_ERR = 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 660b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani private static final int ROOT_UID = 0; 6723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Pm().run(args); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run(String[] args) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 8823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 109690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if ("clear".equals(op)) { 110690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn runClear(); 111690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 112690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 113690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1240ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn if ("disable-user".equals(op)) { 1250ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); 1260ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return; 1270ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn } 1280ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn 129e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("grant".equals(op)) { 130e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(true); 131e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 132e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 133e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 134e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("revoke".equals(op)) { 135e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(false); 136e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 137e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 138e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 139719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if ("set-permission-enforced".equals(op)) { 140719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey runSetPermissionEnforced(); 141719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 142719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 143719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 14446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("set-install-location".equals(op)) { 14540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runSetInstallLocation(); 14640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 14740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 14840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 14946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("get-install-location".equals(op)) { 15040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runGetInstallLocation(); 15140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 15240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 15340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 154483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("create-user".equals(op)) { 155483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runCreateUser(); 156742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return; 157742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 158742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 159483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("remove-user".equals(op)) { 160483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runRemoveUser(); 1610b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 1620b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 1630b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 164483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("list-users".equals(op)) { 165483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runListUsers(); 1660b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 1670b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 1680b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 19623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 200039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 201e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 217039c68e75606e837cf021815a0210836724574adDianne Hackborn } else if ("features".equals(type)) { 218039c68e75606e837cf021815a0210836724574adDianne Hackborn runListFeatures(); 219e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("libraries".equals(type)) { 220e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn runListLibraries(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 223483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if ("users".equals(type)) { 224483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runListUsers(); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 235e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int getFlags = 0; 236e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean listDisabled = false, listEnabled = false; 2370f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn boolean listSystem = false, listThirdParty = false; 23892a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma boolean listInstaller = false; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 248e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-d")) { 249e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listDisabled = true; 250e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-e")) { 251e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listEnabled = true; 2520f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-s")) { 2530f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listSystem = true; 2540f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-3")) { 2550f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listThirdParty = true; 25692a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } else if (opt.equals("-i")) { 25792a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma listInstaller = true; 258e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-u")) { 259e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 272e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String filter = nextArg(); 273e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2750e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags); 27623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 280e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (filter != null && !info.packageName.contains(filter)) { 281e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn continue; 282e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2830f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn final boolean isSystem = 2840f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0; 285e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ((!listDisabled || !info.applicationInfo.enabled) && 2860f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listEnabled || info.applicationInfo.enabled) && 2870f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listSystem || isSystem) && 2880f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listThirdParty || !isSystem)) { 289e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("package:"); 290e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (showApplicationPackage) { 291e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print(info.applicationInfo.sourceDir); 292e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("="); 293e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 29492a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(info.packageName); 29592a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma if (listInstaller) { 29692a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(" installer="); 29792a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(mPm.getInstallerPackageName(info.packageName)); 29892a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } 29992a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.println(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3080e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root @SuppressWarnings("unchecked") 3090e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags) 3100e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root throws RemoteException { 3110e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>(); 3120e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root PackageInfo lastItem = null; 3130e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root ParceledListSlice<PackageInfo> slice; 3140e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 3150e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root do { 3160e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root final String lastKey = lastItem != null ? lastItem.packageName : null; 3170e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root slice = pm.getInstalledPackages(flags, lastKey); 3180e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR); 3190e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } while (!slice.isLastSlice()); 3200e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 3210e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root return packageInfos; 3220e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } 3230e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 325039c68e75606e837cf021815a0210836724574adDianne Hackborn * Lists all of the features supported by the current device. 326039c68e75606e837cf021815a0210836724574adDianne Hackborn * 327039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 328039c68e75606e837cf021815a0210836724574adDianne Hackborn */ 329039c68e75606e837cf021815a0210836724574adDianne Hackborn private void runListFeatures() { 330039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 331039c68e75606e837cf021815a0210836724574adDianne Hackborn List<FeatureInfo> list = new ArrayList<FeatureInfo>(); 332039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo[] rawList = mPm.getSystemAvailableFeatures(); 333039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int i=0; i<rawList.length; i++) { 334039c68e75606e837cf021815a0210836724574adDianne Hackborn list.add(rawList[i]); 335039c68e75606e837cf021815a0210836724574adDianne Hackborn } 336babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6bJoe Malin 337039c68e75606e837cf021815a0210836724574adDianne Hackborn 338039c68e75606e837cf021815a0210836724574adDianne Hackborn // Sort by name 339039c68e75606e837cf021815a0210836724574adDianne Hackborn Collections.sort(list, new Comparator<FeatureInfo>() { 340039c68e75606e837cf021815a0210836724574adDianne Hackborn public int compare(FeatureInfo o1, FeatureInfo o2) { 341039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == o2.name) return 0; 342039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == null) return -1; 343039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o2.name == null) return 1; 344039c68e75606e837cf021815a0210836724574adDianne Hackborn return o1.name.compareTo(o2.name); 345039c68e75606e837cf021815a0210836724574adDianne Hackborn } 346039c68e75606e837cf021815a0210836724574adDianne Hackborn }); 347039c68e75606e837cf021815a0210836724574adDianne Hackborn 348039c68e75606e837cf021815a0210836724574adDianne Hackborn int count = (list != null) ? list.size() : 0; 349039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int p = 0; p < count; p++) { 350039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo fi = list.get(p); 351039c68e75606e837cf021815a0210836724574adDianne Hackborn System.out.print("feature:"); 352039c68e75606e837cf021815a0210836724574adDianne Hackborn if (fi.name != null) System.out.println(fi.name); 353039c68e75606e837cf021815a0210836724574adDianne Hackborn else System.out.println("reqGlEsVersion=0x" 354039c68e75606e837cf021815a0210836724574adDianne Hackborn + Integer.toHexString(fi.reqGlEsVersion)); 355039c68e75606e837cf021815a0210836724574adDianne Hackborn } 356039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 357039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(e.toString()); 358039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 359039c68e75606e837cf021815a0210836724574adDianne Hackborn } 360039c68e75606e837cf021815a0210836724574adDianne Hackborn } 361039c68e75606e837cf021815a0210836724574adDianne Hackborn 362039c68e75606e837cf021815a0210836724574adDianne Hackborn /** 363e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Lists all of the libraries supported by the current device. 364e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * 365e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 367e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void runListLibraries() { 368e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn try { 369e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<String> list = new ArrayList<String>(); 370e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] rawList = mPm.getSystemSharedLibraryNames(); 371e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<rawList.length; i++) { 372e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn list.add(rawList[i]); 373e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 374e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 375e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 376e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Sort by name 377e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn Collections.sort(list, new Comparator<String>() { 378e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public int compare(String o1, String o2) { 379e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == o2) return 0; 380e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == null) return -1; 381e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o2 == null) return 1; 382e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return o1.compareTo(o2); 383e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 384e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn }); 385e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 386e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int count = (list != null) ? list.size() : 0; 387e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int p = 0; p < count; p++) { 388e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String lib = list.get(p); 389e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("library:"); 390e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(lib); 391e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 392e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } catch (RemoteException e) { 393e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(e.toString()); 394e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 395e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 396e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 397e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 398e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 40023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 46323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4801c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (res != 0) { 4811c3274ca12a6931568693b897c269107f0346eabAli Utku Selen Resources r = getResources(pii); 4821c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (r != null) { 4831c3274ca12a6931568693b897c269107f0346eabAli Utku Selen return r.getString(res); 4841c3274ca12a6931568693b897c269107f0346eabAli Utku Selen } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 58323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 616e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn final int base = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; 617e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (base < startProtectionLevel 618e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn || base > endProtectionLevel) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 648e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.out.println(prefix + " protectionLevel:" 649e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn + PermissionInfo.protectionToString(pi.protectionLevel)); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageInstallObserver extends IPackageInstallObserver.Stub { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageInstalled(String name, int status) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized( this) { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 68323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet /** 68423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * Converts a failure code into a string by using reflection to find a matching constant 68523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * in PackageManager. 68623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet */ 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String installFailureToString(int result) { 68823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet Field[] fields = PackageManager.class.getFields(); 68923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet for (Field f: fields) { 69023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (f.getType() == int.class) { 69123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet int modifiers = f.getModifiers(); 69223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // only look at public final static fields. 69323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (((modifiers & Modifier.FINAL) != 0) && 69423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.PUBLIC) != 0) && 69523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.STATIC) != 0)) { 69623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet String fieldName = f.getName(); 69723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (fieldName.startsWith("INSTALL_FAILED_") || 69823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet fieldName.startsWith("INSTALL_PARSE_FAILED_")) { 69923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // get the int value and compare it to result. 70023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet try { 70123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (result == f.getInt(null)) { 70223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return fieldName; 70323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 70423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } catch (IllegalAccessException e) { 70523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // this shouldn't happen since we only look for public static fields. 70623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 70723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 70823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 70923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 71023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 71123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 71223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // couldn't find a matching constant? return the value 71323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return Integer.toString(result); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 71640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runSetInstallLocation() { 71740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc; 71840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 71940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String arg = nextArg(); 72040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (arg == null) { 72140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: no install location specified."); 72240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 72340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 72440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 72540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 72640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu loc = Integer.parseInt(arg); 72740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (NumberFormatException e) { 72840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 72940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 73040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 73140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 73240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 73340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (!mPm.setInstallLocation(loc)) { 73440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 73540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu showUsage(); 73640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 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 74340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runGetInstallLocation() { 74440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 74540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc = mPm.getInstallLocation(); 74640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String locStr = "invalid"; 74740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_AUTO) { 74840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "auto"; 74940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { 75040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "internal"; 75140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 75240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "external"; 75340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 75440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.out.println(loc + "[" + locStr + "]"); 75540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 75640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 75740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 75840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 75940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 76040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int installFlags = 0; 763c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski String installerPackageName = null; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 768ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 770ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 771c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } else if (opt.equals("-i")) { 772c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName = nextOptionData(); 773c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski if (installerPackageName == null) { 774c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski System.err.println("Error: no value specified for -i"); 775c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski showUsage(); 776c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski return; 777c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } 778ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } else if (opt.equals("-t")) { 779ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_TEST; 780af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } else if (opt.equals("-s")) { 7818946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Override if -s option is specified. 7825b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFlags |= PackageManager.INSTALL_EXTERNAL; 78314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (opt.equals("-f")) { 78414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Override if -s option is specified. 78514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFlags |= PackageManager.INSTALL_INTERNAL; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7935ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri apkURI; 7945ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri verificationURI; 7955ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 7965ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate apkURI, must be present 7975ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String apkFilePath = nextArg(); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 7995ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (apkFilePath != null) { 8005ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root apkURI = Uri.fromFile(new File(apkFilePath)); 8015ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8075ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate verificationURI, optionally present 8085ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String verificationFilePath = nextArg(); 8095ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (verificationFilePath != null) { 8105ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root System.err.println("\tver: " + verificationFilePath); 8115ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = Uri.fromFile(new File(verificationFilePath)); 8125ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 8135ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = null; 8145ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } 8155ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInstallObserver obs = new PackageInstallObserver(); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8185ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root mPm.installPackageWithVerification(apkURI, obs, installFlags, installerPackageName, 8195ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI, null); 82023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + installFailureToString(obs.result) 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 842483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runCreateUser() { 8430b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani // Need to be run as root 8440b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (Process.myUid() != ROOT_UID) { 845483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: create-user must be run as root"); 8460b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8470b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8480b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String name; 8490b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 8500b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 8510b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user name specified."); 8520b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8530b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8540b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8550b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani name = arg; 8560b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8570b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (mPm.createUser(name, 0) == null) { 858483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: couldn't create User."); 8590b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8600b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8610b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 8620b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 8630b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 8640b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8650b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 8660b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8670b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 868483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runRemoveUser() { 8690b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani // Need to be run as root 8700b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (Process.myUid() != ROOT_UID) { 871483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: remove-user must be run as root"); 8720b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8730b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8740b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani int userId; 8750b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 8760b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 8770b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user id specified."); 8780b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8790b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8800b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8810b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8820b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani userId = Integer.parseInt(arg); 8830b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (NumberFormatException e) { 8840b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: user id has to be a number."); 8850b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8860b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 8870b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8880b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 8890b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (!mPm.removeUser(userId)) { 890483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: couldn't remove user."); 8910b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani showUsage(); 8920b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8930b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 8940b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 8950b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 8960b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8970b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 8980b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 899483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runListUsers() { 900742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Need to be run as root 901742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (Process.myUid() != ROOT_UID) { 902483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: list-users must be run as root"); 903742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return; 904742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 905742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani try { 906742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani List<UserInfo> users = mPm.getUsers(); 907742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (users == null) { 908742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println("Error: couldn't get users"); 909742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 910742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.out.println("Users:"); 911742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (int i = 0; i < users.size(); i++) { 912742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.out.println("\t" + users.get(i).toString()); 913742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 914742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 915742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } catch (RemoteException e) { 916742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(e.toString()); 917742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 918742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 919742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result; 92323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 924c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root public void packageDeleted(String packageName, int returnCode) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 927c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root result = returnCode == PackageManager.DELETE_SUCCEEDED; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runUninstall() { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int unInstallFlags = 0; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt = nextOption(); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt != null && opt.equals("-k")) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unInstallFlags = PackageManager.DONT_DELETE_DATA; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = deletePackage(pkg, unInstallFlags); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Failure"); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean deletePackage(String pkg, int unInstallFlags) { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageDeleteObserver obs = new PackageDeleteObserver(); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.deletePackage(pkg, obs, unInstallFlags); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obs.result; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 975690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn class ClearDataObserver extends IPackageDataObserver.Stub { 976690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean finished; 977690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean result; 978690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 979690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn @Override 980690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 981690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (this) { 982690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn finished = true; 983690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn result = succeeded; 984690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn notifyAll(); 985690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 986690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 987690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 988690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 989690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 990690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn private void runClear() { 991690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn String pkg = nextArg(); 992690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (pkg == null) { 993690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Error: no package specified"); 994690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn showUsage(); 995690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 996690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 997690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 998690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 999690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1000742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (!ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, 1001742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Binder.getOrigCallingUser())) { 1002690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 1003690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1004690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1005690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (obs) { 1006690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn while (!obs.finished) { 1007690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1008690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn obs.wait(); 1009690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (InterruptedException e) { 1010690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1011690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1012690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1013690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1014690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (obs.result) { 1015690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Success"); 1016690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } else { 1017690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 1018690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1019690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (RemoteException e) { 1020690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(e.toString()); 1021690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1022690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1023690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1024690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 10330ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER: 10340ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return "disabled-user"; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 103823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1039483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private boolean isNumber(String s) { 1040483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 1041483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Integer.parseInt(s); 1042483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (NumberFormatException nfe) { 1043483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return false; 1044483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1045483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return true; 1046483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1047483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 1049483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId = 0; 1050483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String option = nextOption(); 1051483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (option != null && option.equals("--user")) { 1052483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String optionData = nextOptionData(); 1053483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (optionData == null || !isNumber(optionData)) { 1054483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: no USER_ID specified"); 1055483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani showUsage(); 1056483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 1057483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 1058483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userId = Integer.parseInt(optionData); 1059483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1060483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1061483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1071483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.setApplicationEnabledSetting(pkg, state, 0, userId); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1074483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getApplicationEnabledSetting(pkg, userId))); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1081483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.setComponentEnabledSetting(cn, state, 0, userId); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1084483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getComponentEnabledSetting(cn, userId))); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1092e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn private void runGrantRevokePermission(boolean grant) { 1093e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String pkg = nextArg(); 1094e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (pkg == null) { 1095e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no package specified"); 1096e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1097e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1098e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1099e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String perm = nextArg(); 1100e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (perm == null) { 1101e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no permission specified"); 1102e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1103e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1104e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1105e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn try { 1106e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (grant) { 1107e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.grantPermission(pkg, perm); 1108e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } else { 1109e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.revokePermission(pkg, perm); 1110e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1111e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (RemoteException e) { 1112e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(e.toString()); 1113e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1114e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (IllegalArgumentException e) { 1115e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Bad argument: " + e.toString()); 1116e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1117e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (SecurityException e) { 1118e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Operation not allowed: " + e.toString()); 1119e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1120e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1121e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1122719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey private void runSetPermissionEnforced() { 1123719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String permission = nextArg(); 1124719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (permission == null) { 1125719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no permission specified"); 1126719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1127719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1128719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1129719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String enforcedRaw = nextArg(); 1130719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (enforcedRaw == null) { 1131719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no enforcement specified"); 1132719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1133719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1134719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1135719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final boolean enforced = Boolean.parseBoolean(enforcedRaw); 1136719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey try { 1137719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey mPm.setPermissionEnforced(permission, enforced); 1138719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (RemoteException e) { 1139719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(e.toString()); 1140719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(PM_NOT_RUNNING_ERR); 1141719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (IllegalArgumentException e) { 1142719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Bad argument: " + e.toString()); 1143719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1144719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (SecurityException e) { 1145719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Operation not allowed: " + e.toString()); 1146719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1147719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1148719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1155483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageInfo info = mPm.getPackageInfo(pckg, 0, 0); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 116523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 116923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1171483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0, 0); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 118323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 123192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [FILTER]"); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 123423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 1235039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(" pm list features"); 1236e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list libraries"); 1237483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm list users"); 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 123914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH"); 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm uninstall [-k] PACKAGE"); 1241690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(" pm clear PACKAGE"); 1242483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT"); 1243483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT"); 1244483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT"); 1245e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm grant PACKAGE PERMISSION"); 1246e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm revoke PACKAGE PERMISSION"); 124746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]"); 124846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm get-install-location"); 1249719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(" pm set-permission-enforced PERMISSION [true|false]"); 1250483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm create-user USER_NAME"); 1251483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println(" pm remove-user USER_ID"); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 125346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list packages: prints all packages, optionally only"); 125446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those whose package name contains the text in FILTER. Options:"); 125546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: see their associated file."); 125646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: filter to only show disbled packages."); 125746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -e: filter to only show enabled packages."); 125846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: filter to only show system packages."); 125946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -3: filter to only show third party packages."); 126092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.err.println(" -i: see the installer for the packages."); 126146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: also include uninstalled packages."); 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 126346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permission-groups: prints all known permission groups."); 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 126546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permissions: prints all known permissions, optionally only"); 126646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those in GROUP. Options:"); 126746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -g: organize by group."); 126846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: print all information."); 126946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: short summary."); 127046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: only list dangerous permissions."); 127146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: list only the permissions users will see."); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 127346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list instrumentation: use to list all test packages; optionally"); 127446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" supply <TARGET-PACKAGE> to list the test packages for a particular"); 127546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" application. Options:"); 127646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: list the .apk file for the test package."); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 127846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list features: prints all features of the system."); 1279039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(""); 128046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm path: print the path to the .apk of the given PACKAGE."); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 128246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm install: installs a package to the system. Options:"); 128346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -l: install the package with FORWARD_LOCK."); 128446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -r: reinstall an exisiting app, keeping its data."); 128546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -t: allow test .apks to be installed."); 128646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -i: specify the installer package name."); 128746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: install package on sdcard."); 128846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: install package on internal flash."); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 129046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm uninstall: removes a package from the system. Options:"); 129146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -k: keep the data and cache directories around after package removal."); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 129346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm clear: deletes all data associated with a package."); 1294690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(""); 129546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm enable, disable, disable-user: these commands change the enabled state"); 129646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" of a given package or component (written as \"package/class\")."); 129740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 1298e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("pm grant, revoke: these commands either grant or revoke permissions"); 1299e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" to applications. Only optional permissions the application has"); 1300e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" declared can be granted or revoked."); 1301e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(""); 130246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm get-install-location: returns the current install location."); 130346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 130446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 130546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 130640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 130746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm set-install-location: changes the default install location."); 130846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" NOTE: this is only intended for debugging; using this can cause"); 130946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" applications to break and other undersireable behavior."); 131046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 131146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 131246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1315