Am.java revision 6a69b4fbaee9a8251401453cd2d3509d52f5b91c
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 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 309c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 379c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 388f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream; 399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugOption = false; 518f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(e.toString()); 719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 936fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 946fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 99f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 100f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 101824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 102824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private Intent makeIntent() throws URISyntaxException { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugOption = false; 1138f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 1219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 1249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 1279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 1309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 1329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 1359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 136305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 137305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 138305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 139305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker hasIntentInfo = true; 1409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 1419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 1449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1456a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 1466a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 1476a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 1486a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 1496a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki hasIntentInfo = true; 1509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 1519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 1549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 1569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 1579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 1589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 1599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 1609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 1629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 1639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 1645ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 1655ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 1665ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 1675ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 1685ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 1695ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 1705ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 1715ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1725ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 1735ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 1745ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 1755ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 1765ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 1775ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 1785ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 1795ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 1805ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 1815ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 1825ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 1835ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 1845ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 1855ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 1865ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 1875ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 1885ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 1895ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 1905ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 1915ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 1925ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 1935ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 1945ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 1955ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 1965ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 1975ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 1985ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 1995ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 2009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 2019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mDebugOption = true; 2028f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 2038f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 2049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 2059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 2069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 2079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String uri = nextArg(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uri != null) { 2149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Intent oldIntent = intent; 215746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer intent = Intent.parseUri(uri, 0); 2169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getAction() != null) { 2179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(oldIntent.getAction()); 2189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 2199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getData() != null || oldIntent.getType() != null) { 2209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setDataAndType(oldIntent.getData(), oldIntent.getType()); 2219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 2229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Set cats = oldIntent.getCategories(); 2239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cats != null) { 2249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Iterator it = cats.iterator(); 2259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (it.hasNext()) { 2269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory((String)it.next()); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2366fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 2376fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker Intent intent = makeIntent(); 2386fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 2396fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker ComponentName cn = mAm.startService(null, intent, intent.getType()); 2406fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 2416fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 2426fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 2436fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 2446fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 2459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 2479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Starting: " + intent); 2489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // XXX should do something to determine the MIME type. 2508f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn IActivityManager.WaitResult result = null; 2518f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn int res; 2528f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (mWaitOption) { 2538f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result = mAm.startActivityAndWait(null, intent, intent.getType(), 2548f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn null, 0, null, null, 0, false, mDebugOption); 2558f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn res = result.result; 2568f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else { 2578f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn res = mAm.startActivity(null, intent, intent.getType(), 2588f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn null, 0, null, null, 0, false, mDebugOption); 2598f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 2608f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 2618f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn boolean launched = false; 2629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor switch (res) { 2639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SUCCESS: 2648f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 2659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SWITCHES_CANCELED: 2678f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 2688f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 2699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because the " 2709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " current activity is being kept for the user."); 2719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_DELIVERED_TO_TOP: 2738f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 2748f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 2759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, intent has " 2769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "been delivered to currently running " 2779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "top-most instance."); 2789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_RETURN_INTENT_TO_CALLER: 2808f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 2818f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 2829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because intent " 2839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "should be handled by the caller"); 2849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_TASK_TO_FRONT: 2868f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 2878f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 2889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, its current " 2899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "task has been brought to the front"); 2909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_INTENT_NOT_RESOLVED: 2928f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Activity not started, unable to " 2949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "resolve " + intent.toString()); 2959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 2969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_CLASS_NOT_FOUND: 2978f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println(NO_CLASS_ERROR_CODE); 2988f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println("Error: Activity class " + 2999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.getComponent().toShortString() 3009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " does not exist."); 3019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 3038f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you requested to " 3059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "both forward and receive its result"); 3069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_PERMISSION_DENIED: 3088f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you do not " 3109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "have permission to access it."); 3119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor default: 3138f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, unknown error code " + res); 3159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3178f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (mWaitOption && launched) { 3188f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result == null) { 3198f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result = new IActivityManager.WaitResult(); 3208f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result.who = intent.getComponent(); 3218f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3228f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 3238f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.who != null) { 3248f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 3258f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3268f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.thisTime >= 0) { 3278f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("ThisTime: " + result.thisTime); 3288f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3298f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.totalTime >= 0) { 3308f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("TotalTime: " + result.totalTime); 3318f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3328f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Complete"); 3338f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 3389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 3399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 3409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false); 3419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 3549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 3559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 3569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 3579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 3589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 3599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 3609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 3619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 3629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 3639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 3649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 3659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--no_window_animation")) { 3669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 3679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 3689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 3699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 3709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 3769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 3859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 3869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 3879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) { 3919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 4019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 4029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 4069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 4079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 4089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String process = nextArgRequired(); 4099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor fd = null; 4109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 4129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 4139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 4149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 4159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 4169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 4179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 4189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 4199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 4209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 4219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 4229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 4239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 4249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (!"stop".equals(cmd)) { 4269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Profile command " + cmd + " not valid"); 4279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.profileControl(process, start, profileFile, fd)) { 4309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("PROFILE FAILED on process " + process); 4319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 434824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 435824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden boolean managed = !"-n".equals(nextOption()); 436824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 437824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 438824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 439824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 440824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 441824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden fd = ParcelFileDescriptor.open( 442824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden new File(heapFile), 443824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 444824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 445824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 446824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 447824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 448824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 449824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 450824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 451824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden if (!mAm.dumpHeap(process, managed, heapFile, fd)) { 452824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 453824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 454824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 455824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 4569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 4579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 4589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void performReceive( 46068d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn Intent intent, int rc, String data, Bundle ext, boolean ord, 46168d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn boolean sticky) { 4629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String line = "Broadcast completed: result=" + rc; 4639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 4649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (ext != null) line = line + ", extras: " + ext; 4659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 4669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mFinished = true; 4679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor notifyAll(); 4689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 4739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 4749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 4829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 484305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 5479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 5569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 5579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 5589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 5599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 5869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 5879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 5889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 5899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 5909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 5919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 5979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 5989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 5999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 6009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 6069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 6079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 6089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 6098f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn " start an Activity: am start [-D] [-W] <INTENT>\n" + 6109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -D: enable debugging\n" + 6118f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn " -W: wait for launch to complete\n" + 6129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 6136fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker " start a Service: am startservice <INTENT>\n" + 6146fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker "\n" + 6159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " send a broadcast Intent: am broadcast <INTENT>\n" + 6169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 6179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " start an Instrumentation: am instrument [flags] <COMPONENT>\n" + 6189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)\n" + 6199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>\n" + 6209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -p <FILE>: write profiling data to <FILE>\n" + 6219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " -w: wait for instrumentation to finish before returning\n" + 6229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 6239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " start profiling: am profile <PROCESS> start <FILE>\n" + 6249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " stop profiling: am profile <PROCESS> stop\n" + 625824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden " dump heap: am dumpheap [flags] <PROCESS> <FILE>\n" + 626824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden " -n: dump native heap instead of managed heap\n" + 6279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 6289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " <INTENT> specifications include these flags:\n" + 6299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 6309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 6319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 632305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker " [--esn <EXTRA_KEY> ...]\n" + 6339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 6347b750542d68773c0df12ec747af292d458b59f45Daniel Sandler " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 6356a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 6365ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 6375ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 6385ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--debug-log-resolution]\n" + 6395ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 6405ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 6415ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 6425ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 6435ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 6445ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 6455ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--activity-single-top]\n" + 6465ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 6475ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn " [<URI>]\n" 6489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 651