19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 5305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Licensed under the Apache License, Version 2.0 (the "License"); 6305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** you may not use this file except in compliance with the License. 7305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 9305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 11305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Unless required by applicable law or agreed to in writing, software 12305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** distributed under the License is distributed on an "AS IS" BASIS, 13305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.am; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackbornimport android.app.ActivityManager; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 23287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport android.app.IActivityController; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.content.Context; 299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 310bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport android.content.pm.IPackageManager; 320bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport android.content.pm.ResolveInfo; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 359c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 3846d110329e659cc9cb9514e220ce273701eb151dDianne Hackbornimport android.os.SystemProperties; 395e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackbornimport android.os.UserHandle; 409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException; 4159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.BufferedReader; 459c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 469c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 47287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.IOException; 48287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.InputStreamReader; 498f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream; 509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 510bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.HashSet; 520bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.List; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn private int mStartFlags = 0; 628f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 630bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn private boolean mStopOption = false; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn private int mRepeat = 0; 661676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn private int mUserId; 672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 6862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private String mProfileFile; 6962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 870bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn e.printStackTrace(System.err); 889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 1009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 1019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 1079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 1106fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 1116fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 112351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } else if (op.equals("force-stop")) { 113351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang runForceStop(); 114e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill")) { 115e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKill(); 116e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill-all")) { 117e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKillAll(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 122f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 123f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 124824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 125824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 126d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("set-debug-app")) { 127d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runSetDebugApp(); 128d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("clear-debug-app")) { 129d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runClearDebugApp(); 130d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn } else if (op.equals("bug-report")) { 131d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn runBugReport(); 132287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (op.equals("monitor")) { 133287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn runMonitor(); 134e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if (op.equals("screen-compat")) { 135e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn runScreenCompat(); 1367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (op.equals("display-size")) { 1377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn runDisplaySize(); 138dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else if (op.equals("display-density")) { 139dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn runDisplayDensity(); 140f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-uri")) { 141f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(false); 142f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-intent-uri")) { 143f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(true); 144483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (op.equals("switch-user")) { 145742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani runSwitchUser(); 14680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } else if (op.equals("stop-user")) { 14780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn runStopUser(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1535e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn int parseUserArg(String arg) { 1545e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn int userId; 1555e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if ("all".equals(arg)) { 1565e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = UserHandle.USER_ALL; 1575e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else if ("current".equals(arg) || "cur".equals(arg)) { 1585e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = UserHandle.USER_CURRENT; 1595e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else { 1605e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = Integer.parseInt(arg); 1615e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 1625e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return userId; 1635e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 1645e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 1651676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn private Intent makeIntent(int defUser) throws URISyntaxException { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 167f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn Intent baseIntent = intent; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 170a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags = 0; 1718f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 1720bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = false; 1732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = 0; 1740bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mProfileFile = null; 1751676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mUserId = defUser; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 183f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 184f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 185f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 188f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 189f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 190f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1929f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 193f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 194f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 195f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 198f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 199f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 200f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 2019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 2029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 2039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 2049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 205305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 206305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 207305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 2089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 2099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 2109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 2119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 2128ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu } else if (opt.equals("--eu")) { 2138ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String key = nextArgRequired(); 2148ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String value = nextArgRequired(); 2158ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu intent.putExtra(key, Uri.parse(value)); 2167df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn } else if (opt.equals("--ecn")) { 2177df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String key = nextArgRequired(); 2187df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String value = nextArgRequired(); 2197df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn ComponentName cn = ComponentName.unflattenFromString(value); 2207df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn if (cn == null) throw new IllegalArgumentException("Bad component name: " + value); 2217df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn intent.putExtra(key, cn); 2222d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--eia")) { 2232d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 2242d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 2252d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 2262d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra int[] list = new int[strings.length]; 2272d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 2282d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Integer.valueOf(strings[i]); 2292d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 2302d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 2316a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 2326a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 2336a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 2346a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 2352d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--ela")) { 2362d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 2372d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 2382d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 2392d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra long[] list = new long[strings.length]; 2402d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 2412d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Long.valueOf(strings[i]); 2422d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 2432d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 2443a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2453a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--ef")) { 2463a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 2473a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 2483a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, Float.valueOf(value)); 2493a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2503a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--efa")) { 2513a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 2523a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 2533a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String[] strings = value.split(","); 2543a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen float[] list = new float[strings.length]; 2553a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen for (int i = 0; i < strings.length; i++) { 2563a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen list[i] = Float.valueOf(strings[i]); 2573a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } 2583a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, list); 2593a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 2619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 2629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 2639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 2649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 2659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 2679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 2689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 269f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 270f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 271f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 2729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 2739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 2755ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 2765ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2775ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 2785ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 27946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--exclude-stopped-packages")) { 28046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); 28146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--include-stopped-packages")) { 28246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 2835ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 2845ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 2855ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 2865ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 2875ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 2885ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 2895ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 2905ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 2915ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 2925ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 2935ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 2945ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 2955ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 2965ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 2975ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 2985ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 2995ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 3005ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 3015ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 3025ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 3035ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 3045ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 3055ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 3065ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 3075ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 3085ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 3095ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 3105ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 31146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-clear-task")) { 31246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 31346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-task-on-home")) { 31446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); 3155ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 3165ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 3175ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 3185ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 319f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (opt.equals("--selector")) { 320f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.setDataAndType(data, type); 321f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = new Intent(); 3229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 323a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_DEBUG; 3248f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 3258f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 32662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("-P")) { 32762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 328a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 32962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("--start-profiler")) { 33062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 331a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags &= ~ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 3322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (opt.equals("-R")) { 3332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = Integer.parseInt(nextArgRequired()); 3340bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (opt.equals("-S")) { 3350bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = true; 33692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy } else if (opt.equals("--opengl-trace")) { 337a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_OPENGL_TRACES; 338483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (opt.equals("--user")) { 3395e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn mUserId = parseUserArg(nextArgRequired()); 3409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 3419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 3429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 347f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn final boolean hasSelector = intent != baseIntent; 348f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 349f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // A selector was specified; fix up. 350f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setSelector(intent); 351f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = baseIntent; 352f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 353f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 3540bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String arg = nextArg(); 355f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = null; 356f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (arg == null) { 357f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 358f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // If a selector has been specified, and no arguments 359f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // have been supplied for the main Intent, then we can 360f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // assume it is ACTION_MAIN CATEGORY_LAUNCHER; we don't 361f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // need to have a component name specified yet, the 362f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // selector will take care of that. 3630bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 3640bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 3659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 366f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf(':') >= 0) { 367f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a URI. Fully parse it, and use that result 368f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // to fill in any data not specified so far. 369f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME); 370f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf('/') >= 0) { 371f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a component name. Build an Intent to launch 372f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // it. 373f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 374f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 375f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setComponent(ComponentName.unflattenFromString(arg)); 376f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else { 377f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // Assume the argument is a package name. 378f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 379f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 380f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setPackage(arg); 381f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 382f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (baseIntent != null) { 3830bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle extras = intent.getExtras(); 3840bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras((Bundle)null); 3850bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle uriExtras = baseIntent.getExtras(); 3860bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.replaceExtras((Bundle)null); 3870bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (intent.getAction() != null && baseIntent.getCategories() != null) { 3880bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn HashSet<String> cats = new HashSet<String>(baseIntent.getCategories()); 3890bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn for (String c : cats) { 3900bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.removeCategory(c); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 393f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.fillIn(baseIntent, Intent.FILL_IN_COMPONENT | Intent.FILL_IN_SELECTOR); 3940bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (extras == null) { 3950bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3960bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (uriExtras != null) { 3970bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn uriExtras.putAll(extras); 3980bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3990bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 4000bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras(extras); 4019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4086fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 4091676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 4105e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (mUserId == UserHandle.USER_ALL) { 4115e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start activity with user 'all'"); 4125e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 4135e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 4146fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 4155e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn ComponentName cn = mAm.startService(null, intent, intent.getType(), mUserId); 4166fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 4176fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 418c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!")) { 419c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn System.err.println("Error: Requires permission " + cn.getClassName()); 420c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!!")) { 421c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn System.err.println("Error: " + cn.getClassName()); 4226fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 4236fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 4246fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 4259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 4261676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 4270bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 4285e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (mUserId == UserHandle.USER_ALL) { 4295e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start service with user 'all'"); 4305e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 4315e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 4325e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 4330bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String mimeType = intent.getType(); 4340bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (mimeType == null && intent.getData() != null 4350bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn && "content".equals(intent.getData().getScheme())) { 4365e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn mimeType = mAm.getProviderMimeType(intent.getData(), mUserId); 4370bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 4380bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 4392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn do { 4402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mStopOption) { 4412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn String packageName; 4422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (intent.getComponent() != null) { 4432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = intent.getComponent().getPackageName(); 4442c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 4452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IPackageManager pm = IPackageManager.Stub.asInterface( 4462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ServiceManager.getService("package")); 4472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (pm == null) { 4482c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Package manager not running; aborting"); 4492c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4502c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 451483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<ResolveInfo> activities = pm.queryIntentActivities(intent, mimeType, 0, 452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId); 4532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (activities == null || activities.size() <= 0) { 4542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent does not match any activities: " 4552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 4562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (activities.size() > 1) { 4582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent matches multiple activities; can't stop: " 4592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 4602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = activities.get(0).activityInfo.packageName; 4630bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 4642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Stopping: " + packageName); 4651676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.forceStopPackage(packageName, mUserId); 4662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn Thread.sleep(250); 4672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Starting: " + intent); 4702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor fd = null; 4732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mProfileFile != null) { 4752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn try { 4762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn fd = ParcelFileDescriptor.open( 4772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn new File(mProfileFile), 4782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_CREATE | 4792c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_TRUNCATE | 4802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_READ_WRITE); 4812c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } catch (FileNotFoundException e) { 4822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Unable to open file: " + mProfileFile); 4830bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn return; 4840bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 48562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 48692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy 4872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IActivityManager.WaitResult result = null; 4882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn int res; 4892c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption) { 4902c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = mAm.startActivityAndWait(null, intent, mimeType, 4915e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); 4922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = result.result; 4932c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 4945e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn res = mAm.startActivityAsUser(null, intent, mimeType, 4955e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); 4968f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4972c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 4982c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn boolean launched = false; 4992c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn switch (res) { 500a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SUCCESS: 5012c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 5022c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 503a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SWITCHES_CANCELED: 5042c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 5052c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5062c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because the " 5072c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " current activity is being kept for the user."); 5082c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 509a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_DELIVERED_TO_TOP: 5102c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 5112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, intent has " 5132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "been delivered to currently running " 5142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "top-most instance."); 5152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 516a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_RETURN_INTENT_TO_CALLER: 5172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 5182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because intent " 5202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "should be handled by the caller"); 5212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 522a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_TASK_TO_FRONT: 5232c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 5242c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5252c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, its current " 5262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "task has been brought to the front"); 5272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 528a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_INTENT_NOT_RESOLVED: 5292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unable to " 5312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "resolve " + intent.toString()); 5322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 533a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_CLASS_NOT_FOUND: 5342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println(NO_CLASS_ERROR_CODE); 5352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println("Error: Activity class " + 5362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.getComponent().toShortString() 5372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " does not exist."); 5382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 539a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 5402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you requested to " 5422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "both forward and receive its result"); 5432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 544a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_PERMISSION_DENIED: 5452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you do not " 5472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "have permission to access it."); 5482c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 5492c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn default: 5502c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unknown error code " + res); 5522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 5538f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption && launched) { 5552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result == null) { 5562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = new IActivityManager.WaitResult(); 5572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result.who = intent.getComponent(); 5582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 5602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.who != null) { 5612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 5622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.thisTime >= 0) { 5642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("ThisTime: " + result.thisTime); 5652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.totalTime >= 0) { 5672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("TotalTime: " + result.totalTime); 5682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Complete"); 5708f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat--; 5722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mRepeat > 1) { 5732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.unhandledBack(); 5748f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } while (mRepeat > 1); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 578351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang private void runForceStop() throws Exception { 5791676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_ALL; 5801676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 5811676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 5821676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 5831676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 5841676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 5851676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 5861676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 5871676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 5881676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 5891676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 5901676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.forceStopPackage(nextArgRequired(), userId); 591351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 592351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang 593e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKill() throws Exception { 5941676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_ALL; 5951676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 5961676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 5971676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 5981676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 5991676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 6001676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 6011676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 6021676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 6031676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 6041676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 6051676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.killBackgroundProcesses(nextArgRequired(), userId); 606e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 607e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 608e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKillAll() throws Exception { 609e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killAllBackgroundProcesses(); 610e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 611e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 6129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 6131676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_ALL); 6149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 6159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 616742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false, 617483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId); 6189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 6261676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 6329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 6339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 6349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 6359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 6369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 6379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 6389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 6399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 6409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 6419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 6429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 64346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--no_window_animation") 64446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn || opt.equals("--no-window-animation")) { 6459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 6465e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else if (opt.equals("--user")) { 6475e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = parseUserArg(nextArgRequired()); 6489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 6499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 6509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6545e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (userId == UserHandle.USER_ALL) { 6555e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start instrumentation with user 'all'"); 6565e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 6575e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 6585e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 6599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 6619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 6709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 6719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 6729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6755e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, userId)) { 6769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 6869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 6879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 69046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn static void removeWallOption() { 69146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 69246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props != null && props.contains("-Xprofile:wallclock")) { 69346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.replace("-Xprofile:wallclock", ""); 69446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.trim(); 69546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn SystemProperties.set("dalvik.vm.extra-opts", props); 69646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 69746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 69846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 6999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 7009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 7019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 70246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn boolean wall = false; 7031676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 7047eabe55db6b113f83c2cefcd06812648927de877Romain Guy int profileType = 0; 7051676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 70646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String process = null; 7071676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 7089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 7097eabe55db6b113f83c2cefcd06812648927de877Romain Guy 7109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 7119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 7121676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 7131676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 7141676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 7151676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 7161676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else if (opt.equals("--wall")) { 7171676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn wall = true; 7181676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 7191676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 7201676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 7211676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7221676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 72346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = nextArgRequired(); 72446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if ("stop".equals(cmd)) { 7251676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 7261676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 7271676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 7281676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 7291676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 7301676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 7311676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 7321676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7331676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 73462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn process = nextArg(); 73546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else { 73646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // Compatibility with old syntax: process is specified first. 73746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = cmd; 73846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn cmd = nextArgRequired(); 73946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("start".equals(cmd)) { 74046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn start = true; 74146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (!"stop".equals(cmd)) { 74246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new IllegalArgumentException("Profile command " + process + " not valid"); 74346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 74446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 7451676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 7461676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (userId == UserHandle.USER_ALL) { 7471676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Can't profile with user 'all'"); 7481676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 7491676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7501676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 75146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn ParcelFileDescriptor fd = null; 75246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 75346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (start) { 7549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 7559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 7569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 7579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 7589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 7599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 7609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 7619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 7629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 7639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 7649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 76746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn try { 76846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (wall) { 76946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // XXX doesn't work -- this needs to be set before booting. 77046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 77146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props == null || !props.contains("-Xprofile:wallclock")) { 77246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props + " -Xprofile:wallclock"; 77346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //SystemProperties.set("dalvik.vm.extra-opts", props); 77446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 77546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (start) { 77646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 77746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 7781676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (!mAm.profileControl(process, userId, start, profileFile, fd, profileType)) { 77946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = false; 78046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new AndroidException("PROFILE FAILED on process " + process); 78146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 78246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } finally { 78346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (!wall) { 78446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 78546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 7869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 789824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 7901676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn boolean managed = true; 7911676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 7921676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 7931676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 7941676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 7951676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 7961676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 7971676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (userId == UserHandle.USER_ALL) { 7981676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Can't dump heap with user 'all'"); 7991676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 8001676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 8011676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else if (opt.equals("-n")) { 8021676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn managed = false; 8031676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 8041676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 8051676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 8061676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 8071676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 808824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 809824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 810824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 811824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 812824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 813b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn File file = new File(heapFile); 814b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn file.delete(); 815b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn fd = ParcelFileDescriptor.open(file, 816824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 817824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 818824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 819824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 820824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 821824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 822824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 823824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 8241676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (!mAm.dumpHeap(process, userId, managed, heapFile, fd)) { 825824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 826824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 827824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 828824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 829d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runSetDebugApp() throws Exception { 830d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean wait = false; 831d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean persistent = false; 832d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 833d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String opt; 834d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn while ((opt=nextOption()) != null) { 835d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn if (opt.equals("-w")) { 836d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn wait = true; 837d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (opt.equals("--persistent")) { 838d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn persistent = true; 839d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else { 840d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 841d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn return; 842d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 843d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 844d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 845d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String pkg = nextArgRequired(); 846d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(pkg, wait, persistent); 847d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 848d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 849d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runClearDebugApp() throws Exception { 850d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(null, false, true); 851d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 852d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 853d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn private void runBugReport() throws Exception { 854d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mAm.requestBugReport(); 855d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn System.out.println("Your lovely bug report is being created; please be patient."); 856d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn } 857d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn 858742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private void runSwitchUser() throws Exception { 859742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani String user = nextArgRequired(); 860742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mAm.switchUser(Integer.parseInt(user)); 861742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 862742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 86380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn private void runStopUser() throws Exception { 86480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String user = nextArgRequired(); 86580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn int res = mAm.stopUser(Integer.parseInt(user), null); 86680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn if (res != ActivityManager.USER_OP_SUCCESS) { 86780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String txt = ""; 86880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn switch (res) { 86980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_IS_CURRENT: 87080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Can't stop current user)"; 87180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 87280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_UNKNOWN_USER: 87380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Unknown user " + user + ")"; 87480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 87580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 87680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn System.err.println("Switch failed: " + res + txt); 87780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 87880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 87980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn 880287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn class MyActivityController extends IActivityController.Stub { 881f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final String mGdbPort; 882f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 883287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_NORMAL = 0; 884287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_CRASHED = 1; 885287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_EARLY_ANR = 2; 886287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_ANR = 3; 887287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 888287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mState; 889287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 890287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_DEFAULT = 0; 891287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 892287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_DIALOG = 0; 893287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_KILL = 1; 894287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 895287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_CONTINUE = 0; 896287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_KILL = 1; 897287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 898287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_DIALOG = 0; 899287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_KILL = 1; 900287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_WAIT = 1; 901287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 902287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mResult; 903287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 904f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Process mGdbProcess; 905f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Thread mGdbThread; 906f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn boolean mGotGdbPrint; 907f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 908f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController(String gdbPort) { 909f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbPort = gdbPort; 910f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 911f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 912287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 913287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityResuming(String pkg) throws RemoteException { 914287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 915287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity resuming: " + pkg); 916287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 917287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 918287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 919287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 920287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 921287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 922287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 923287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity starting: " + pkg); 924287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 925287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 926287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 927287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 928287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 929287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 930287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn long timeMillis, String stackTrace) throws RemoteException { 931287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 932287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS CRASHED"); 933287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 934287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 935287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("shortMsg: " + shortMsg); 936287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("longMsg: " + longMsg); 937287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("timeMillis: " + timeMillis); 938287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("stack:"); 939287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(stackTrace); 940287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 941f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_CRASHED); 942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return result == RESULT_CRASH_KILL ? false : true; 943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appEarlyNotResponding(String processName, int pid, String annotation) 948287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 949287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 950287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING"); 951287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 952287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 953287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("annotation: " + annotation); 954f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_EARLY_ANR); 955287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_EARLY_ANR_KILL) return -1; 956287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 957287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 958287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 959287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 960287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 961287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appNotResponding(String processName, int pid, String processStats) 962287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 963287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 964287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS NOT RESPONDING"); 965287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 966287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 967287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processStats:"); 968287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(processStats); 969287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 970f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_ANR); 971287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_KILL) return -1; 972287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_WAIT) return 1; 973287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 974287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 975287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 976287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 977f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn void killGdbLocked() { 978f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = false; 979f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbProcess != null) { 980f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Stopping gdbserver"); 981f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.destroy(); 982f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = null; 983f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 984f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread != null) { 985f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.interrupt(); 986f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = null; 987f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 988f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 989f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 990f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int waitControllerLocked(int pid, int state) { 991f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbPort != null) { 992f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 993f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 994f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 995f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Starting gdbserver on port " + mGdbPort); 996f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Do the following:"); 997f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort); 998f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" gdbclient app_process :" + mGdbPort); 999f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1000f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = Runtime.getRuntime().exec(new String[] { 1001f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid) 1002f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }); 1003f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final InputStreamReader converter = new InputStreamReader( 1004f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.getInputStream()); 1005f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = new Thread() { 1006f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn @Override 1007f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn public void run() { 1008f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn BufferedReader in = new BufferedReader(converter); 1009f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String line; 1010f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int count = 0; 1011f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while (true) { 1012f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn synchronized (MyActivityController.this) { 1013f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread == null) { 1014f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1015f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1016f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (count == 2) { 1017f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = true; 1018f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController.this.notifyAll(); 1019f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1020f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1021f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 1022f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn line = in.readLine(); 1023f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (line == null) { 1024f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1025f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1026f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("GDB: " + line); 1027f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn count++; 1028f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 1029f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1030f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1031f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1032f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1033f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }; 1034f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.start(); 1035f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1036f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn // Stupid waiting for .5s. Doesn't matter if we end early. 1037f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 1038f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn this.wait(500); 1039f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (InterruptedException e) { 1040f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1041f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1042f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 1043f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Failure starting gdbserver: " + e); 1044f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 1045f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1046f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = state; 1048287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 1049287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1050287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1051287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while (mState != STATE_NORMAL) { 1052287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 1053287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn wait(); 1054287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (InterruptedException e) { 1055287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1056287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1057287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1058f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 1059f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1060287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mResult; 1061287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1062287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1063287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void resumeController(int result) { 1064287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1065287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 1066287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mResult = result; 1067287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn notifyAll(); 1068287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1069287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1070287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1071287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void printMessageForState() { 1072287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn switch (mState) { 1073287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_NORMAL: 1074287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Monitoring activity manager... available commands:"); 1075287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1076287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_CRASHED: 1077287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after crash... available commands:"); 1078287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show crash dialog"); 1079287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1080287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1081287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_EARLY_ANR: 1082287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after early ANR... available commands:"); 1083287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: standard ANR processing"); 1084287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1085287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1086287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_ANR: 1087287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after ANR... available commands:"); 1088287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show ANR dialog"); 1089287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1090287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(w)ait: wait some more"); 1091287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1092287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1093287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(q)uit: finish monitoring"); 1094287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1095287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1096287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void run() throws RemoteException { 1097287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 1098287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1099287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1100287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(this); 1101287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 1102287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1103287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn InputStreamReader converter = new InputStreamReader(System.in); 1104287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn BufferedReader in = new BufferedReader(converter); 1105287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn String line; 1106287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1107287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while ((line = in.readLine()) != null) { 1108287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn boolean addNewline = true; 1109287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (line.length() <= 0) { 1110287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn addNewline = false; 1111287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("q".equals(line) || "quit".equals(line)) { 1112287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_DEFAULT); 1113287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1114287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_CRASHED) { 1115287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1116287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_DIALOG); 1117287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1118287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_KILL); 1119287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1120287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1121287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1122287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_ANR) { 1123287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1124287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_DIALOG); 1125287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1126287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_KILL); 1127287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("w".equals(line) || "wait".equals(line)) { 1128287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_WAIT); 1129287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1130287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1131287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1132287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_EARLY_ANR) { 1133287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1134287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_CONTINUE); 1135287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1136287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_KILL); 1137287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1138287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1139287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1140287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1141287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1142287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1143287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1144287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1145287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (addNewline) { 1146287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 1147287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1148287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1149287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1150287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1151287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1152287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (IOException e) { 1153287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn e.printStackTrace(); 1154287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } finally { 1155287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(null); 1156287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1157287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1158287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1159287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1160287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private void runMonitor() throws Exception { 1161f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String opt; 1162f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String gdbPort = null; 1163f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while ((opt=nextOption()) != null) { 1164f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (opt.equals("--gdb")) { 1165f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn gdbPort = nextArgRequired(); 1166f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } else { 1167f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 1168f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1169f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1170f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1171f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1172f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController controller = new MyActivityController(gdbPort); 1173287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn controller.run(); 1174287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1175287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1176e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn private void runScreenCompat() throws Exception { 1177e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String mode = nextArgRequired(); 1178e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn boolean enabled; 1179e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if ("on".equals(mode)) { 1180e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = true; 1181e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if ("off".equals(mode)) { 1182e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = false; 1183e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 1184e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode); 1185e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return; 1186e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1187e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1188e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String packageName = nextArgRequired(); 1189e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn do { 1190e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn try { 11910f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mAm.setPackageScreenCompatMode(packageName, enabled 11920f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ? ActivityManager.COMPAT_MODE_ENABLED 11930f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn : ActivityManager.COMPAT_MODE_DISABLED); 1194e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } catch (RemoteException e) { 1195e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1196e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn packageName = nextArg(); 1197e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } while (packageName != null); 1198e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1199e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 12007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void runDisplaySize() throws Exception { 12017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String size = nextArgRequired(); 120243aa15912891930833edfc101615a9c881de54a1Jeff Brown int w, h; 12037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if ("reset".equals(size)) { 120443aa15912891930833edfc101615a9c881de54a1Jeff Brown w = h = -1; 12057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 12067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int div = size.indexOf('x'); 12077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 12087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad size " + size); 12097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 12107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 121143aa15912891930833edfc101615a9c881de54a1Jeff Brown String wstr = size.substring(0, div); 121243aa15912891930833edfc101615a9c881de54a1Jeff Brown String hstr = size.substring(div+1); 12137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 121443aa15912891930833edfc101615a9c881de54a1Jeff Brown w = Integer.parseInt(wstr); 121543aa15912891930833edfc101615a9c881de54a1Jeff Brown h = Integer.parseInt(hstr); 12167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (NumberFormatException e) { 12177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad number " + e); 12187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 12197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 12207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 12217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 12227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 12237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Context.WINDOW_SERVICE)); 12247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wm == null) { 12257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 12267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 12277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 12287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 12297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 123043aa15912891930833edfc101615a9c881de54a1Jeff Brown if (w >= 0 && h >= 0) { 123159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // TODO(multidisplay): For now Configuration only applies to main screen. 123243aa15912891930833edfc101615a9c881de54a1Jeff Brown wm.setForcedDisplaySize(Display.DEFAULT_DISPLAY, w, h); 12337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 123459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner wm.clearForcedDisplaySize(Display.DEFAULT_DISPLAY); 12357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 12367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (RemoteException e) { 1237351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 12387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 12397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 1240dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn private void runDisplayDensity() throws Exception { 1241dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn String densityStr = nextArgRequired(); 1242dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int density; 1243dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if ("reset".equals(densityStr)) { 1244dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn density = -1; 1245dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else { 1246dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn try { 1247dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn density = Integer.parseInt(densityStr); 1248dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } catch (NumberFormatException e) { 1249dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println("Error: bad number " + e); 1250dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return; 1251dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1252dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (density < 72) { 1253dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println("Error: density must be >= 72"); 1254dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return; 1255dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1256dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1257dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1258dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 1259dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn Context.WINDOW_SERVICE)); 1260dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (wm == null) { 1261dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 1262dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 1263dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1264dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1265dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn try { 1266dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (density > 0) { 1267dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 1268dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn wm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); 1269dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else { 1270dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn wm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); 1271dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1272dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } catch (RemoteException e) { 1273dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1274dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1275dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1276f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn private void runToUri(boolean intentScheme) throws Exception { 12771676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 1278f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn System.out.println(intent.toUri(intentScheme ? Intent.URI_INTENT_SCHEME : 0)); 1279f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1280f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 12819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 12829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 12839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 128452fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn @Override 128552fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn public void performReceive(Intent intent, int resultCode, String data, Bundle extras, 128652fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn boolean ordered, boolean sticky, int sendingUser) throws RemoteException { 1287e2bdca5c4330b6bc9cc26480ae4c1eefe5ee9ce9Dianne Hackborn String line = "Broadcast completed: result=" + resultCode; 12889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 1289e2bdca5c4330b6bc9cc26480ae4c1eefe5ee9ce9Dianne Hackborn if (extras != null) line = line + ", extras: " + extras; 12909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 12913065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme synchronized (this) { 12923065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme mFinished = true; 12933065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme notifyAll(); 12943065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme } 12959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 12969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 12979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 13009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 13019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 13099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1311305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 13749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 13839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 13849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 13859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 13869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 14139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 14149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 14159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 14169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 14179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 14189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 14249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 14259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 14269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 14279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 14339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 14349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 14352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" + 14361676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " [--R COUNT] [-S] [--opengl-trace]\n" + 14371676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " [--user <USER_ID> | current] <INTENT>\n" + 14381676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am startservice [--user <USER_ID> | current] <INTENT>\n" + 14391676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am force-stop [--user <USER_ID> | all | current] <PACKAGE>\n" + 14401676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am kill [--user <USER_ID> | all | current] <PACKAGE>\n" + 1441e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " am kill-all\n" + 14421676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am broadcast [--user <USER_ID> | all | current] <INTENT>\n" + 144362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" + 14441676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " [--user <USER_ID> | current]\n" + 144546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--no-window-animation] <COMPONENT>\n" + 14461676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am profile start [--user <USER_ID> current] <PROCESS> <FILE>\n" + 14471676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am profile stop [--user <USER_ID> current] [<PROCESS>]\n" + 14481676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>\n" + 1449d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am set-debug-app [-w] [--persistent] <PACKAGE>\n" + 1450d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am clear-debug-app\n" + 145146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am monitor [--gdb <port>]\n" + 145246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am screen-compat [on|off] <PACKAGE>\n" + 145343aa15912891930833edfc101615a9c881de54a1Jeff Brown " am display-size [reset|WxH]\n" + 1454dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn " am display-density [reset|DENSITY]\n" + 1455f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " am to-uri [INTENT]\n" + 1456f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " am to-intent-uri [INTENT]\n" + 14577e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn " am switch-user <USER_ID>\n" + 145880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " am stop-user <USER_ID>\n" + 14599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 146046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am start: start an Activity. Options are:\n" + 146146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -D: enable debugging\n" + 146246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -W: wait for launch to complete\n" + 146362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " --start-profiler <FILE>: start profiler and send results to <FILE>\n" + 146462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " -P <FILE>: like above, but profiling stops when app goes idle\n" + 14652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" + 14662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " the top activity will be finished.\n" + 14670bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " -S: force stop the target app before starting the activity\n" + 146892a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy " --opengl-trace: enable tracing of OpenGL functions\n" + 14691676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | current: Specify which user to run as; if not\n" + 14701676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " specified then run as the current user.\n" + 14719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 14721676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am startservice: start a Service. Options are:\n" + 14731676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | current: Specify which user to run as; if not\n" + 14741676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " specified then run as the current user.\n" + 14756fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker "\n" + 147646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am force-stop: force stop everything associated with <PACKAGE>.\n" + 14771676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | all | current: Specify user to force stop;\n" + 14781676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " all users if not specified.\n" + 1479351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang "\n" + 1480e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill: Kill all processes associated with <PACKAGE>. Only kills.\n" + 1481e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " processes that are safe to kill -- that is, will not impact the user\n" + 1482e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " experience.\n" + 14831676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | all | current: Specify user whose processes to kill;\n" + 14841676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " all users if not specified.\n" + 1485e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 1486e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill-all: Kill all background processes.\n" + 1487e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 14881676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am broadcast: send a broadcast Intent. Options are:\n" + 14891676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | all | current: Specify which user to send to; if not\n" + 14901676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " specified then send to all users.\n" + 14919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 149246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" + 149346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" + 149446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with\n" + 149546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e perf true] to generate raw output for performance measurements.\n" + 149646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a\n" + 149746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " common form is [-e <testrunner_flag> <value>[,<value>...]].\n" + 149846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -p <FILE>: write profiling data to <FILE>\n" + 149946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -w: wait for instrumentation to finish before returning. Required for\n" + 150046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " test runners.\n" + 15011676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | current: Specify user instrumentation runs in;\n" + 15021676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " current user if not specified.\n" + 150346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --no-window-animation: turn off window animations will running.\n" + 15049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 15051676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am profile: start and stop profiler on a process. The given <PROCESS> argument\n" + 15061676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " may be either a process name or pid. Options are:\n" + 15071676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | current: When supplying a process name,\n" + 15081676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " specify user of process to profile; uses current user if not specified.\n" + 1509f9b5eed81d690ab8f336cb3345b46a36e278f180Joe Malin "\n" + 15101676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am dumpheap: dump the heap of a process. The given <PROCESS> argument may\n" + 15111676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " be either a process name or pid. Options are:\n" + 151246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -n: dump native heap instead of managed heap\n" + 15131676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " --user <USER_ID> | current: When supplying a process name,\n" + 15141676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn " specify user of process to dump; uses current user if not specified.\n" + 15159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 1516d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am set-debug-app: set application <PACKAGE> to debug. Options are:\n" + 1517d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " -w: wait for debugger when application starts\n" + 1518d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " --persistent: retain this value\n" + 1519d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 1520d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am clear-debug-app: clear the previously set-debug-app.\n" + 1521d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 1522d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn "am bug-report: request bug report generation; will launch UI\n" + 1523d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn " when done to select where it should be delivered." + 1524d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn "\n" + 152546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am monitor: start monitoring for crashes or ANRs.\n" + 152646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --gdb: start gdbserv on the given port at crash/ANR\n" + 1527287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn "\n" + 152846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + 1529e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn "\n" + 153046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am display-size: override display size.\n" + 15317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "\n" + 1532dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn "am display-density: override display density.\n" + 1533dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn "\n" + 1534f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "am to-uri: print the given Intent specification as a URI.\n" + 1535f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "\n" + 1536f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "am to-intent-uri: print the given Intent specification as an intent: URI.\n" + 1537f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "\n" + 15381676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am switch-user: switch to put USER_ID in the foreground, starting\n" + 153980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " execution of that user if it is currently stopped.\n" + 154080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "\n" + 15411676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn "am stop-user: stop execution of USER_ID, not allowing it to run any\n" + 154280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " code until a later explicit switch to it.\n" + 154380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "\n" + 154446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "<INTENT> specifications include these flags and arguments:\n" + 154546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 154646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 154746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 154846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--esn <EXTRA_KEY> ...]\n" + 154946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 155046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 155146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 15523a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen " [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]\n" + 15538ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu " [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" + 15547df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn " [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]\n" + 155546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" + 155646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" + 15573a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen " [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]\n" + 155846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 155946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 156046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--debug-log-resolution] [--exclude-stopped-packages]\n" + 156146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--include-stopped-packages]\n" + 156246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 156346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 156446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 156546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 156646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 156746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 156846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-single-top] [--activity-clear-task]\n" + 156946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-task-on-home]\n" + 157046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 1571f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " [--selector]\n" + 15720bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " [<URI> | <PACKAGE> | <COMPONENT>]\n" 15739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1576