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 19cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.app.ActivityManager; 20690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.app.ActivityManagerNative; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 23ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Cowardimport android.content.pm.ContainerEncryptionParams; 24039c68e75606e837cf021815a0210836724574adDianne Hackbornimport android.content.pm.FeatureInfo; 25690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.content.pm.IPackageDataObserver; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageDeleteObserver; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageInstallObserver; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 330e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.content.pm.ParceledListSlice; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 36742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo; 37706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.content.pm.VerificationParams; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 41258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 44151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasaniimport android.os.UserHandle; 454c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkeyimport android.os.UserManager; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 48cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport java.io.FileDescriptor; 4923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field; 5023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier; 51ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Cowardimport java.security.InvalidAlgorithmParameterException; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Cowardimport javax.crypto.SecretKey; 59ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Cowardimport javax.crypto.spec.IvParameterSpec; 60ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Cowardimport javax.crypto.spec.SecretKeySpec; 61ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 62cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.content.PackageHelper; 63cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 66258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IUserManager mUm; 6723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 7023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 7423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet private static final String PM_NOT_RUNNING_ERR = 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 7723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Pm().run(args); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run(String[] args) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mUm = IUserManager.Stub.asInterface(ServiceManager.getService("user")); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 9923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 110cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn if ("dump".equals(op)) { 111cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn runDump(); 112cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 113cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 114cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 125690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if ("clear".equals(op)) { 126690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn runClear(); 127690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 128690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 129690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1400ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn if ("disable-user".equals(op)) { 1410ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); 1420ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return; 1430ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn } 1440ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn 145fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn if ("disable-until-used".equals(op)) { 146fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); 147fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn return; 148fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn } 149fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn 150655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if ("block".equals(op)) { 151655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani runSetBlockedSetting(true); 152655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 153655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 154655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 155655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if ("unblock".equals(op)) { 156655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani runSetBlockedSetting(false); 157655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 158655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 159655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 160e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("grant".equals(op)) { 161e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(true); 162e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 163e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 164e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 165e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("revoke".equals(op)) { 166e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(false); 167e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 168e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 169e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 170719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if ("set-permission-enforced".equals(op)) { 171719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey runSetPermissionEnforced(); 172719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 173719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 174719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 17546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("set-install-location".equals(op)) { 17640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runSetInstallLocation(); 17740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 17840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 17940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 18046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("get-install-location".equals(op)) { 18140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runGetInstallLocation(); 18240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 18340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 18440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 185197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if ("trim-caches".equals(op)) { 186197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn runTrimCaches(); 187197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 188197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 189197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 190483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("create-user".equals(op)) { 191483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runCreateUser(); 192742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return; 193742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 194742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 195483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("remove-user".equals(op)) { 196483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runRemoveUser(); 1970b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 1980b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 1990b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 2004c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey if ("get-max-users".equals(op)) { 2014c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey runGetMaxUsers(); 2024c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey return; 2034c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } 2044c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 23223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 236039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 237e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 252039c68e75606e837cf021815a0210836724574adDianne Hackborn } else if ("features".equals(type)) { 253039c68e75606e837cf021815a0210836724574adDianne Hackborn runListFeatures(); 254e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("libraries".equals(type)) { 255e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn runListLibraries(); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 258483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if ("users".equals(type)) { 259483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runListUsers(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 269e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int getFlags = 0; 270e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean listDisabled = false, listEnabled = false; 2710f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn boolean listSystem = false, listThirdParty = false; 27292a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma boolean listInstaller = false; 273151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani int userId = UserHandle.USER_OWNER; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 283e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-d")) { 284e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listDisabled = true; 285e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-e")) { 286e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listEnabled = true; 2870f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-s")) { 2880f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listSystem = true; 2890f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-3")) { 2900f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listThirdParty = true; 29192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } else if (opt.equals("-i")) { 29292a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma listInstaller = true; 293151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani } else if (opt.equals("--user")) { 294151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani userId = Integer.parseInt(nextArg()); 295e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-u")) { 296e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 307e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String filter = nextArg(); 308e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 310151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags, userId); 31123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 315e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (filter != null && !info.packageName.contains(filter)) { 316e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn continue; 317e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 3180f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn final boolean isSystem = 3190f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0; 320e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ((!listDisabled || !info.applicationInfo.enabled) && 3210f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listEnabled || info.applicationInfo.enabled) && 3220f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listSystem || isSystem) && 3230f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listThirdParty || !isSystem)) { 324e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("package:"); 325e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (showApplicationPackage) { 326e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print(info.applicationInfo.sourceDir); 327e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("="); 328e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 32992a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(info.packageName); 33092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma if (listInstaller) { 33192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(" installer="); 33292a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(mPm.getInstallerPackageName(info.packageName)); 33392a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } 33492a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.println(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3430e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root @SuppressWarnings("unchecked") 344151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags, int userId) 3450e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root throws RemoteException { 346d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn ParceledListSlice<PackageInfo> slice = pm.getInstalledPackages(flags, userId); 347d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return slice.getList(); 3480e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } 3490e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 351039c68e75606e837cf021815a0210836724574adDianne Hackborn * Lists all of the features supported by the current device. 352039c68e75606e837cf021815a0210836724574adDianne Hackborn * 353039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 354039c68e75606e837cf021815a0210836724574adDianne Hackborn */ 355039c68e75606e837cf021815a0210836724574adDianne Hackborn private void runListFeatures() { 356039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 357039c68e75606e837cf021815a0210836724574adDianne Hackborn List<FeatureInfo> list = new ArrayList<FeatureInfo>(); 358039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo[] rawList = mPm.getSystemAvailableFeatures(); 359039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int i=0; i<rawList.length; i++) { 360039c68e75606e837cf021815a0210836724574adDianne Hackborn list.add(rawList[i]); 361039c68e75606e837cf021815a0210836724574adDianne Hackborn } 362babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6bJoe Malin 363039c68e75606e837cf021815a0210836724574adDianne Hackborn 364039c68e75606e837cf021815a0210836724574adDianne Hackborn // Sort by name 365039c68e75606e837cf021815a0210836724574adDianne Hackborn Collections.sort(list, new Comparator<FeatureInfo>() { 366039c68e75606e837cf021815a0210836724574adDianne Hackborn public int compare(FeatureInfo o1, FeatureInfo o2) { 367039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == o2.name) return 0; 368039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == null) return -1; 369039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o2.name == null) return 1; 370039c68e75606e837cf021815a0210836724574adDianne Hackborn return o1.name.compareTo(o2.name); 371039c68e75606e837cf021815a0210836724574adDianne Hackborn } 372039c68e75606e837cf021815a0210836724574adDianne Hackborn }); 373039c68e75606e837cf021815a0210836724574adDianne Hackborn 374039c68e75606e837cf021815a0210836724574adDianne Hackborn int count = (list != null) ? list.size() : 0; 375039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int p = 0; p < count; p++) { 376039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo fi = list.get(p); 377039c68e75606e837cf021815a0210836724574adDianne Hackborn System.out.print("feature:"); 378039c68e75606e837cf021815a0210836724574adDianne Hackborn if (fi.name != null) System.out.println(fi.name); 379039c68e75606e837cf021815a0210836724574adDianne Hackborn else System.out.println("reqGlEsVersion=0x" 380039c68e75606e837cf021815a0210836724574adDianne Hackborn + Integer.toHexString(fi.reqGlEsVersion)); 381039c68e75606e837cf021815a0210836724574adDianne Hackborn } 382039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 383039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(e.toString()); 384039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 385039c68e75606e837cf021815a0210836724574adDianne Hackborn } 386039c68e75606e837cf021815a0210836724574adDianne Hackborn } 387039c68e75606e837cf021815a0210836724574adDianne Hackborn 388039c68e75606e837cf021815a0210836724574adDianne Hackborn /** 389e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Lists all of the libraries supported by the current device. 390e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * 391e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 392e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 393e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void runListLibraries() { 394e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn try { 395e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<String> list = new ArrayList<String>(); 396e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] rawList = mPm.getSystemSharedLibraryNames(); 397e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<rawList.length; i++) { 398e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn list.add(rawList[i]); 399e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 400e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 401e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 402e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Sort by name 403e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn Collections.sort(list, new Comparator<String>() { 404e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public int compare(String o1, String o2) { 405e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == o2) return 0; 406e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == null) return -1; 407e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o2 == null) return 1; 408e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return o1.compareTo(o2); 409e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 410e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn }); 411e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 412e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int count = (list != null) ? list.size() : 0; 413e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int p = 0; p < count; p++) { 414e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String lib = list.get(p); 415e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("library:"); 416e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(lib); 417e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 418e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } catch (RemoteException e) { 419e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(e.toString()); 420e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 421e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 422e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 423e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 424e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 42623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 48723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5041c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (res != 0) { 5051c3274ca12a6931568693b897c269107f0346eabAli Utku Selen Resources r = getResources(pii); 5061c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (r != null) { 5071c3274ca12a6931568693b897c269107f0346eabAli Utku Selen return r.getString(res); 5081c3274ca12a6931568693b897c269107f0346eabAli Utku Selen } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 60623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn final int base = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; 640e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (base < startProtectionLevel 641e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn || base > endProtectionLevel) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 671e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.out.println(prefix + " protectionLevel:" 672e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn + PermissionInfo.protectionToString(pi.protectionLevel)); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 692cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn private void runDump() { 693cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn String pkg = nextArg(); 694cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn if (pkg == null) { 695cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println("Error: no package specified"); 696cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 697cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 698cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn ActivityManager.dumpPackageStateStatic(FileDescriptor.out, pkg); 699cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 700cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageInstallObserver extends IPackageInstallObserver.Stub { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void packageInstalled(String name, int status) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized( this) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 71423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet /** 71523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * Converts a failure code into a string by using reflection to find a matching constant 71623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * in PackageManager. 71723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet */ 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String installFailureToString(int result) { 71923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet Field[] fields = PackageManager.class.getFields(); 72023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet for (Field f: fields) { 72123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (f.getType() == int.class) { 72223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet int modifiers = f.getModifiers(); 72323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // only look at public final static fields. 72423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (((modifiers & Modifier.FINAL) != 0) && 72523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.PUBLIC) != 0) && 72623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.STATIC) != 0)) { 72723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet String fieldName = f.getName(); 72823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (fieldName.startsWith("INSTALL_FAILED_") || 72923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet fieldName.startsWith("INSTALL_PARSE_FAILED_")) { 73023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // get the int value and compare it to result. 73123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet try { 73223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (result == f.getInt(null)) { 73323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return fieldName; 73423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 73523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } catch (IllegalAccessException e) { 73623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // this shouldn't happen since we only look for public static fields. 73723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 73823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 73923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 74023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 74123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 74223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 74323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // couldn't find a matching constant? return the value 74423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return Integer.toString(result); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 74740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runSetInstallLocation() { 74840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc; 74940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 75040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String arg = nextArg(); 75140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (arg == null) { 75240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: no install location specified."); 75340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 75440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 75540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 75640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu loc = Integer.parseInt(arg); 75740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (NumberFormatException e) { 75840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 75940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 76040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 76140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 76240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (!mPm.setInstallLocation(loc)) { 76340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 76440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 76540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 76640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 76740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 76840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 76940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 77040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 77140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runGetInstallLocation() { 77240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 77340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc = mPm.getInstallLocation(); 77440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String locStr = "invalid"; 77540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_AUTO) { 77640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "auto"; 77740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { 77840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "internal"; 77940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 78040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "external"; 78140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 78240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.out.println(loc + "[" + locStr + "]"); 78340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 78440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 78540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 78640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 78740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 78840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 7907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn int installFlags = PackageManager.INSTALL_ALL_USERS; 791c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski String installerPackageName = null; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 794ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 795ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward String algo = null; 796ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward byte[] iv = null; 797ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward byte[] key = null; 798ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 799ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward String macAlgo = null; 800ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward byte[] macKey = null; 801ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward byte[] tag = null; 802706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings String originatingUriString = null; 803706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings String referrer = null; 804ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 807ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 809ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 810c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } else if (opt.equals("-i")) { 811c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName = nextOptionData(); 812c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski if (installerPackageName == null) { 813c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski System.err.println("Error: no value specified for -i"); 814c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski return; 815c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } 816ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } else if (opt.equals("-t")) { 817ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_TEST; 818af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } else if (opt.equals("-s")) { 8198946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Override if -s option is specified. 8205b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFlags |= PackageManager.INSTALL_EXTERNAL; 82114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (opt.equals("-f")) { 82214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Override if -s option is specified. 82314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFlags |= PackageManager.INSTALL_INTERNAL; 8247767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } else if (opt.equals("-d")) { 8257767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; 826ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--algo")) { 827ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward algo = nextOptionData(); 828ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (algo == null) { 829ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --algo"); 830ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 831ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 832ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--iv")) { 833ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward iv = hexToBytes(nextOptionData()); 834ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (iv == null) { 835ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --iv"); 836ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 837ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 838ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--key")) { 839ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward key = hexToBytes(nextOptionData()); 840ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (key == null) { 841ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --key"); 842ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 843ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 844ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--macalgo")) { 845ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward macAlgo = nextOptionData(); 846ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (macAlgo == null) { 847ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --macalgo"); 848ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 849ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 850ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--mackey")) { 851ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward macKey = hexToBytes(nextOptionData()); 852ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (macKey == null) { 853ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --mackey"); 854ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 855ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 856ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else if (opt.equals("--tag")) { 857ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward tag = hexToBytes(nextOptionData()); 858ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (tag == null) { 859ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: must supply argument for --tag"); 860ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 861ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 862706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else if (opt.equals("--originating-uri")) { 863706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingUriString = nextOptionData(); 864706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (originatingUriString == null) { 865706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println("Error: must supply argument for --originating-uri"); 866706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings return; 867706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 868706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else if (opt.equals("--referrer")) { 869706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrer = nextOptionData(); 870706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (referrer == null) { 871706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println("Error: must supply argument for --referrer"); 872706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings return; 873706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 880ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final ContainerEncryptionParams encryptionParams; 881ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (algo != null || iv != null || key != null || macAlgo != null || macKey != null 882ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward || tag != null) { 883ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (algo == null || iv == null || key == null) { 884ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: all of --algo, --iv, and --key must be specified"); 885ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 886ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 887ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 888ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (macAlgo != null || macKey != null || tag != null) { 889ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (macAlgo == null || macKey == null || tag == null) { 890ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println("Error: all of --macalgo, --mackey, and --tag must " 891ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward + "be specified"); 892ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 893ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 894ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 895ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 896ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward try { 897ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final SecretKey encKey = new SecretKeySpec(key, "RAW"); 898ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 899ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final SecretKey macSecretKey; 900ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (macKey == null || macKey.length == 0) { 901ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward macSecretKey = null; 902ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else { 903ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward macSecretKey = new SecretKeySpec(macKey, "RAW"); 904ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 905ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 906ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward encryptionParams = new ContainerEncryptionParams(algo, new IvParameterSpec(iv), 907ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward encKey, macAlgo, null, macSecretKey, tag, -1, -1, -1); 908ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } catch (InvalidAlgorithmParameterException e) { 909ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward e.printStackTrace(); 910ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return; 911ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 912ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } else { 913ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward encryptionParams = null; 914ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 915ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 9165ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri apkURI; 9175ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri verificationURI; 918706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings final Uri originatingURI; 919706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings final Uri referrerURI; 920706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 921706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (originatingUriString != null) { 922706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingURI = Uri.parse(originatingUriString); 923706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else { 924706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingURI = null; 925706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 926706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 927706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (referrer != null) { 928706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrerURI = Uri.parse(referrer); 929706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else { 930706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrerURI = null; 931706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 9325ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 9335ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate apkURI, must be present 9345ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String apkFilePath = nextArg(); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 9365ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (apkFilePath != null) { 9375ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root apkURI = Uri.fromFile(new File(apkFilePath)); 9385ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9435ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate verificationURI, optionally present 9445ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String verificationFilePath = nextArg(); 9455ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (verificationFilePath != null) { 9465ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root System.err.println("\tver: " + verificationFilePath); 9475ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = Uri.fromFile(new File(verificationFilePath)); 9485ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 9495ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = null; 9505ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } 9515ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInstallObserver obs = new PackageInstallObserver(); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 954706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings VerificationParams verificationParams = new VerificationParams(verificationURI, 95537d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver originatingURI, referrerURI, VerificationParams.NO_UID, null); 956706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 957706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings mPm.installPackageWithVerificationAndEncryption(apkURI, obs, installFlags, 958706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings installerPackageName, verificationParams, encryptionParams); 95923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 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 if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + installFailureToString(obs.result) 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 981ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward /** 982ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward * Convert a string containing hex-encoded bytes to a byte array. 983ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward * 984ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward * @param input String containing hex-encoded bytes 985ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward * @return input as an array of bytes 986ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward */ 987ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward private byte[] hexToBytes(String input) { 988ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if (input == null) { 989ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return null; 990ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 991ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 992ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final int inputLength = input.length(); 993ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward if ((inputLength % 2) != 0) { 994ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.print("Invalid length; must be multiple of 2"); 995ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return null; 996ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 997ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 998ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final int byteLength = inputLength / 2; 999ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward final byte[] output = new byte[byteLength]; 1000ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1001ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward int inputIndex = 0; 1002ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward int byteIndex = 0; 1003ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward while (inputIndex < inputLength) { 1004ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward output[byteIndex++] = (byte) Integer.parseInt( 1005ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward input.substring(inputIndex, inputIndex + 2), 16); 1006ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward inputIndex += 2; 1007ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1008ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1009ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward return output; 1010ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1011ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1012483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runCreateUser() { 10130b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String name; 10140b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 10150b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 10160b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user name specified."); 10170b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 10180b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10190b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani name = arg; 10200b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 1021e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey final UserInfo info = mUm.createUser(name, 0); 1022e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey if (info != null) { 1023e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey System.out.println("Success: created user id " + info.id); 1024e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey } else { 1025483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: couldn't create User."); 10260b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10270b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 10280b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 10290b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 10300b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10310b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 10320b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10330b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1034483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runRemoveUser() { 10350b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani int userId; 10360b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 10370b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 10380b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user id specified."); 10390b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 10400b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10410b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 10420b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani userId = Integer.parseInt(arg); 10430b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (NumberFormatException e) { 1044786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("Error: user id '" + arg + "' is not a number."); 10450b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 10460b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10470b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 10484c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey if (mUm.removeUser(userId)) { 10494c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.out.println("Success: removed user"); 10504c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } else { 10514c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.err.println("Error: couldn't remove user id " + userId); 10520b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10530b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 10540b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 10550b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 10560b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10570b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 10580b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1059483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runListUsers() { 1060742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani try { 1061920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani List<UserInfo> users = mUm.getUsers(false); 1062742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (users == null) { 1063742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println("Error: couldn't get users"); 1064742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 1065742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.out.println("Users:"); 1066742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (int i = 0; i < users.size(); i++) { 1067742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.out.println("\t" + users.get(i).toString()); 1068742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1069742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1070742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } catch (RemoteException e) { 1071742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(e.toString()); 1072742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 1073742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1074742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 10754c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 10764c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey public void runGetMaxUsers() { 10774c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers()); 10784c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } 10794c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class PackageDeleteObserver extends IPackageDeleteObserver.Stub { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result; 108323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1084c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root public void packageDeleted(String packageName, int returnCode) { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 1087c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root result = returnCode == PackageManager.DELETE_SUCCEEDED; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 109223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runUninstall() { 10945e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn int unInstallFlags = PackageManager.DELETE_ALL_USERS; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10965e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn String opt; 10975e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn while ((opt=nextOption()) != null) { 10985e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (opt.equals("-k")) { 10995e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn unInstallFlags |= PackageManager.DELETE_KEEP_DATA; 11005e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else { 11015e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Unknown option: " + opt); 11025e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 11035e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = deletePackage(pkg, unInstallFlags); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Failure"); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean deletePackage(String pkg, int unInstallFlags) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageDeleteObserver obs = new PackageDeleteObserver(); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 112367df64b3a48a8157d08a98fa90135d0ac0ee621cAmith Yamasani mPm.deletePackageAsUser(pkg, obs, UserHandle.USER_OWNER, unInstallFlags); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obs.result; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1140197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn static class ClearDataObserver extends IPackageDataObserver.Stub { 1141690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean finished; 1142690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean result; 1143690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1144690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn @Override 1145690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 1146690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (this) { 1147690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn finished = true; 1148690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn result = succeeded; 1149690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn notifyAll(); 1150690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1151690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1152690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1153690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1154690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1155690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn private void runClear() { 1156a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey int userId = 0; 1157a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey String option = nextOption(); 1158a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey if (option != null && option.equals("--user")) { 1159a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey String optionData = nextOptionData(); 1160a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey if (optionData == null || !isNumber(optionData)) { 1161a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey System.err.println("Error: no USER_ID specified"); 1162a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey showUsage(); 1163a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey return; 1164a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } else { 1165a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey userId = Integer.parseInt(optionData); 1166a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } 1167a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } 1168a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey 1169690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn String pkg = nextArg(); 1170690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (pkg == null) { 1171690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Error: no package specified"); 1172690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn showUsage(); 1173690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 1174690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1175690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1176690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 1177690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1178a83cab0001ca4d90abe622c22a7af1b0da54f739Christopher Tate ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, userId); 1179690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (obs) { 1180690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn while (!obs.finished) { 1181690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1182690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn obs.wait(); 1183690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (InterruptedException e) { 1184690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1185690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1186690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1187690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1188690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (obs.result) { 1189690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Success"); 1190690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } else { 1191690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 1192690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1193690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (RemoteException e) { 1194690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(e.toString()); 1195690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1196690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1197690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1198690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 12070ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER: 12080ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return "disabled-user"; 1209fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED: 1210fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn return "disabled-until-used"; 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 121423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1215a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey private static boolean isNumber(String s) { 1216483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 1217483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Integer.parseInt(s); 1218483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (NumberFormatException nfe) { 1219483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return false; 1220483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1221483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return true; 1222483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1223483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 1225483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId = 0; 1226483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String option = nextOption(); 1227483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (option != null && option.equals("--user")) { 1228483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String optionData = nextOptionData(); 1229483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (optionData == null || !isNumber(optionData)) { 1230483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: no USER_ID specified"); 1231483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani showUsage(); 1232483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 1233483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 1234483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userId = Integer.parseInt(optionData); 1235483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1236483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1237483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12473fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn mPm.setApplicationEnabledSetting(pkg, state, 0, userId, 12483fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn "shell:" + android.os.Process.myUid()); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1251483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getApplicationEnabledSetting(pkg, userId))); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1258483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.setComponentEnabledSetting(cn, state, 0, userId); 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1261483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getComponentEnabledSetting(cn, userId))); 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani private void runSetBlockedSetting(boolean state) { 1270655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani int userId = 0; 1271655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String option = nextOption(); 1272655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (option != null && option.equals("--user")) { 1273655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String optionData = nextOptionData(); 1274655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (optionData == null || !isNumber(optionData)) { 1275655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println("Error: no USER_ID specified"); 1276655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani showUsage(); 1277655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 1278655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } else { 1279655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani userId = Integer.parseInt(optionData); 1280655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1281655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1282655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 1283655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String pkg = nextArg(); 1284655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (pkg == null) { 1285655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println("Error: no package or component specified"); 1286655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani showUsage(); 1287655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 1288655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1289655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani try { 1290655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani mPm.setApplicationBlockedSettingAsUser(pkg, state, userId); 1291655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println("Package " + pkg + " new blocked state: " 1292655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani + mPm.getApplicationBlockedSettingAsUser(pkg, userId)); 1293655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } catch (RemoteException e) { 1294655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(e.toString()); 1295655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 1296655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1297655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1298655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 1299e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn private void runGrantRevokePermission(boolean grant) { 1300e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String pkg = nextArg(); 1301e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (pkg == null) { 1302e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no package specified"); 1303e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1304e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1305e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1306e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String perm = nextArg(); 1307e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (perm == null) { 1308e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no permission specified"); 1309e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1310e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1311e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1312e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn try { 1313e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (grant) { 1314e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.grantPermission(pkg, perm); 1315e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } else { 1316e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.revokePermission(pkg, perm); 1317e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1318e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (RemoteException e) { 1319e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(e.toString()); 1320e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1321e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (IllegalArgumentException e) { 1322e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Bad argument: " + e.toString()); 1323e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1324e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (SecurityException e) { 1325e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Operation not allowed: " + e.toString()); 1326e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1327e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1328e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1329719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey private void runSetPermissionEnforced() { 1330719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String permission = nextArg(); 1331719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (permission == null) { 1332719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no permission specified"); 1333719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1334719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1335719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1336719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String enforcedRaw = nextArg(); 1337719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (enforcedRaw == null) { 1338719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no enforcement specified"); 1339719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1340719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1341719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1342719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final boolean enforced = Boolean.parseBoolean(enforcedRaw); 1343719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey try { 1344719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey mPm.setPermissionEnforced(permission, enforced); 1345719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (RemoteException e) { 1346719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(e.toString()); 1347719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(PM_NOT_RUNNING_ERR); 1348719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (IllegalArgumentException e) { 1349719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Bad argument: " + e.toString()); 1350719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1351719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (SecurityException e) { 1352719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Operation not allowed: " + e.toString()); 1353719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1354719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1355719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 1356197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn static class ClearCacheObserver extends IPackageDataObserver.Stub { 1357197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn boolean finished; 1358197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn boolean result; 1359197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1360197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn @Override 1361197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 1362197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn synchronized (this) { 1363197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn finished = true; 1364197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn result = succeeded; 1365197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn notifyAll(); 1366197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1367197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1368197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1369197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1370197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1371197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn private void runTrimCaches() { 1372197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn String size = nextArg(); 1373197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (size == null) { 1374197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Error: no size specified"); 1375197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1376197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1377197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1378197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn int len = size.length(); 1379197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn long multiplier = 1; 1380197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (len > 1) { 1381197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn char c = size.charAt(len-1); 1382197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (c == 'K' || c == 'k') { 1383197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L; 1384197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else if (c == 'M' || c == 'm') { 1385197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L*1024L; 1386197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else if (c == 'G' || c == 'g') { 1387197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L*1024L*1024L; 1388197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else { 1389197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Invalid suffix: " + c); 1390197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1391197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1392197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1393197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn size = size.substring(0, len-1); 1394197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1395197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn long sizeVal; 1396197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1397197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn sizeVal = Long.parseLong(size) * multiplier; 1398197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (NumberFormatException e) { 1399197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Error: expected number at: " + size); 1400197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1401197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1402197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1403197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 1404197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1405197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn mPm.freeStorageAndNotify(sizeVal, obs); 1406197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn synchronized (obs) { 1407197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn while (!obs.finished) { 1408197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1409197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn obs.wait(); 1410197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (InterruptedException e) { 1411197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1412197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1413197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1414197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (RemoteException e) { 1415197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(e.toString()); 1416197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1417197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (IllegalArgumentException e) { 1418197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Bad argument: " + e.toString()); 1419197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1420197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (SecurityException e) { 1421197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Operation not allowed: " + e.toString()); 1422197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1423197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1424197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1431483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageInfo info = mPm.getPackageInfo(pckg, 0, 0); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 144123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 144523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1447483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0, 0); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 1507151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]"); 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 151023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 1511039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(" pm list features"); 1512e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list libraries"); 15137e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm list users"); 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 1515cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println(" pm dump PACKAGE"); 1516ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f]"); 1517706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>]"); 1518706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println(" [--originating-uri <URI>] [--referrer <URI>] PATH"); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm uninstall [-k] PACKAGE"); 1520a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey System.err.println(" pm clear [--user USER_ID] PACKAGE"); 15217e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT"); 15227e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT"); 15237e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT"); 1524fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn System.err.println(" pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT"); 1525655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(" pm block [--user USER_ID] PACKAGE_OR_COMPONENT"); 1526655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(" pm unblock [--user USER_ID] PACKAGE_OR_COMPONENT"); 1527e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm grant PACKAGE PERMISSION"); 1528e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm revoke PACKAGE PERMISSION"); 152946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]"); 153046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm get-install-location"); 1531719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(" pm set-permission-enforced PERMISSION [true|false]"); 1532197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(" pm trim-caches DESIRED_FREE_SPACE"); 15337e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm create-user USER_NAME"); 15347e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm remove-user USER_ID"); 15354c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.err.println(" pm get-max-users"); 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 153746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list packages: prints all packages, optionally only"); 153846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those whose package name contains the text in FILTER. Options:"); 153946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: see their associated file."); 154046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: filter to only show disbled packages."); 154146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -e: filter to only show enabled packages."); 154246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: filter to only show system packages."); 154346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -3: filter to only show third party packages."); 154492a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.err.println(" -i: see the installer for the packages."); 154546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: also include uninstalled packages."); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 154746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permission-groups: prints all known permission groups."); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 154946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permissions: prints all known permissions, optionally only"); 155046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those in GROUP. Options:"); 155146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -g: organize by group."); 155246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: print all information."); 155346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: short summary."); 155446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: only list dangerous permissions."); 155546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: list only the permissions users will see."); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 155746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list instrumentation: use to list all test packages; optionally"); 155846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" supply <TARGET-PACKAGE> to list the test packages for a particular"); 155946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" application. Options:"); 156046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: list the .apk file for the test package."); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 156246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list features: prints all features of the system."); 1563039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(""); 1564786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm list users: prints all users on the system."); 1565786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 156646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm path: print the path to the .apk of the given PACKAGE."); 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1568cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println("pm dump: print system state associated w ith the given PACKAGE."); 1569cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println(""); 157046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm install: installs a package to the system. Options:"); 157146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -l: install the package with FORWARD_LOCK."); 157246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -r: reinstall an exisiting app, keeping its data."); 157346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -t: allow test .apks to be installed."); 157446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -i: specify the installer package name."); 157546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: install package on sdcard."); 157646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: install package on internal flash."); 15777767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn System.err.println(" -d: allow version code downgrade."); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 157946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm uninstall: removes a package from the system. Options:"); 158046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -k: keep the data and cache directories around after package removal."); 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 158246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm clear: deletes all data associated with a package."); 1583690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(""); 158450707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println("pm enable, disable, disable-user, disable-until-used: these commands"); 158550707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println(" change the enabled state of a given package or component (written"); 158650707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println(" as \"package/class\")."); 158740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 1588e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("pm grant, revoke: these commands either grant or revoke permissions"); 1589e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" to applications. Only optional permissions the application has"); 1590e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" declared can be granted or revoked."); 1591e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(""); 159246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm get-install-location: returns the current install location."); 159346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 159446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 159546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 159640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 159746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm set-install-location: changes the default install location."); 159846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" NOTE: this is only intended for debugging; using this can cause"); 159946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" applications to break and other undersireable behavior."); 160046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 160146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 160246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 1603197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(""); 1604197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("pm trim-caches: trim cache files to reach the given free space."); 1605786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 1606786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm create-user: create a new user with the given USER_NAME,"); 1607786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(" printing the new user identifier of the user."); 1608786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 1609786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm remove-user: remove the user with the given USER_IDENTIFIER,"); 1610786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(" deleting all data associated with that user"); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1613