Am.java revision 79f7ec70ebd5758ce54fd5b6fcd60fd27457cba6
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; 2780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganovimport android.app.UiAutomationConnection; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 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; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 4279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackbornimport com.android.internal.os.BaseCommand; 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 5479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackbornpublic class Am extends BaseCommand { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn private int mStartFlags = 0; 598f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 600bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn private boolean mStopOption = false; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn private int mRepeat = 0; 631676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn private int mUserId; 6402ffba940ca96988ed3e7774c606b43c58373b5eJeff Sharkey private String mReceiverPermission; 652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 6662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private String mProfileFile; 6762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 7479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn (new Am()).run(args); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn public void onShowUsage(PrintStream out) { 7879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn out.println( 7979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "usage: am [subcommand] [options]\n" + 8079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" + 8179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--R COUNT] [-S] [--opengl-trace]\n" + 8279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--user <USER_ID> | current] <INTENT>\n" + 8379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am startservice [--user <USER_ID> | current] <INTENT>\n" + 8479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am force-stop [--user <USER_ID> | all | current] <PACKAGE>\n" + 8579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am kill [--user <USER_ID> | all | current] <PACKAGE>\n" + 8679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am kill-all\n" + 8779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am broadcast [--user <USER_ID> | all | current] <INTENT>\n" + 8879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" + 8979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--user <USER_ID> | current]\n" + 9079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--no-window-animation] <COMPONENT>\n" + 9179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am profile start [--user <USER_ID> current] <PROCESS> <FILE>\n" + 9279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am profile stop [--user <USER_ID> current] [<PROCESS>]\n" + 9379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>\n" + 9479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am set-debug-app [-w] [--persistent] <PACKAGE>\n" + 9579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am clear-debug-app\n" + 9679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am monitor [--gdb <port>]\n" + 9779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am screen-compat [on|off] <PACKAGE>\n" + 9879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am to-uri [INTENT]\n" + 9979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am to-intent-uri [INTENT]\n" + 10079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am switch-user <USER_ID>\n" + 10179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " am stop-user <USER_ID>\n" + 10279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 10379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am start: start an Activity. Options are:\n" + 10479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -D: enable debugging\n" + 10579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -W: wait for launch to complete\n" + 10679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --start-profiler <FILE>: start profiler and send results to <FILE>\n" + 10779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -P <FILE>: like above, but profiling stops when app goes idle\n" + 10879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" + 10979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " the top activity will be finished.\n" + 11079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -S: force stop the target app before starting the activity\n" + 11179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --opengl-trace: enable tracing of OpenGL functions\n" + 11279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | current: Specify which user to run as; if not\n" + 11379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " specified then run as the current user.\n" + 11479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 11579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am startservice: start a Service. Options are:\n" + 11679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | current: Specify which user to run as; if not\n" + 11779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " specified then run as the current user.\n" + 11879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 11979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am force-stop: force stop everything associated with <PACKAGE>.\n" + 12079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | all | current: Specify user to force stop;\n" + 12179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " all users if not specified.\n" + 12279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 12379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am kill: Kill all processes associated with <PACKAGE>. Only kills.\n" + 12479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " processes that are safe to kill -- that is, will not impact the user\n" + 12579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " experience.\n" + 12679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | all | current: Specify user whose processes to kill;\n" + 12779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " all users if not specified.\n" + 12879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 12979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am kill-all: Kill all background processes.\n" + 13079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 13179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am broadcast: send a broadcast Intent. Options are:\n" + 13279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | all | current: Specify which user to send to; if not\n" + 13379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " specified then send to all users.\n" + 13479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --receiver-permission <PERMISSION>: Require receiver to hold permission.\n" + 13579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 13679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" + 13779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" + 13879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with\n" + 13979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [-e perf true] to generate raw output for performance measurements.\n" + 14079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a\n" + 14179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " common form is [-e <testrunner_flag> <value>[,<value>...]].\n" + 14279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -p <FILE>: write profiling data to <FILE>\n" + 14379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -w: wait for instrumentation to finish before returning. Required for\n" + 14479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " test runners.\n" + 14579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | current: Specify user instrumentation runs in;\n" + 14679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " current user if not specified.\n" + 14779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --no-window-animation: turn off window animations will running.\n" + 14879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 14979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am profile: start and stop profiler on a process. The given <PROCESS> argument\n" + 15079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " may be either a process name or pid. Options are:\n" + 15179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | current: When supplying a process name,\n" + 15279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " specify user of process to profile; uses current user if not specified.\n" + 15379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 15479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am dumpheap: dump the heap of a process. The given <PROCESS> argument may\n" + 15579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " be either a process name or pid. Options are:\n" + 15679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -n: dump native heap instead of managed heap\n" + 15779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --user <USER_ID> | current: When supplying a process name,\n" + 15879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " specify user of process to dump; uses current user if not specified.\n" + 15979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 16079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am set-debug-app: set application <PACKAGE> to debug. Options are:\n" + 16179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " -w: wait for debugger when application starts\n" + 16279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --persistent: retain this value\n" + 16379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 16479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am clear-debug-app: clear the previously set-debug-app.\n" + 16579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 16679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am bug-report: request bug report generation; will launch UI\n" + 16779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " when done to select where it should be delivered.\n" + 16879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 16979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am monitor: start monitoring for crashes or ANRs.\n" + 17079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " --gdb: start gdbserv on the given port at crash/ANR\n" + 17179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 17279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + 17379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 17479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am to-uri: print the given Intent specification as a URI.\n" + 17579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 17679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am to-intent-uri: print the given Intent specification as an intent: URI.\n" + 17779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 17879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am switch-user: switch to put USER_ID in the foreground, starting\n" + 17979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " execution of that user if it is currently stopped.\n" + 18079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 18179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "am stop-user: stop execution of USER_ID, not allowing it to run any\n" + 18279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " code until a later explicit switch to it.\n" + 18379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "\n" + 18479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn "<INTENT> specifications include these flags and arguments:\n" + 18579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 18679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 18779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 18879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--esn <EXTRA_KEY> ...]\n" + 18979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 19079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 19179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 19279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]\n" + 19379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" + 19479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]\n" + 19579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" + 19679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" + 19779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]\n" + 19879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 19979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 20079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--debug-log-resolution] [--exclude-stopped-packages]\n" + 20179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--include-stopped-packages]\n" + 20279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 20379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 20479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 20579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 20679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 20779f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 20879f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-single-top] [--activity-clear-task]\n" + 20979f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--activity-task-on-home]\n" + 21079f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 21179f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [--selector]\n" + 21279f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn " [<URI> | <PACKAGE> | <COMPONENT>]\n" 21379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn ); 21479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn } 21579f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn 21679f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn public void onRun() throws Exception { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 2209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 2219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22479f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn String op = nextArgRequired(); 2259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 2286fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 2296fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 230351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } else if (op.equals("force-stop")) { 231351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang runForceStop(); 232e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill")) { 233e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKill(); 234e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill-all")) { 235e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKillAll(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 240f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 241f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 242824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 243824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 244d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("set-debug-app")) { 245d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runSetDebugApp(); 246d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("clear-debug-app")) { 247d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runClearDebugApp(); 248d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn } else if (op.equals("bug-report")) { 249d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn runBugReport(); 250287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (op.equals("monitor")) { 251287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn runMonitor(); 252e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if (op.equals("screen-compat")) { 253e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn runScreenCompat(); 254f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-uri")) { 255f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(false); 256f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-intent-uri")) { 257f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(true); 258483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (op.equals("switch-user")) { 259742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani runSwitchUser(); 26080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } else if (op.equals("stop-user")) { 26180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn runStopUser(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26379f7ec70ebd5758ce54fd5b6fcd60fd27457cba6Dianne Hackborn showError("Error: unknown command '" + op + "'"); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2675e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn int parseUserArg(String arg) { 2685e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn int userId; 2695e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if ("all".equals(arg)) { 2705e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = UserHandle.USER_ALL; 2715e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else if ("current".equals(arg) || "cur".equals(arg)) { 2725e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = UserHandle.USER_CURRENT; 2735e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else { 2745e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = Integer.parseInt(arg); 2755e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2765e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return userId; 2775e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 2785e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 2791676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn private Intent makeIntent(int defUser) throws URISyntaxException { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 281f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn Intent baseIntent = intent; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 284a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags = 0; 2858f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 2860bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = false; 2872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = 0; 2880bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mProfileFile = null; 2891676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mUserId = defUser; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 2949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 2959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 2969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 297f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 298f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 299f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 3009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 3019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 302f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 303f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 304f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 3059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 3069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 307f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 308f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 309f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 3109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 3119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 312f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 313f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 314f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 3159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 3169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 3179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 3189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 319305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 320305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 321305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 3229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 3239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 3249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 3259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 3268ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu } else if (opt.equals("--eu")) { 3278ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String key = nextArgRequired(); 3288ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String value = nextArgRequired(); 3298ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu intent.putExtra(key, Uri.parse(value)); 3307df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn } else if (opt.equals("--ecn")) { 3317df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String key = nextArgRequired(); 3327df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String value = nextArgRequired(); 3337df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn ComponentName cn = ComponentName.unflattenFromString(value); 3347df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn if (cn == null) throw new IllegalArgumentException("Bad component name: " + value); 3357df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn intent.putExtra(key, cn); 3362d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--eia")) { 3372d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 3382d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 3392d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 3402d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra int[] list = new int[strings.length]; 3412d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 3422d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Integer.valueOf(strings[i]); 3432d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 3442d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 3456a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 3466a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 3476a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 3486a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 3492d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--ela")) { 3502d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 3512d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 3522d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 3532d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra long[] list = new long[strings.length]; 3542d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 3552d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Long.valueOf(strings[i]); 3562d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 3572d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 3583a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 3593a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--ef")) { 3603a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 3613a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 3623a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, Float.valueOf(value)); 3633a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 3643a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--efa")) { 3653a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 3663a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 3673a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String[] strings = value.split(","); 3683a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen float[] list = new float[strings.length]; 3693a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen for (int i = 0; i < strings.length; i++) { 3703a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen list[i] = Float.valueOf(strings[i]); 3713a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } 3723a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, list); 3733a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 3749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 3759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 3769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 3779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 3789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 3799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 3809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 3819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 3829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 383f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 384f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 385f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 3869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 3879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 3889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 3895ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 3905ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 3915ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 3925ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 39346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--exclude-stopped-packages")) { 39446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); 39546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--include-stopped-packages")) { 39646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 3975ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 3985ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 3995ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 4005ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 4015ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 4025ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 4035ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 4045ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 4055ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 4065ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 4075ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 4085ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 4095ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 4105ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 4115ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 4125ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 4135ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 4145ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 4155ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 4165ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 4175ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 4185ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 4195ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 4205ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 4215ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 4225ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 4235ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 4245ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 42546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-clear-task")) { 42646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 42746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-task-on-home")) { 42846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); 4295ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 4305ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 4315ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 4325ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 433f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (opt.equals("--selector")) { 434f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.setDataAndType(data, type); 435f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = new Intent(); 4369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 437a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_DEBUG; 4388f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 4398f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 44062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("-P")) { 44162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 442a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 44362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("--start-profiler")) { 44462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 445a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags &= ~ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 4462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (opt.equals("-R")) { 4472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = Integer.parseInt(nextArgRequired()); 4480bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (opt.equals("-S")) { 4490bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = true; 45092a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy } else if (opt.equals("--opengl-trace")) { 451a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_OPENGL_TRACES; 452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (opt.equals("--user")) { 4535e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn mUserId = parseUserArg(nextArgRequired()); 45402ffba940ca96988ed3e7774c606b43c58373b5eJeff Sharkey } else if (opt.equals("--receiver-permission")) { 45502ffba940ca96988ed3e7774c606b43c58373b5eJeff Sharkey mReceiverPermission = nextArgRequired(); 4569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 4579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 4589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 463f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn final boolean hasSelector = intent != baseIntent; 464f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 465f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // A selector was specified; fix up. 466f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setSelector(intent); 467f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = baseIntent; 468f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 469f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 4700bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String arg = nextArg(); 471f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = null; 472f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (arg == null) { 473f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 474f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // If a selector has been specified, and no arguments 475f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // have been supplied for the main Intent, then we can 476f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // assume it is ACTION_MAIN CATEGORY_LAUNCHER; we don't 477f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // need to have a component name specified yet, the 478f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // selector will take care of that. 4790bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 4800bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 4819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 482f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf(':') >= 0) { 483f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a URI. Fully parse it, and use that result 484f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // to fill in any data not specified so far. 485f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME); 486f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf('/') >= 0) { 487f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a component name. Build an Intent to launch 488f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // it. 489f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 490f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 491f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setComponent(ComponentName.unflattenFromString(arg)); 492f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else { 493f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // Assume the argument is a package name. 494f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 495f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 496f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setPackage(arg); 497f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 498f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (baseIntent != null) { 4990bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle extras = intent.getExtras(); 5000bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras((Bundle)null); 5010bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle uriExtras = baseIntent.getExtras(); 5020bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.replaceExtras((Bundle)null); 5030bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (intent.getAction() != null && baseIntent.getCategories() != null) { 5040bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn HashSet<String> cats = new HashSet<String>(baseIntent.getCategories()); 5050bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn for (String c : cats) { 5060bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.removeCategory(c); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.fillIn(baseIntent, Intent.FILL_IN_COMPONENT | Intent.FILL_IN_SELECTOR); 5100bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (extras == null) { 5110bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 5120bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (uriExtras != null) { 5130bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn uriExtras.putAll(extras); 5140bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 5150bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 5160bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras(extras); 5179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5246fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 5251676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 5265e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (mUserId == UserHandle.USER_ALL) { 5275e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start activity with user 'all'"); 5285e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 5295e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 5306fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 5315e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn ComponentName cn = mAm.startService(null, intent, intent.getType(), mUserId); 5326fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 5336fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 534c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!")) { 535c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn System.err.println("Error: Requires permission " + cn.getClassName()); 536c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn } else if (cn.getPackageName().equals("!!")) { 537c0bd747b0605af251ff136277f14220a5a4c9818Dianne Hackborn System.err.println("Error: " + cn.getClassName()); 5386fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 5396fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 5406fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 5419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 5421676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 5430bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 5445e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (mUserId == UserHandle.USER_ALL) { 5455e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start service with user 'all'"); 5465e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 5475e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 5485e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 5490bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String mimeType = intent.getType(); 5500bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (mimeType == null && intent.getData() != null 5510bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn && "content".equals(intent.getData().getScheme())) { 5525e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn mimeType = mAm.getProviderMimeType(intent.getData(), mUserId); 5530bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 5540bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 5552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn do { 5562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mStopOption) { 5572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn String packageName; 5582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (intent.getComponent() != null) { 5592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = intent.getComponent().getPackageName(); 5602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 5612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IPackageManager pm = IPackageManager.Stub.asInterface( 5622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ServiceManager.getService("package")); 5632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (pm == null) { 5642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Package manager not running; aborting"); 5652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 5662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 567483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<ResolveInfo> activities = pm.queryIntentActivities(intent, mimeType, 0, 568483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId); 5692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (activities == null || activities.size() <= 0) { 5702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent does not match any activities: " 5712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 5722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 5732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (activities.size() > 1) { 5742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent matches multiple activities; can't stop: " 5752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 5762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 5772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = activities.get(0).activityInfo.packageName; 5790bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 5802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Stopping: " + packageName); 5811676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.forceStopPackage(packageName, mUserId); 5822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn Thread.sleep(250); 5832c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 5852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Starting: " + intent); 5862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 5872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 5882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor fd = null; 5892c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 5902c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mProfileFile != null) { 5912c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn try { 5922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn fd = ParcelFileDescriptor.open( 5932c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn new File(mProfileFile), 5942c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_CREATE | 5952c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_TRUNCATE | 5962c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_READ_WRITE); 5972c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } catch (FileNotFoundException e) { 5982c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Unable to open file: " + mProfileFile); 5990bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn return; 6000bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 60162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 60292a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy 6032c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IActivityManager.WaitResult result = null; 6042c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn int res; 6052c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption) { 606f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn result = mAm.startActivityAndWait(null, null, intent, mimeType, 6075e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); 6082c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = result.result; 6092c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 610f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn res = mAm.startActivityAsUser(null, null, intent, mimeType, 6115e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null, mUserId); 6128f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 6132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 6142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn boolean launched = false; 6152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn switch (res) { 616a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SUCCESS: 6172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 6182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 619a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SWITCHES_CANCELED: 6202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 6212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6222c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because the " 6232c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " current activity is being kept for the user."); 6242c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 625a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_DELIVERED_TO_TOP: 6262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 6272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, intent has " 6292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "been delivered to currently running " 6302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "top-most instance."); 6312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 632a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_RETURN_INTENT_TO_CALLER: 6332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 6342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because intent " 6362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "should be handled by the caller"); 6372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 638a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_TASK_TO_FRONT: 6392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 6402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, its current " 6422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "task has been brought to the front"); 6432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 644a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_INTENT_NOT_RESOLVED: 6452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unable to " 6472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "resolve " + intent.toString()); 6482c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 649a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_CLASS_NOT_FOUND: 6502c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println(NO_CLASS_ERROR_CODE); 6512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println("Error: Activity class " + 6522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.getComponent().toShortString() 6532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " does not exist."); 6542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 655a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 6562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you requested to " 6582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "both forward and receive its result"); 6592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 660a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_PERMISSION_DENIED: 6612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you do not " 6632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "have permission to access it."); 6642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 6652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn default: 6662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 6672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unknown error code " + res); 6682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 6698f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 6702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption && launched) { 6712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result == null) { 6722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = new IActivityManager.WaitResult(); 6732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result.who = intent.getComponent(); 6742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 6752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 6762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.who != null) { 6772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 6782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 6792c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.thisTime >= 0) { 6802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("ThisTime: " + result.thisTime); 6812c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 6822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.totalTime >= 0) { 6832c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("TotalTime: " + result.totalTime); 6842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 6852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Complete"); 6868f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 6872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat--; 6882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mRepeat > 1) { 6892c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.unhandledBack(); 6908f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 6912c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } while (mRepeat > 1); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 694351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang private void runForceStop() throws Exception { 6951676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_ALL; 6961676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 6971676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 6981676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 6991676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 7001676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 7011676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 7021676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 7031676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 7041676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7051676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7061676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.forceStopPackage(nextArgRequired(), userId); 707351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 708351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang 709e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKill() throws Exception { 7101676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_ALL; 7111676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 7121676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 7131676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 7141676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 7151676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 7161676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 7171676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 7181676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 7191676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7201676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 7211676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn mAm.killBackgroundProcesses(nextArgRequired(), userId); 722e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 723e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 724e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKillAll() throws Exception { 725e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killAllBackgroundProcesses(); 726e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 727e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 7289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 7291676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_ALL); 7309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 7319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 73202ffba940ca96988ed3e7774c606b43c58373b5eJeff Sharkey mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, mReceiverPermission, 733f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.app.AppOpsManager.OP_NONE, true, false, mUserId); 7349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 7421676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 7489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 7499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 7509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 7519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 7529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 7539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 7549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 7559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 7569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 7579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 7589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 75946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--no_window_animation") 76046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn || opt.equals("--no-window-animation")) { 7619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 7625e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } else if (opt.equals("--user")) { 7635e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn userId = parseUserArg(nextArgRequired()); 7649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 7659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 7669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7705e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn if (userId == UserHandle.USER_ALL) { 7715e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn System.err.println("Error: Can't start instrumentation with user 'all'"); 7725e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn return; 7735e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn } 7745e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn 7759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 7779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 78080943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov UiAutomationConnection connection = null; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 78480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov connection = new UiAutomationConnection(); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 7899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 7909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 7919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79480943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId)) { 7959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 8059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 8069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 8079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 8089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 80946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn static void removeWallOption() { 81046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 81146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props != null && props.contains("-Xprofile:wallclock")) { 81246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.replace("-Xprofile:wallclock", ""); 81346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.trim(); 81446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn SystemProperties.set("dalvik.vm.extra-opts", props); 81546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 81646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 81746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 8189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 8199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 8209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 82146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn boolean wall = false; 8221676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 8237eabe55db6b113f83c2cefcd06812648927de877Romain Guy int profileType = 0; 8241676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 82546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String process = null; 8261676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 8279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 8287eabe55db6b113f83c2cefcd06812648927de877Romain Guy 8299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 8309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 8311676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 8321676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 8331676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 8341676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 8351676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else if (opt.equals("--wall")) { 8361676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn wall = true; 8371676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 8381676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 8391676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 8401676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 8411676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 84246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = nextArgRequired(); 84346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if ("stop".equals(cmd)) { 8441676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 8451676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 8461676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 8471676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 8481676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 8491676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 8501676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 8511676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 8521676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 85362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn process = nextArg(); 85446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else { 85546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // Compatibility with old syntax: process is specified first. 85646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = cmd; 85746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn cmd = nextArgRequired(); 85846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("start".equals(cmd)) { 85946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn start = true; 86046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (!"stop".equals(cmd)) { 86146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new IllegalArgumentException("Profile command " + process + " not valid"); 86246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 86346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 8641676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 8651676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (userId == UserHandle.USER_ALL) { 8661676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Can't profile with user 'all'"); 8671676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 8681676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 8691676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 87046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn ParcelFileDescriptor fd = null; 87146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 87246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (start) { 8739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 8749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 8759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 8769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 8779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 8789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 8799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 8809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 8819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 8829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 8839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 8849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 8859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 88646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn try { 88746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (wall) { 88846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // XXX doesn't work -- this needs to be set before booting. 88946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 89046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props == null || !props.contains("-Xprofile:wallclock")) { 89146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props + " -Xprofile:wallclock"; 89246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //SystemProperties.set("dalvik.vm.extra-opts", props); 89346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 89446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (start) { 89546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 89646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 8971676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (!mAm.profileControl(process, userId, start, profileFile, fd, profileType)) { 89846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = false; 89946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new AndroidException("PROFILE FAILED on process " + process); 90046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 90146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } finally { 90246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (!wall) { 90346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 90446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 9059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 9069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 9079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 908824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 9091676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn boolean managed = true; 9101676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn int userId = UserHandle.USER_CURRENT; 9111676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn 9121676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn String opt; 9131676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn while ((opt=nextOption()) != null) { 9141676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (opt.equals("--user")) { 9151676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn userId = parseUserArg(nextArgRequired()); 9161676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (userId == UserHandle.USER_ALL) { 9171676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Can't dump heap with user 'all'"); 9181676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 9191676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 9201676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else if (opt.equals("-n")) { 9211676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn managed = false; 9221676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } else { 9231676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 9241676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn return; 9251676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 9261676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn } 927824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 928824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 929824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 930824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 931824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 932b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn File file = new File(heapFile); 933b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn file.delete(); 934b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn fd = ParcelFileDescriptor.open(file, 935824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 936824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 937824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 938824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 939824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 940824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 941824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 942824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 9431676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn if (!mAm.dumpHeap(process, userId, managed, heapFile, fd)) { 944824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 945824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 946824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 947824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 948d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runSetDebugApp() throws Exception { 949d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean wait = false; 950d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean persistent = false; 951d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 952d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String opt; 953d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn while ((opt=nextOption()) != null) { 954d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn if (opt.equals("-w")) { 955d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn wait = true; 956d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (opt.equals("--persistent")) { 957d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn persistent = true; 958d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else { 959d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 960d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn return; 961d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 962d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 963d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 964d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String pkg = nextArgRequired(); 965d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(pkg, wait, persistent); 966d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 967d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 968d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runClearDebugApp() throws Exception { 969d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(null, false, true); 970d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 971d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 972d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn private void runBugReport() throws Exception { 973d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn mAm.requestBugReport(); 974d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn System.out.println("Your lovely bug report is being created; please be patient."); 975d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn } 976d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn 977742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private void runSwitchUser() throws Exception { 978742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani String user = nextArgRequired(); 979742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mAm.switchUser(Integer.parseInt(user)); 980742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 981742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 98280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn private void runStopUser() throws Exception { 98380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String user = nextArgRequired(); 98480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn int res = mAm.stopUser(Integer.parseInt(user), null); 98580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn if (res != ActivityManager.USER_OP_SUCCESS) { 98680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String txt = ""; 98780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn switch (res) { 98880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_IS_CURRENT: 98980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Can't stop current user)"; 99080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 99180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_UNKNOWN_USER: 99280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Unknown user " + user + ")"; 99380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 99480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 99580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn System.err.println("Switch failed: " + res + txt); 99680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 99780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 99880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn 999287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn class MyActivityController extends IActivityController.Stub { 1000f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final String mGdbPort; 1001f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1002287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_NORMAL = 0; 1003287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_CRASHED = 1; 1004287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_EARLY_ANR = 2; 1005287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_ANR = 3; 1006287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1007287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mState; 1008287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1009287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_DEFAULT = 0; 1010287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1011287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_DIALOG = 0; 1012287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_KILL = 1; 1013287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1014287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_CONTINUE = 0; 1015287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_KILL = 1; 1016287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1017287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_DIALOG = 0; 1018287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_KILL = 1; 1019287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_WAIT = 1; 1020287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1021287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mResult; 1022287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1023f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Process mGdbProcess; 1024f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Thread mGdbThread; 1025f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn boolean mGotGdbPrint; 1026f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1027f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController(String gdbPort) { 1028f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbPort = gdbPort; 1029f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1030f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1031287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 1032287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityResuming(String pkg) throws RemoteException { 1033287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1034287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity resuming: " + pkg); 1035287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1036287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 1037287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1038287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1039287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 1040287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 1041287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1042287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity starting: " + pkg); 1043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 1045287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 1048287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 1049287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn long timeMillis, String stackTrace) throws RemoteException { 1050287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1051287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS CRASHED"); 1052287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 1053287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 1054287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("shortMsg: " + shortMsg); 1055287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("longMsg: " + longMsg); 1056287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("timeMillis: " + timeMillis); 1057287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("stack:"); 1058287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(stackTrace); 1059287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 1060f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_CRASHED); 1061287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return result == RESULT_CRASH_KILL ? false : true; 1062287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1063287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1064287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1065287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 1066287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appEarlyNotResponding(String processName, int pid, String annotation) 1067287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 1068287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1069287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING"); 1070287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 1071287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 1072287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("annotation: " + annotation); 1073f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_EARLY_ANR); 1074287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_EARLY_ANR_KILL) return -1; 1075287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 1076287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1077287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1078287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1079287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 1080287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appNotResponding(String processName, int pid, String processStats) 1081287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 1082287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1083287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS NOT RESPONDING"); 1084287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 1085287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 1086287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processStats:"); 1087287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(processStats); 1088287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 1089f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_ANR); 1090287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_KILL) return -1; 1091287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_WAIT) return 1; 1092287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 1093287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1094287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1095287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1096f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn void killGdbLocked() { 1097f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = false; 1098f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbProcess != null) { 1099f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Stopping gdbserver"); 1100f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.destroy(); 1101f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = null; 1102f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1103f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread != null) { 1104f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.interrupt(); 1105f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = null; 1106f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1107f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1108f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1109f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int waitControllerLocked(int pid, int state) { 1110f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbPort != null) { 1111f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 1112f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1113f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 1114f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Starting gdbserver on port " + mGdbPort); 1115f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Do the following:"); 1116f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort); 1117f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" gdbclient app_process :" + mGdbPort); 1118f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1119f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = Runtime.getRuntime().exec(new String[] { 1120f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid) 1121f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }); 1122f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final InputStreamReader converter = new InputStreamReader( 1123f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.getInputStream()); 1124f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = new Thread() { 1125f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn @Override 1126f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn public void run() { 1127f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn BufferedReader in = new BufferedReader(converter); 1128f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String line; 1129f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int count = 0; 1130f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while (true) { 1131f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn synchronized (MyActivityController.this) { 1132f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread == null) { 1133f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1134f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1135f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (count == 2) { 1136f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = true; 1137f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController.this.notifyAll(); 1138f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1139f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1140f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 1141f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn line = in.readLine(); 1142f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (line == null) { 1143f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1144f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1145f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("GDB: " + line); 1146f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn count++; 1147f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 1148f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1149f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1150f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1151f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1152f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }; 1153f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.start(); 1154f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1155f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn // Stupid waiting for .5s. Doesn't matter if we end early. 1156f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 1157f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn this.wait(500); 1158f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (InterruptedException e) { 1159f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1160f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1161f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 1162f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Failure starting gdbserver: " + e); 1163f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 1164f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1165f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1166287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = state; 1167287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 1168287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1169287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1170287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while (mState != STATE_NORMAL) { 1171287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 1172287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn wait(); 1173287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (InterruptedException e) { 1174287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1175287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1176287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1177f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 1178f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1179287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mResult; 1180287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1181287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1182287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void resumeController(int result) { 1183287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1184287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 1185287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mResult = result; 1186287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn notifyAll(); 1187287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1188287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1189287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1190287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void printMessageForState() { 1191287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn switch (mState) { 1192287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_NORMAL: 1193287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Monitoring activity manager... available commands:"); 1194287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1195287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_CRASHED: 1196287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after crash... available commands:"); 1197287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show crash dialog"); 1198287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1199287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1200287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_EARLY_ANR: 1201287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after early ANR... available commands:"); 1202287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: standard ANR processing"); 1203287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1204287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1205287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_ANR: 1206287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after ANR... available commands:"); 1207287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show ANR dialog"); 1208287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 1209287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(w)ait: wait some more"); 1210287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1211287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1212287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(q)uit: finish monitoring"); 1213287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1214287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1215287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void run() throws RemoteException { 1216287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 1217287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1218287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1219287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(this); 1220287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 1221287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1222287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn InputStreamReader converter = new InputStreamReader(System.in); 1223287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn BufferedReader in = new BufferedReader(converter); 1224287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn String line; 1225287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1226287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while ((line = in.readLine()) != null) { 1227287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn boolean addNewline = true; 1228287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (line.length() <= 0) { 1229287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn addNewline = false; 1230287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("q".equals(line) || "quit".equals(line)) { 1231287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_DEFAULT); 1232287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1233287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_CRASHED) { 1234287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1235287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_DIALOG); 1236287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1237287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_KILL); 1238287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1239287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1240287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1241287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_ANR) { 1242287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1243287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_DIALOG); 1244287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1245287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_KILL); 1246287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("w".equals(line) || "wait".equals(line)) { 1247287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_WAIT); 1248287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1249287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1250287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1251287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_EARLY_ANR) { 1252287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1253287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_CONTINUE); 1254287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1255287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_KILL); 1256287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1257287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1258287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1259287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1260287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1261287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1262287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1263287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1264287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (addNewline) { 1265287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 1266287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1267287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1268287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1269287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1270287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1271287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (IOException e) { 1272287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn e.printStackTrace(); 1273287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } finally { 1274287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(null); 1275287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1276287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1278287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1279287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private void runMonitor() throws Exception { 1280f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String opt; 1281f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String gdbPort = null; 1282f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while ((opt=nextOption()) != null) { 1283f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (opt.equals("--gdb")) { 1284f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn gdbPort = nextArgRequired(); 1285f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } else { 1286f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 1287f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1288f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1289f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1290f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1291f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController controller = new MyActivityController(gdbPort); 1292287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn controller.run(); 1293287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1294287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1295e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn private void runScreenCompat() throws Exception { 1296e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String mode = nextArgRequired(); 1297e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn boolean enabled; 1298e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if ("on".equals(mode)) { 1299e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = true; 1300e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if ("off".equals(mode)) { 1301e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = false; 1302e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 1303e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode); 1304e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return; 1305e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1306e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1307e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String packageName = nextArgRequired(); 1308e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn do { 1309e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn try { 13100f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mAm.setPackageScreenCompatMode(packageName, enabled 13110f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ? ActivityManager.COMPAT_MODE_ENABLED 13120f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn : ActivityManager.COMPAT_MODE_DISABLED); 1313e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } catch (RemoteException e) { 1314e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1315e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn packageName = nextArg(); 1316e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } while (packageName != null); 1317e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1318e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1319f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn private void runToUri(boolean intentScheme) throws Exception { 13201676c856d61b97c871dc2be0cb1f1fb1e12e24e9Dianne Hackborn Intent intent = makeIntent(UserHandle.USER_CURRENT); 1321f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn System.out.println(intent.toUri(intentScheme ? Intent.URI_INTENT_SCHEME : 0)); 1322f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1323f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 13249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 13259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 13269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 132752fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn @Override 132852fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn public void performReceive(Intent intent, int resultCode, String data, Bundle extras, 132952fba38f7d155e22e7487fc173243b4df2a9e76aDianne Hackborn boolean ordered, boolean sticky, int sendingUser) throws RemoteException { 1330e2bdca5c4330b6bc9cc26480ae4c1eefe5ee9ce9Dianne Hackborn String line = "Broadcast completed: result=" + resultCode; 13319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 1332e2bdca5c4330b6bc9cc26480ae4c1eefe5ee9ce9Dianne Hackborn if (extras != null) line = line + ", extras: " + extras; 13339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 13343065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme synchronized (this) { 13353065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme mFinished = true; 13363065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme notifyAll(); 13373065963f817f9a0f032ec7992c4154cfdeed443dFelipe Leme } 13389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 13399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 13409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 13439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 13449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 13529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1354305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 14179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1425