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; 216143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guyimport android.app.IActivityManager; 22ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.app.PackageInstallObserver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 24a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IIntentReceiver; 25a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IIntentSender; 26fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4cJeff Sharkeyimport android.content.Intent; 27a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IntentSender; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 29039c68e75606e837cf021815a0210836724574adDianne Hackbornimport android.content.pm.FeatureInfo; 30690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.content.pm.IPackageDataObserver; 31ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.content.pm.IPackageInstaller; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo; 35ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.content.pm.PackageInstaller; 36a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.pm.PackageInstaller.SessionInfo; 37a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.pm.PackageInstaller.SessionParams; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 400e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.content.pm.ParceledListSlice; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo; 43742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo; 44706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.content.pm.VerificationParams; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 48116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamathimport android.os.Build; 49f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tateimport android.os.Bundle; 50258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager; 5131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guyimport android.os.Process; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 54151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasaniimport android.os.UserHandle; 554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkeyimport android.os.UserManager; 56ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkeyimport android.text.TextUtils; 57ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.util.Log; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkeyimport com.android.internal.content.PackageHelper; 60513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkeyimport com.android.internal.util.ArrayUtils; 61ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport com.android.internal.util.SizedInputStream; 62ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 63ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport libcore.io.IoUtils; 64513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 66cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport java.io.FileDescriptor; 67ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.FileInputStream; 68ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.IOException; 69ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.InputStream; 70ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.OutputStream; 7123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field; 7223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap; 78a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport java.util.concurrent.SynchronousQueue; 79a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport java.util.concurrent.TimeUnit; 808a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm { 82ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private static final String TAG = "Pm"; 83ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPackageManager mPm; 85ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IPackageInstaller mInstaller; 86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani IUserManager mUm; 8723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakHashMap<String, Resources> mResourceCache 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WeakHashMap<String, Resources>(); 9023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 9423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet private static final String PM_NOT_RUNNING_ERR = 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Could not access the Package Manager. Is the system running?"; 9723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 99ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey try { 100ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey new Pm().run(args); 101ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } catch (Exception e) { 102ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey Log.e(TAG, "Error", e); 103ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("Error: " + e); 104ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (e instanceof RemoteException) { 105ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(PM_NOT_RUNNING_ERR); 106ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 107ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 110ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey public void run(String[] args) throws IOException, RemoteException { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean validCommand = false; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 117258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mUm = IUserManager.Stub.asInterface(ServiceManager.getService("user")); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPm == null) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 123ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey mInstaller = mPm.getPackageInstaller(); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 12823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("list".equals(op)) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runList(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("path".equals(op)) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runPath(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 139cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn if ("dump".equals(op)) { 140cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn runDump(); 141cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 142cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 143cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("install".equals(op)) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstall(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 149ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if ("install-create".equals(op)) { 150ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey runInstallCreate(); 151ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey return; 152ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 153ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 154ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if ("install-write".equals(op)) { 155ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey runInstallWrite(); 156ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey return; 157ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 158ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 159ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if ("install-commit".equals(op)) { 160ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey runInstallCommit(); 161ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey return; 162ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 163ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 16416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey if ("install-abandon".equals(op) || "install-destroy".equals(op)) { 16516c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey runInstallAbandon(); 166ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey return; 167ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 168ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 169ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if ("set-installer".equals(op)) { 170ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey runSetInstaller(); 171ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey return; 172ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 173ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("uninstall".equals(op)) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runUninstall(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 179690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if ("clear".equals(op)) { 180690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn runClear(); 181690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 182690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 183690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("enable".equals(op)) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("disable".equals(op)) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1940ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn if ("disable-user".equals(op)) { 1950ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); 1960ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return; 1970ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn } 1980ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn 199fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn if ("disable-until-used".equals(op)) { 200fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); 201fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn return; 202fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn } 203fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn 204e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani if ("hide".equals(op)) { 205e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani runSetHiddenSetting(true); 206655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 207655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 208655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 209e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani if ("unhide".equals(op)) { 210e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani runSetHiddenSetting(false); 211655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 212655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 213655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 214e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("grant".equals(op)) { 215e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(true); 216e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 217e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 218e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 219e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if ("revoke".equals(op)) { 220e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn runGrantRevokePermission(false); 221e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 222e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 223e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 224719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if ("set-permission-enforced".equals(op)) { 225719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey runSetPermissionEnforced(); 226719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 227719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 228719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 22946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("set-install-location".equals(op)) { 23040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runSetInstallLocation(); 23140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 23240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 23340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 23446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("get-install-location".equals(op)) { 23540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu runGetInstallLocation(); 23640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 23740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 23840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 239197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if ("trim-caches".equals(op)) { 240197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn runTrimCaches(); 241197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 242197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 243197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 244483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("create-user".equals(op)) { 245483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runCreateUser(); 246742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return; 247742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 248742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 249483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("remove-user".equals(op)) { 250483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runRemoveUser(); 2510b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 2520b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 2530b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 2544c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey if ("get-max-users".equals(op)) { 2554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey runGetMaxUsers(); 2564c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey return; 2574c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } 2584c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 25920e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey if ("force-dex-opt".equals(op)) { 26020e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey runForceDexOpt(); 26120e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey return; 26220e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey } 26320e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length == 1) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-l")) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args[0].equalsIgnoreCase("-lf")){ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(true); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (args.length == 2) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args[0].equalsIgnoreCase("-p")) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project validCommand = true; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(args[1]); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (validCommand == false) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op != null) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown command '" + op + "'"); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Execute the list sub-command. 29123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list [package | packages] 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permission-groups 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list permissions 295039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 296e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runList() { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = nextArg(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == null) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: didn't specify type of data to list"); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("package".equals(type) || "packages".equals(type)) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPackages(false); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permission-groups".equals(type)) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissionGroups(); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("permissions".equals(type)) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListPermissions(); 311039c68e75606e837cf021815a0210836724574adDianne Hackborn } else if ("features".equals(type)) { 312039c68e75606e837cf021815a0210836724574adDianne Hackborn runListFeatures(); 313e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("libraries".equals(type)) { 314e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn runListLibraries(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("instrumentation".equals(type)) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runListInstrumentation(); 317483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if ("users".equals(type)) { 318483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani runListUsers(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: unknown list type '" + type + "'"); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the installed packages. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPackages(boolean showApplicationPackage) { 328e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int getFlags = 0; 329e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean listDisabled = false, listEnabled = false; 3300f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn boolean listSystem = false, listThirdParty = false; 33192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma boolean listInstaller = false; 332151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani int userId = UserHandle.USER_OWNER; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // old compat 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-lf")) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-f")) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showApplicationPackage = true; 342e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-d")) { 343e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listDisabled = true; 344e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-e")) { 345e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn listEnabled = true; 3460f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-s")) { 3470f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listSystem = true; 3480f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn } else if (opt.equals("-3")) { 3490f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn listThirdParty = true; 35092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } else if (opt.equals("-i")) { 35192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma listInstaller = true; 352151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani } else if (opt.equals("--user")) { 353151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani userId = Integer.parseInt(nextArg()); 354e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (opt.equals("-u")) { 355e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String filter = nextArg(); 367e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 369151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags, userId); 37023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = packages.size(); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo info = packages.get(p); 374e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (filter != null && !info.packageName.contains(filter)) { 375e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn continue; 376e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 3770f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn final boolean isSystem = 3780f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0; 379e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ((!listDisabled || !info.applicationInfo.enabled) && 3800f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listEnabled || info.applicationInfo.enabled) && 3810f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listSystem || isSystem) && 3820f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn (!listThirdParty || !isSystem)) { 383e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("package:"); 384e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (showApplicationPackage) { 385e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print(info.applicationInfo.sourceDir); 386e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("="); 387e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 38892a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(info.packageName); 38992a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma if (listInstaller) { 39092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(" installer="); 39192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.print(mPm.getInstallerPackageName(info.packageName)); 39292a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma } 39392a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.out.println(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 4020e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root @SuppressWarnings("unchecked") 403151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags, int userId) 4040e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root throws RemoteException { 405d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn ParceledListSlice<PackageInfo> slice = pm.getInstalledPackages(flags, userId); 406d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return slice.getList(); 4070e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root } 4080e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 410039c68e75606e837cf021815a0210836724574adDianne Hackborn * Lists all of the features supported by the current device. 411039c68e75606e837cf021815a0210836724574adDianne Hackborn * 412039c68e75606e837cf021815a0210836724574adDianne Hackborn * pm list features 413039c68e75606e837cf021815a0210836724574adDianne Hackborn */ 414039c68e75606e837cf021815a0210836724574adDianne Hackborn private void runListFeatures() { 415039c68e75606e837cf021815a0210836724574adDianne Hackborn try { 416039c68e75606e837cf021815a0210836724574adDianne Hackborn List<FeatureInfo> list = new ArrayList<FeatureInfo>(); 417039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo[] rawList = mPm.getSystemAvailableFeatures(); 418039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int i=0; i<rawList.length; i++) { 419039c68e75606e837cf021815a0210836724574adDianne Hackborn list.add(rawList[i]); 420039c68e75606e837cf021815a0210836724574adDianne Hackborn } 421babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6bJoe Malin 422039c68e75606e837cf021815a0210836724574adDianne Hackborn 423039c68e75606e837cf021815a0210836724574adDianne Hackborn // Sort by name 424039c68e75606e837cf021815a0210836724574adDianne Hackborn Collections.sort(list, new Comparator<FeatureInfo>() { 425039c68e75606e837cf021815a0210836724574adDianne Hackborn public int compare(FeatureInfo o1, FeatureInfo o2) { 426039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == o2.name) return 0; 427039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o1.name == null) return -1; 428039c68e75606e837cf021815a0210836724574adDianne Hackborn if (o2.name == null) return 1; 429039c68e75606e837cf021815a0210836724574adDianne Hackborn return o1.name.compareTo(o2.name); 430039c68e75606e837cf021815a0210836724574adDianne Hackborn } 431039c68e75606e837cf021815a0210836724574adDianne Hackborn }); 432039c68e75606e837cf021815a0210836724574adDianne Hackborn 433039c68e75606e837cf021815a0210836724574adDianne Hackborn int count = (list != null) ? list.size() : 0; 434039c68e75606e837cf021815a0210836724574adDianne Hackborn for (int p = 0; p < count; p++) { 435039c68e75606e837cf021815a0210836724574adDianne Hackborn FeatureInfo fi = list.get(p); 436039c68e75606e837cf021815a0210836724574adDianne Hackborn System.out.print("feature:"); 437039c68e75606e837cf021815a0210836724574adDianne Hackborn if (fi.name != null) System.out.println(fi.name); 438039c68e75606e837cf021815a0210836724574adDianne Hackborn else System.out.println("reqGlEsVersion=0x" 439039c68e75606e837cf021815a0210836724574adDianne Hackborn + Integer.toHexString(fi.reqGlEsVersion)); 440039c68e75606e837cf021815a0210836724574adDianne Hackborn } 441039c68e75606e837cf021815a0210836724574adDianne Hackborn } catch (RemoteException e) { 442039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(e.toString()); 443039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 444039c68e75606e837cf021815a0210836724574adDianne Hackborn } 445039c68e75606e837cf021815a0210836724574adDianne Hackborn } 446039c68e75606e837cf021815a0210836724574adDianne Hackborn 447039c68e75606e837cf021815a0210836724574adDianne Hackborn /** 448e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Lists all of the libraries supported by the current device. 449e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * 450e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * pm list libraries 451e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 452e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void runListLibraries() { 453e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn try { 454e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<String> list = new ArrayList<String>(); 455e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String[] rawList = mPm.getSystemSharedLibraryNames(); 456e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int i=0; i<rawList.length; i++) { 457e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn list.add(rawList[i]); 458e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 459e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 460e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 461e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Sort by name 462e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn Collections.sort(list, new Comparator<String>() { 463e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public int compare(String o1, String o2) { 464e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == o2) return 0; 465e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o1 == null) return -1; 466e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (o2 == null) return 1; 467e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return o1.compareTo(o2); 468e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 469e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn }); 470e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 471e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int count = (list != null) ? list.size() : 0; 472e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (int p = 0; p < count; p++) { 473e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn String lib = list.get(p); 474e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.print("library:"); 475e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.out.println(lib); 476e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 477e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } catch (RemoteException e) { 478e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(e.toString()); 479e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 480e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 481e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 482e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 483e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all of the installed instrumentation, or all for a given package 48523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pm list instrumentation [package] [-f] 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListInstrumentation() { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = 0; // flags != 0 is only used to request meta-data 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showPackage = false; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetPackage = null; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextArg()) != null) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showPackage = true; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.charAt(0) != '-') { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetPackage = opt; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException ex) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: " + ex.toString()); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sort by target package 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(list, new Comparator<InstrumentationInfo>() { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compare(InstrumentationInfo o1, InstrumentationInfo o2) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return o1.targetPackage.compareTo(o2.targetPackage); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = (list != null) ? list.size() : 0; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0; p < count; p++) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = list.get(p); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("instrumentation:"); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showPackage) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.sourceDir); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("="); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = new ComponentName(ii.packageName, ii.name); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(cn.flattenToShortString()); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(" (target="); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(ii.targetPackage); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(")"); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the known permission groups. 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissionGroups() { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0); 54623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = pgs.size(); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = pgs.get(p); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("permission group:"); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pgi.name); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nonLocalized != null) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nonLocalized.toString(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5631c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (res != 0) { 5641c3274ca12a6931568693b897c269107f0346eabAli Utku Selen Resources r = getResources(pii); 5651c3274ca12a6931568693b897c269107f0346eabAli Utku Selen if (r != null) { 5661c3274ca12a6931568693b897c269107f0346eabAli Utku Selen return r.getString(res); 5671c3274ca12a6931568693b897c269107f0346eabAli Utku Selen } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all the permissions in a group. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runListPermissions() { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean labels = false; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups = false; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean userOnly = false; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean summary = false; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dangerousOnly = false; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-f")) { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-g")) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-s")) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groups = true; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labels = true; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project summary = true; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-u")) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userOnly = true; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-d")) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dangerousOnly = true; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 60123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String grp = nextOption(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> groupList = new ArrayList<String>(); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionGroupInfo> infos = 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm.getAllPermissionGroups(0); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<infos.size(); i++) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(infos.get(i).name); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(null); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.add(grp); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dangerousOnly) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous Permissions:"); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS, 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userOnly) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Normal Permissions:"); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (userOnly) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Dangerous and Normal Permissions:"); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL, 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_DANGEROUS); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("All Permissions:"); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doListPermissions(groupList, groups, labels, summary, 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -10000, 10000); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void doListPermissions(ArrayList<String> groupList, 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean groups, boolean labels, boolean summary, 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startProtectionLevel, int endProtectionLevel) 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<groupList.size(); i++) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String groupName = groupList.get(i); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefix = ""; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) System.out.println(""); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groupName != null) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = mPm.getPermissionGroupInfo( 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupName, 0); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pgi, pgi.labelRes, 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel) + ": "); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pgi.name + ": "); 66523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println((labels ? "+ " : "") 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "group:" + pgi.name); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" package:" + pgi.packageName); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pgi); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" label:" 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.labelRes, 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedLabel)); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(" description:" 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pgi, pgi.descriptionRes, 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.nonLocalizedDescription)); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(((labels && !summary) 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? "+ " : "") + "ungrouped:"); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prefix = " "; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<PermissionInfo> ps = mPm.queryPermissionsByGroup( 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupList.get(i), 0); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = ps.size(); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean first = true; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int p = 0 ; p < count ; p++) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = ps.get(p); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (groups && groupName == null && pi.group != null) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 698e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn final int base = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; 699e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (base < startProtectionLevel 700e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn || base > endProtectionLevel) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (first) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project first = false; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(", "); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(loadText(pi, pi.labelRes, 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pi.name); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + (labels ? "+ " : "") 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "permission:" + pi.name); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labels) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " package:" + pi.packageName); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = getResources(pi); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) { 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " label:" 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.labelRes, 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedLabel)); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(prefix + " description:" 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + loadText(pi, pi.descriptionRes, 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.nonLocalizedDescription)); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 730e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.out.println(prefix + " protectionLevel:" 731e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn + PermissionInfo.protectionToString(pi.protectionLevel)); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (summary) { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(""); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runPath() { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayPackageFilePath(pkg); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 751cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn private void runDump() { 752cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn String pkg = nextArg(); 753cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn if (pkg == null) { 754cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println("Error: no package specified"); 755cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 756cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 757cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn ActivityManager.dumpPackageStateStatic(FileDescriptor.out, pkg); 758cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 759cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 760ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey class LocalPackageInstallObserver extends PackageInstallObserver { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean finished; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 763f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate String extraPermission; 764f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate String extraPackage; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 766f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate @Override 767fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4cJeff Sharkey public void onPackageInstalled(String name, int status, String msg, Bundle extras) { 768ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey synchronized (this) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finished = true; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = status; 771f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate if (status == PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION) { 772f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate extraPermission = extras.getString( 773f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate PackageManager.EXTRA_FAILURE_EXISTING_PERMISSION); 774f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate extraPackage = extras.getString( 775f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate PackageManager.EXTRA_FAILURE_EXISTING_PACKAGE); 776f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 78223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet /** 78323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * Converts a failure code into a string by using reflection to find a matching constant 78423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet * in PackageManager. 78523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet */ 786ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private String installFailureToString(LocalPackageInstallObserver obs) { 787f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate final int result = obs.result; 78823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet Field[] fields = PackageManager.class.getFields(); 78923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet for (Field f: fields) { 79023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (f.getType() == int.class) { 79123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet int modifiers = f.getModifiers(); 79223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // only look at public final static fields. 79323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (((modifiers & Modifier.FINAL) != 0) && 79423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.PUBLIC) != 0) && 79523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet ((modifiers & Modifier.STATIC) != 0)) { 79623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet String fieldName = f.getName(); 79723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (fieldName.startsWith("INSTALL_FAILED_") || 79823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet fieldName.startsWith("INSTALL_PARSE_FAILED_")) { 79923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // get the int value and compare it to result. 80023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet try { 80123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet if (result == f.getInt(null)) { 802f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate StringBuilder sb = new StringBuilder(64); 803f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate sb.append(fieldName); 804f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate if (obs.extraPermission != null) { 805f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate sb.append(" perm="); 806f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate sb.append(obs.extraPermission); 807f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate } 808f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate if (obs.extraPackage != null) { 809f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate sb.append(" pkg=" + obs.extraPackage); 810f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate } 811f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate return sb.toString(); 81223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 81323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } catch (IllegalAccessException e) { 81423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // this shouldn't happen since we only look for public static fields. 81523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 81623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 81723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 81823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 81923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet } 82023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 82123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet // couldn't find a matching constant? return the value 82223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet return Integer.toString(result); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 82540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runSetInstallLocation() { 82640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc; 82740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 82840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String arg = nextArg(); 82940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (arg == null) { 83040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: no install location specified."); 83140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 83240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 83340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 83440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu loc = Integer.parseInt(arg); 83540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (NumberFormatException e) { 83640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 83740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return; 83840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 83940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 84040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (!mPm.setInstallLocation(loc)) { 84140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println("Error: install location has to be a number."); 84240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 84340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 84440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 84540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 84640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 84740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 84840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 84940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu private void runGetInstallLocation() { 85040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu try { 85140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu int loc = mPm.getInstallLocation(); 85240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu String locStr = "invalid"; 85340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_AUTO) { 85440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "auto"; 85540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { 85640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "internal"; 85740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 85840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu locStr = "external"; 85940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 86040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.out.println(loc + "[" + locStr + "]"); 86140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } catch (RemoteException e) { 86240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(e.toString()); 86340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(PM_NOT_RUNNING_ERR); 86440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 86540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu } 86640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runInstall() { 868e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey int installFlags = 0; 869dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani int userId = UserHandle.USER_ALL; 870c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski String installerPackageName = null; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String opt; 873ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 874706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings String originatingUriString = null; 875706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings String referrer = null; 876116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamath String abi = null; 877ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((opt=nextOption()) != null) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opt.equals("-l")) { 880ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (opt.equals("-r")) { 882ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 883c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } else if (opt.equals("-i")) { 884c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski installerPackageName = nextOptionData(); 885c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski if (installerPackageName == null) { 886c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski System.err.println("Error: no value specified for -i"); 887c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski return; 888c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski } 889ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } else if (opt.equals("-t")) { 890ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_TEST; 891af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } else if (opt.equals("-s")) { 8928946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Override if -s option is specified. 8935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFlags |= PackageManager.INSTALL_EXTERNAL; 89414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (opt.equals("-f")) { 89514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Override if -s option is specified. 89614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFlags |= PackageManager.INSTALL_INTERNAL; 8977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } else if (opt.equals("-d")) { 8987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; 899706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else if (opt.equals("--originating-uri")) { 900706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingUriString = nextOptionData(); 901706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (originatingUriString == null) { 902706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println("Error: must supply argument for --originating-uri"); 903706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings return; 904706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 905706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else if (opt.equals("--referrer")) { 906706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrer = nextOptionData(); 907706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (referrer == null) { 908706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings System.err.println("Error: must supply argument for --referrer"); 909706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings return; 910706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 911116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamath } else if (opt.equals("--abi")) { 912ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey abi = checkAbiArgument(nextOptionData()); 913dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani } else if (opt.equals("--user")) { 914dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani userId = Integer.parseInt(nextOptionData()); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: Unknown option: " + opt); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 921e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey if (userId == UserHandle.USER_ALL) { 922e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey userId = UserHandle.USER_OWNER; 923e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey installFlags |= PackageManager.INSTALL_ALL_USERS; 924e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey } 925e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey 9265ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final Uri verificationURI; 927706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings final Uri originatingURI; 928706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings final Uri referrerURI; 929706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 930706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (originatingUriString != null) { 931706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingURI = Uri.parse(originatingUriString); 932706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else { 933706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings originatingURI = null; 934706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 935706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 936706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings if (referrer != null) { 937706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrerURI = Uri.parse(referrer); 938706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } else { 939706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings referrerURI = null; 940706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings } 9415ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 9425ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate apkURI, must be present 9435ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String apkFilePath = nextArg(); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("\tpkg: " + apkFilePath); 945513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey if (apkFilePath == null) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9505ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root // Populate verificationURI, optionally present 9515ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root final String verificationFilePath = nextArg(); 9525ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root if (verificationFilePath != null) { 9535ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root System.err.println("\tver: " + verificationFilePath); 9545ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = Uri.fromFile(new File(verificationFilePath)); 9555ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } else { 9565ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root verificationURI = null; 9575ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root } 9585ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root 959ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey LocalPackageInstallObserver obs = new LocalPackageInstallObserver(); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 961706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings VerificationParams verificationParams = new VerificationParams(verificationURI, 96237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver originatingURI, referrerURI, VerificationParams.NO_UID, null); 963706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings 964e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags, 965e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey installerPackageName, verificationParams, abi, userId); 96623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (obs) { 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!obs.finished) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obs.wait(); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obs.result == PackageManager.INSTALL_SUCCEEDED) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Failure [" 978f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate + installFailureToString(obs) 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "]"); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 988ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private void runInstallCreate() throws RemoteException { 989e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey int userId = UserHandle.USER_ALL; 990ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey String installerPackageName = null; 991ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 992a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL); 993ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 994ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey String opt; 995ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey while ((opt = nextOption()) != null) { 996ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (opt.equals("-l")) { 997ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_FORWARD_LOCK; 998ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-r")) { 999ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; 1000ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-i")) { 1001ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey installerPackageName = nextArg(); 1002ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (installerPackageName == null) { 1003ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey throw new IllegalArgumentException("Missing installer package"); 1004ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1005ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-t")) { 1006ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_ALLOW_TEST; 1007ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-s")) { 1008ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_EXTERNAL; 1009ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-f")) { 1010ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_INTERNAL; 1011ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-d")) { 1012ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE; 1013e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey } else if (opt.equals("--originating-uri")) { 1014e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey params.originatingUri = Uri.parse(nextOptionData()); 1015e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey } else if (opt.equals("--referrer")) { 1016e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey params.referrerUri = Uri.parse(nextOptionData()); 1017ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-p")) { 1018a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey params.mode = SessionParams.MODE_INHERIT_EXISTING; 1019941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey params.appPackageName = nextOptionData(); 1020941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey if (params.appPackageName == null) { 1021941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey throw new IllegalArgumentException("Missing inherit package name"); 1022941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey } 1023ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (opt.equals("-S")) { 102416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey params.setSize(Long.parseLong(nextOptionData())); 1025ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey } else if (opt.equals("--abi")) { 1026ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey params.abiOverride = checkAbiArgument(nextOptionData()); 1027e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey } else if (opt.equals("--user")) { 1028e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey userId = Integer.parseInt(nextOptionData()); 1029ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else { 1030ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey throw new IllegalArgumentException("Unknown option " + opt); 1031ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1032ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1033ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1034e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey if (userId == UserHandle.USER_ALL) { 1035e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey userId = UserHandle.USER_OWNER; 1036e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey params.installFlags |= PackageManager.INSTALL_ALL_USERS; 1037e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey } 1038e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey 1039e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey final int sessionId = mInstaller.createSession(params, installerPackageName, userId); 1040ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1041ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey // NOTE: adb depends on parsing this string 1042ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.out.println("Success: created install session [" + sessionId + "]"); 1043ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1044ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1045ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private void runInstallWrite() throws IOException, RemoteException { 1046ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey long sizeBytes = -1; 1047ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1048ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey String opt; 1049ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey while ((opt = nextOption()) != null) { 1050ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (opt.equals("-S")) { 1051ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey sizeBytes = Long.parseLong(nextOptionData()); 1052ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else { 1053ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey throw new IllegalArgumentException("Unknown option: " + opt); 1054ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1055ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1056ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1057ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final int sessionId = Integer.parseInt(nextArg()); 1058ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final String splitName = nextArg(); 1059ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1060ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey String path = nextArg(); 1061ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if ("-".equals(path)) { 1062ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey path = null; 1063ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else if (path != null) { 1064ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final File file = new File(path); 1065ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (file.isFile()) { 1066ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey sizeBytes = file.length(); 1067ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1068ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1069ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1070a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final SessionInfo info = mInstaller.getSessionInfo(sessionId); 10711cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey 1072ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey PackageInstaller.Session session = null; 1073ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey InputStream in = null; 1074ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey OutputStream out = null; 1075ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey try { 1076ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); 1077ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1078ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (path != null) { 1079ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey in = new FileInputStream(path); 1080ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } else { 1081ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey in = new SizedInputStream(System.in, sizeBytes); 1082ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1083ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey out = session.openWrite(splitName, 0, sizeBytes); 1084ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 10851cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey int total = 0; 10861cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey byte[] buffer = new byte[65536]; 10871cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey int c; 10881cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey while ((c = in.read(buffer)) != -1) { 10891cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey total += c; 10901cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey out.write(buffer, 0, c); 109116c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey 10921cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey if (info.sizeBytes > 0) { 10931cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey final float fraction = ((float) c / (float) info.sizeBytes); 10941cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey session.addProgress(fraction); 10951cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey } 109616c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey } 10971cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey session.fsync(out); 1098ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 10991cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey System.out.println("Success: streamed " + total + " bytes"); 1100ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } finally { 1101ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IoUtils.closeQuietly(out); 1102ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IoUtils.closeQuietly(in); 1103ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IoUtils.closeQuietly(session); 1104ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1105ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1106ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1107ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private void runInstallCommit() throws RemoteException { 1108ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final int sessionId = Integer.parseInt(nextArg()); 1109ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1110ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey PackageInstaller.Session session = null; 1111ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey try { 1112ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); 1113ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1114a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final LocalIntentReceiver receiver = new LocalIntentReceiver(); 1115a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey session.commit(receiver.getIntentSender()); 1116ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1117a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final Intent result = receiver.getResult(); 1118a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, 1119a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey PackageInstaller.STATUS_FAILURE); 1120a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey if (status == PackageInstaller.STATUS_SUCCESS) { 1121a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey System.out.println("Success"); 1122a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } else { 1123a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey Log.e(TAG, "Failure details: " + result.getExtras()); 1124a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey System.out.println("Failure [" 1125a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]"); 1126a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey return; 1127ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1128ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } finally { 1129ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IoUtils.closeQuietly(session); 1130ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1131ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1132ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 113316c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey private void runInstallAbandon() throws RemoteException { 1134ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final int sessionId = Integer.parseInt(nextArg()); 1135ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1136ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey PackageInstaller.Session session = null; 1137ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey try { 1138ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey session = new PackageInstaller.Session(mInstaller.openSession(sessionId)); 113916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey session.abandon(); 1140ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.out.println("Success"); 1141ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } finally { 1142ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey IoUtils.closeQuietly(session); 1143ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1144ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1145ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1146ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey private void runSetInstaller() throws RemoteException { 1147ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final String targetPackage = nextArg(); 1148ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey final String installerPackageName = nextArg(); 1149ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1150ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey if (targetPackage == null || installerPackageName == null) { 1151ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey throw new IllegalArgumentException( 1152ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey "must provide both target and installer package names"); 1153ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey } 1154ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey 1155ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey mPm.setInstallerPackageName(targetPackage, installerPackageName); 1156ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.out.println("Success"); 1157ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward } 1158ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward 1159483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runCreateUser() { 11600b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String name; 11612a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy int userId = -1; 116231d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy int flags = 0; 116331d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy String opt; 116431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy while ((opt = nextOption()) != null) { 11652a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy if ("--profileOf".equals(opt)) { 116631d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy String optionData = nextOptionData(); 116731d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy if (optionData == null || !isNumber(optionData)) { 116831d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy System.err.println("Error: no USER_ID specified"); 116931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy showUsage(); 117031d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy return; 117131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } else { 11722a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy userId = Integer.parseInt(optionData); 117331d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } 117431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } else if ("--managed".equals(opt)) { 117531d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy flags |= UserInfo.FLAG_MANAGED_PROFILE; 117631d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } else { 117731d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy System.err.println("Error: unknown option " + opt); 117831d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy showUsage(); 117931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy return; 118031d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } 118131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } 11820b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 11830b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 11840b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user name specified."); 11850b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 11860b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 11870b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani name = arg; 11880b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 118931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy UserInfo info = null; 11902a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy if (userId < 0) { 119131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy info = mUm.createUser(name, flags); 119231d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } else { 11932a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy info = mUm.createProfileForUser(name, flags, userId); 119431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy } 1195e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey if (info != null) { 1196e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey System.out.println("Success: created user id " + info.id); 1197e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey } else { 1198483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: couldn't create User."); 11990b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12000b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 12010b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 12020b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 12030b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12040b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 12050b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12060b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1207483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runRemoveUser() { 12080b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani int userId; 12090b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani String arg = nextArg(); 12100b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani if (arg == null) { 12110b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println("Error: no user id specified."); 12120b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 12130b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12140b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 12150b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani userId = Integer.parseInt(arg); 12160b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (NumberFormatException e) { 1217786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("Error: user id '" + arg + "' is not a number."); 12180b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani return; 12190b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12200b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani try { 12214c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey if (mUm.removeUser(userId)) { 12224c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.out.println("Success: removed user"); 12234c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } else { 12244c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.err.println("Error: couldn't remove user id " + userId); 12250b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12260b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } catch (RemoteException e) { 12270b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(e.toString()); 12280b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 12290b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12300b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani } 12310b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani 1232483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani public void runListUsers() { 1233742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani try { 12346143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy IActivityManager am = ActivityManagerNative.getDefault(); 12356143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy 1236920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani List<UserInfo> users = mUm.getUsers(false); 1237742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (users == null) { 1238742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println("Error: couldn't get users"); 1239742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 1240742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.out.println("Users:"); 1241742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (int i = 0; i < users.size(); i++) { 12426143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy String running = am.isUserRunning(users.get(i).id, false) ? " running" : ""; 12436143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy System.out.println("\t" + users.get(i).toString() + running); 1244742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1245742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1246742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } catch (RemoteException e) { 1247742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(e.toString()); 1248742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 1249742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 1250742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 12514c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 12524c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey public void runGetMaxUsers() { 12534c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers()); 12544c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey } 12554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey 125620e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey public void runForceDexOpt() { 125720e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey final String packageName = nextArg(); 125820e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey try { 125920e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey mPm.forceDexOpt(packageName); 126020e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey } catch (RemoteException e) { 126120e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey throw e.rethrowAsRuntimeException(); 126220e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey } 126320e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey } 126420e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey 1265a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey private void runUninstall() throws RemoteException { 1266a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey int flags = 0; 12671bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy int userId = UserHandle.USER_ALL; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12695e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn String opt; 12705e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn while ((opt=nextOption()) != null) { 12715e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (opt.equals("-k")) { 1272a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey flags |= PackageManager.DELETE_KEEP_DATA; 12731bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } else if (opt.equals("--user")) { 12741bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy String param = nextArg(); 12751bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy if (isNumber(param)) { 12761bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy userId = Integer.parseInt(param); 12771bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } else { 12781bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy showUsage(); 12791bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println("Error: Invalid user: " + param); 12801bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy return; 12811bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } 12825e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else { 12835e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Unknown option: " + opt); 12845e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 12855e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package specified"); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12941bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy 12951bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy if (userId == UserHandle.USER_ALL) { 12961bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy userId = UserHandle.USER_OWNER; 1297a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey flags |= PackageManager.DELETE_ALL_USERS; 12981bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } else { 12991bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy PackageInfo info; 13001bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy try { 13011bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy info = mPm.getPackageInfo(pkg, 0, userId); 13021bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } catch (RemoteException e) { 13031bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println(e.toString()); 13041bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println(PM_NOT_RUNNING_ERR); 13051bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy return; 13061bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } 13071bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy if (info == null) { 13081bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println("Failure - not installed for " + userId); 13091bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy return; 13101bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } 13111bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy final boolean isSystem = 13121bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 13131bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy // If we are being asked to delete a system app for just one 13141bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy // user set flag so it disables rather than reverting to system 13151bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy // version of the app. 13161bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy if (isSystem) { 1317a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey flags |= PackageManager.DELETE_SYSTEM_APP; 13181bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } 13191bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy } 13201bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy 1321a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final LocalIntentReceiver receiver = new LocalIntentReceiver(); 1322a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey mInstaller.uninstall(pkg, flags, receiver.getIntentSender(), userId); 1323a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey 1324a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final Intent result = receiver.getResult(); 1325a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, 1326a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey PackageInstaller.STATUS_FAILURE); 1327a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey if (status == PackageInstaller.STATUS_SUCCESS) { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Success"); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1330a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey Log.e(TAG, "Failure details: " + result.getExtras()); 1331a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey System.out.println("Failure [" 1332a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]"); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1336197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn static class ClearDataObserver extends IPackageDataObserver.Stub { 1337690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean finished; 1338690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn boolean result; 1339690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1340690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn @Override 1341690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 1342690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (this) { 1343690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn finished = true; 1344690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn result = succeeded; 1345690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn notifyAll(); 1346690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1347690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1348690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1349690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1350690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn private void runClear() { 1351a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey int userId = 0; 1352a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey String option = nextOption(); 1353a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey if (option != null && option.equals("--user")) { 1354a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey String optionData = nextOptionData(); 1355a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey if (optionData == null || !isNumber(optionData)) { 1356a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey System.err.println("Error: no USER_ID specified"); 1357a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey showUsage(); 1358a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey return; 1359a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } else { 1360a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey userId = Integer.parseInt(optionData); 1361a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } 1362a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey } 1363a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey 1364690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn String pkg = nextArg(); 1365690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (pkg == null) { 1366690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Error: no package specified"); 1367690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn showUsage(); 1368690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn return; 1369690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1370690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1371690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 1372690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1373a83cab0001ca4d90abe622c22a7af1b0da54f739Christopher Tate ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, userId); 1374690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn synchronized (obs) { 1375690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn while (!obs.finished) { 1376690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn try { 1377690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn obs.wait(); 1378690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (InterruptedException e) { 1379690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1380690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1381690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1382690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 1383690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn if (obs.result) { 1384690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Success"); 1385690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } else { 1386690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println("Failed"); 1387690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1388690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } catch (RemoteException e) { 1389690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(e.toString()); 1390690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1391690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1392690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn } 1393690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String enabledSettingToString(int state) { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "default"; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "enabled"; 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "disabled"; 14020ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER: 14030ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn return "disabled-user"; 1404fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED: 1405fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn return "disabled-until-used"; 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "unknown"; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 140923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1410a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey private static boolean isNumber(String s) { 1411483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 1412483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Integer.parseInt(s); 1413483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (NumberFormatException nfe) { 1414483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return false; 1415483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1416483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return true; 1417483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1418483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void runSetEnabledSetting(int state) { 1420483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId = 0; 1421483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String option = nextOption(); 1422483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (option != null && option.equals("--user")) { 1423483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String optionData = nextOptionData(); 1424483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (optionData == null || !isNumber(optionData)) { 1425483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani System.err.println("Error: no USER_ID specified"); 1426483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani showUsage(); 1427483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 1428483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 1429483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userId = Integer.parseInt(optionData); 1430483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1431483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1432483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = nextArg(); 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Error: no package or component specified"); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(pkg); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn == null) { 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14423fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn mPm.setApplicationEnabledSetting(pkg, state, 0, userId, 14433fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn "shell:" + android.os.Process.myUid()); 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Package " + pkg + " new state: " 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1446483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getApplicationEnabledSetting(pkg, userId))); 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1453483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.setComponentEnabledSetting(cn, state, 0, userId); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println("Component " + cn.toShortString() + " new state: " 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + enabledSettingToString( 1456483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPm.getComponentEnabledSetting(cn, userId))); 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1464e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani private void runSetHiddenSetting(boolean state) { 1465655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani int userId = 0; 1466655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String option = nextOption(); 1467655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (option != null && option.equals("--user")) { 1468655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String optionData = nextOptionData(); 1469655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (optionData == null || !isNumber(optionData)) { 1470655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println("Error: no USER_ID specified"); 1471655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani showUsage(); 1472655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 1473655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } else { 1474655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani userId = Integer.parseInt(optionData); 1475655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1476655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1477655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 1478655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani String pkg = nextArg(); 1479655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani if (pkg == null) { 1480655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println("Error: no package or component specified"); 1481655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani showUsage(); 1482655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani return; 1483655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1484655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani try { 1485e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani mPm.setApplicationHiddenSettingAsUser(pkg, state, userId); 1486e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani System.err.println("Package " + pkg + " new hidden state: " 1487e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani + mPm.getApplicationHiddenSettingAsUser(pkg, userId)); 1488655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } catch (RemoteException e) { 1489655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(e.toString()); 1490655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani System.err.println(PM_NOT_RUNNING_ERR); 1491655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1492655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani } 1493655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani 1494e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn private void runGrantRevokePermission(boolean grant) { 1495e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String pkg = nextArg(); 1496e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (pkg == null) { 1497e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no package specified"); 1498e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1499e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1500e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1501e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn String perm = nextArg(); 1502e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (perm == null) { 1503e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Error: no permission specified"); 1504e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1505e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn return; 1506e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1507e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn try { 1508e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn if (grant) { 1509e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.grantPermission(pkg, perm); 1510e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } else { 1511e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn mPm.revokePermission(pkg, perm); 1512e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1513e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (RemoteException e) { 1514e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(e.toString()); 1515e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1516e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (IllegalArgumentException e) { 1517e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Bad argument: " + e.toString()); 1518e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn showUsage(); 1519e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } catch (SecurityException e) { 1520e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("Operation not allowed: " + e.toString()); 1521e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1522e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn } 1523e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn 1524719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey private void runSetPermissionEnforced() { 1525719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String permission = nextArg(); 1526719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (permission == null) { 1527719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no permission specified"); 1528719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1529719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1530719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1531719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final String enforcedRaw = nextArg(); 1532719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey if (enforcedRaw == null) { 1533719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Error: no enforcement specified"); 1534719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1535719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey return; 1536719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1537719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey final boolean enforced = Boolean.parseBoolean(enforcedRaw); 1538719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey try { 1539719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey mPm.setPermissionEnforced(permission, enforced); 1540719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (RemoteException e) { 1541719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(e.toString()); 1542719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(PM_NOT_RUNNING_ERR); 1543719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (IllegalArgumentException e) { 1544719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Bad argument: " + e.toString()); 1545719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey showUsage(); 1546719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } catch (SecurityException e) { 1547719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println("Operation not allowed: " + e.toString()); 1548719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1549719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey } 1550719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey 1551197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn static class ClearCacheObserver extends IPackageDataObserver.Stub { 1552197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn boolean finished; 1553197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn boolean result; 1554197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1555197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn @Override 1556197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { 1557197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn synchronized (this) { 1558197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn finished = true; 1559197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn result = succeeded; 1560197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn notifyAll(); 1561197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1562197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1563197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1564197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1565197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 1566197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn private void runTrimCaches() { 1567197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn String size = nextArg(); 1568197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (size == null) { 1569197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Error: no size specified"); 1570197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1571197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1572197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1573197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn int len = size.length(); 1574197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn long multiplier = 1; 1575197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (len > 1) { 1576197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn char c = size.charAt(len-1); 1577197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn if (c == 'K' || c == 'k') { 1578197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L; 1579197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else if (c == 'M' || c == 'm') { 1580197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L*1024L; 1581197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else if (c == 'G' || c == 'g') { 1582197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn multiplier = 1024L*1024L*1024L; 1583197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } else { 1584197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Invalid suffix: " + c); 1585197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1586197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1587197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1588197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn size = size.substring(0, len-1); 1589197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1590197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn long sizeVal; 1591197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1592197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn sizeVal = Long.parseLong(size) * multiplier; 1593197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (NumberFormatException e) { 1594197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Error: expected number at: " + size); 1595197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1596197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn return; 1597197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1598197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn ClearDataObserver obs = new ClearDataObserver(); 1599197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1600197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn mPm.freeStorageAndNotify(sizeVal, obs); 1601197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn synchronized (obs) { 1602197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn while (!obs.finished) { 1603197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn try { 1604197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn obs.wait(); 1605197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (InterruptedException e) { 1606197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1607197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1608197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1609197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (RemoteException e) { 1610197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(e.toString()); 1611197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(PM_NOT_RUNNING_ERR); 1612197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (IllegalArgumentException e) { 1613197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Bad argument: " + e.toString()); 1614197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn showUsage(); 1615197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } catch (SecurityException e) { 1616197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("Operation not allowed: " + e.toString()); 1617197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1618197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn } 1619197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Displays the package file for a package. 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pckg 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void displayPackageFilePath(String pckg) { 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1626483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageInfo info = mPm.getPackageInfo(pckg, 0, 0); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info != null && info.applicationInfo != null) { 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print("package:"); 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(info.applicationInfo.sourceDir); 16308a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey if (!ArrayUtils.isEmpty(info.applicationInfo.splitSourceDirs)) { 16318a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey for (String splitSourceDir : info.applicationInfo.splitSourceDirs) { 16328a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey System.out.print("package:"); 16338a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey System.out.println(splitSourceDir); 16348a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 16358a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey } 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 164223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Resources getResources(PackageItemInfo pii) { 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = mResourceCache.get(pii.packageName); 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != null) return res; 164623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1648483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0, 0); 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager am = new AssetManager(); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am.addAssetPath(ai.publicSourceDir); 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = new Resources(am, null, null); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResourceCache.put(pii.packageName, res); 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(e.toString()); 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(PM_NOT_RUNNING_ERR); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 166023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet 1661ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey private static String checkAbiArgument(String abi) { 1662ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey if (TextUtils.isEmpty(abi)) { 1663ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey throw new IllegalArgumentException("Missing ABI argument"); 1664ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey } 1665ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey 16664903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath if ("-".equals(abi)) { 16674903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath return abi; 16684903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath } 16694903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath 1670ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey final String[] supportedAbis = Build.SUPPORTED_ABIS; 1671ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey for (String supportedAbi : supportedAbis) { 1672ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey if (supportedAbi.equals(abi)) { 1673ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey return abi; 1674ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey } 1675ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey } 1676ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey 1677ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey throw new IllegalArgumentException("ABI " + abi + " not supported on this device"); 1678ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey } 1679ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey 1680a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey private static class LocalIntentReceiver { 1681a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>(); 1682a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey 1683a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() { 1684a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey @Override 1685a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey public int send(int code, Intent intent, String resolvedType, 1686a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey IIntentReceiver finishedReceiver, String requiredPermission) { 1687a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey try { 1688a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey mResult.offer(intent, 5, TimeUnit.SECONDS); 1689a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } catch (InterruptedException e) { 1690a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey throw new RuntimeException(e); 1691a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } 1692a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey return 0; 1693a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } 1694a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey }; 1695a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey 1696a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey public IntentSender getIntentSender() { 1697a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey return new IntentSender((IIntentSender) mLocalSender); 1698a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } 1699a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey 1700a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey public Intent getResult() { 17015ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey try { 17025ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey return mResult.take(); 17035ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey } catch (InterruptedException e) { 17045ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey throw new RuntimeException(e); 17055ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey } 1706a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } 1707a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey } 1708a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOptionData() { 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurArgData; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String data = mArgs[mNextArg]; 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextArg() { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void showUsage() { 1756151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]"); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permission-groups"); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 175923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); 1760039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(" pm list features"); 1761e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn System.err.println(" pm list libraries"); 17627e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm list users"); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(" pm path PACKAGE"); 1764cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println(" pm dump PACKAGE"); 1765ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" pm install [-lrtsfd] [-i PACKAGE] [PATH]"); 1766ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" pm install-create [-lrtsfdp] [-i PACKAGE] [-S BYTES]"); 1767ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" pm install-write [-S BYTES] SESSION_ID SPLIT_NAME [PATH]"); 1768ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" pm install-commit SESSION_ID"); 176916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey System.err.println(" pm install-abandon SESSION_ID"); 17701bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println(" pm uninstall [-k] [--user USER_ID] PACKAGE"); 1771ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" pm set-installer PACKAGE INSTALLER"); 1772a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey System.err.println(" pm clear [--user USER_ID] PACKAGE"); 17737e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT"); 17747e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT"); 17757e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT"); 1776fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn System.err.println(" pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT"); 1777e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani System.err.println(" pm hide [--user USER_ID] PACKAGE_OR_COMPONENT"); 1778e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani System.err.println(" pm unhide [--user USER_ID] PACKAGE_OR_COMPONENT"); 1779e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm grant PACKAGE PERMISSION"); 1780e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" pm revoke PACKAGE PERMISSION"); 178146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]"); 178246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" pm get-install-location"); 1783719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey System.err.println(" pm set-permission-enforced PERMISSION [true|false]"); 1784197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(" pm trim-caches DESIRED_FREE_SPACE"); 17851bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy System.err.println(" pm create-user [--profileOf USER_ID] [--managed] USER_NAME"); 17867e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn System.err.println(" pm remove-user USER_ID"); 17874c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey System.err.println(" pm get-max-users"); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 178946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list packages: prints all packages, optionally only"); 179046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those whose package name contains the text in FILTER. Options:"); 179146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: see their associated file."); 179246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: filter to only show disbled packages."); 179346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -e: filter to only show enabled packages."); 179446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: filter to only show system packages."); 179546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -3: filter to only show third party packages."); 179692a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma System.err.println(" -i: see the installer for the packages."); 179746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: also include uninstalled packages."); 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 179946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permission-groups: prints all known permission groups."); 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 180146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list permissions: prints all known permissions, optionally only"); 180246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" those in GROUP. Options:"); 180346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -g: organize by group."); 180446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: print all information."); 180546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -s: short summary."); 180646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -d: only list dangerous permissions."); 180746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -u: list only the permissions users will see."); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 180946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list instrumentation: use to list all test packages; optionally"); 181046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" supply <TARGET-PACKAGE> to list the test packages for a particular"); 181146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" application. Options:"); 181246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -f: list the .apk file for the test package."); 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 181446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm list features: prints all features of the system."); 1815039c68e75606e837cf021815a0210836724574adDianne Hackborn System.err.println(""); 1816786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm list users: prints all users on the system."); 1817786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 181846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm path: print the path to the .apk of the given PACKAGE."); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 1820ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm dump: print system state associated with the given PACKAGE."); 1821ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(""); 1822ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm install: install a single legacy package"); 1823ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm install-create: create an install session"); 1824ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -l: forward lock application"); 1825ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -r: replace existing application"); 1826ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -t: allow test packages"); 1827ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -i: specify the installer package name"); 1828ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -s: install application on sdcard"); 1829ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -f: install application on internal flash"); 1830ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -d: allow version code downgrade"); 1831ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -p: partial application install"); 1832ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -S: size in bytes of entire session"); 1833ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(""); 1834ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm install-write: write a package into existing session; path may"); 1835ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" be '-' to read from stdin"); 1836ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(" -S: size in bytes of package, required for stdin"); 1837cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn System.err.println(""); 1838ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm install-commit: perform install of fully staged session"); 183916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey System.err.println("pm install-abandon: abandon session"); 1840ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(""); 1841ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println("pm set-installer: set installer package name"); 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 184346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm uninstall: removes a package from the system. Options:"); 184446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" -k: keep the data and cache directories around after package removal."); 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.err.println(""); 184646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm clear: deletes all data associated with a package."); 1847690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn System.err.println(""); 184850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println("pm enable, disable, disable-user, disable-until-used: these commands"); 184950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println(" change the enabled state of a given package or component (written"); 185050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn System.err.println(" as \"package/class\")."); 185140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 1852e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println("pm grant, revoke: these commands either grant or revoke permissions"); 1853e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" to applications. Only optional permissions the application has"); 1854e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(" declared can be granted or revoked."); 1855e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn System.err.println(""); 185646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm get-install-location: returns the current install location."); 185746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 185846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 185946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 186040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu System.err.println(""); 186146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println("pm set-install-location: changes the default install location."); 186246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" NOTE: this is only intended for debugging; using this can cause"); 186346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" applications to break and other undersireable behavior."); 186446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 0 [auto]: Let system decide the best location"); 186546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 1 [internal]: Install on internal device storage"); 186646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn System.err.println(" 2 [external]: Install on external media"); 1867197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println(""); 1868197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn System.err.println("pm trim-caches: trim cache files to reach the given free space."); 1869786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 1870786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm create-user: create a new user with the given USER_NAME,"); 1871786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(" printing the new user identifier of the user."); 1872786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(""); 1873786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println("pm remove-user: remove the user with the given USER_IDENTIFIER,"); 1874786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn System.err.println(" deleting all data associated with that user"); 1875ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey System.err.println(""); 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1878