Am.java revision 62f20ecf492d2b29881bba307c79ff55e68760e6
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 5305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Licensed under the Apache License, Version 2.0 (the "License"); 6305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** you may not use this file except in compliance with the License. 7305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 9305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 11305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Unless required by applicable law or agreed to in writing, software 12305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** distributed under the License is distributed on an "AS IS" BASIS, 13305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.am; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackbornimport android.app.ActivityManager; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 23287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport android.app.IActivityController; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.content.Context; 299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 339c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 3646d110329e659cc9cb9514e220ce273701eb151dDianne Hackbornimport android.os.SystemProperties; 379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.BufferedReader; 419c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 429c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 43287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.IOException; 44287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.InputStreamReader; 458f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream; 469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugOption = false; 588f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private String mProfileFile; 6162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private boolean mProfileAutoStop; 6262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 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) { 749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(e.toString()); 819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 1009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 1036fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 1046fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 105351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } else if (op.equals("force-stop")) { 106351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang runForceStop(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 111f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 112f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 113824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 114824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 115287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (op.equals("monitor")) { 116287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn runMonitor(); 117e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if (op.equals("screen-compat")) { 118e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn runScreenCompat(); 1197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (op.equals("display-size")) { 1207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn runDisplaySize(); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private Intent makeIntent() throws URISyntaxException { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugOption = false; 1318f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 1399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 1429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 1459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 1489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 1509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 1539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 154305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 155305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 156305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 157305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker hasIntentInfo = true; 1589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 1599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 1629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1638ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu } else if (opt.equals("--eu")) { 1648ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String key = nextArgRequired(); 1658ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String value = nextArgRequired(); 1668ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu intent.putExtra(key, Uri.parse(value)); 1678ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu hasIntentInfo = true; 1682d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--eia")) { 1692d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 1702d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 1712d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 1722d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra int[] list = new int[strings.length]; 1732d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 1742d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Integer.valueOf(strings[i]); 1752d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 1762d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 1772d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra hasIntentInfo = true; 1786a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 1796a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 1806a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 1816a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 1826a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki hasIntentInfo = true; 1832d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--ela")) { 1842d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 1852d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 1862d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 1872d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra long[] list = new long[strings.length]; 1882d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 1892d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Long.valueOf(strings[i]); 1902d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 1912d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 1922d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra hasIntentInfo = true; 1939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 1949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 1979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 1999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 2019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 2029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 2039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 2049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 2059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 2075ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 2085ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2095ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 2105ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 21146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--exclude-stopped-packages")) { 21246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); 21346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--include-stopped-packages")) { 21446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 2155ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 2165ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 2175ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 2185ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 2195ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 2205ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 2215ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 2225ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 2235ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 2245ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 2255ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 2265ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 2275ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 2285ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 2295ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 2305ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 2315ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 2325ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 2335ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 2345ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 2355ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 2365ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 2375ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 2385ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 2395ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 2405ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 2415ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 2425ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 24346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-clear-task")) { 24446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 24546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-task-on-home")) { 24646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); 2475ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 2485ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 2495ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 2505ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 2519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 2529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mDebugOption = true; 2538f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 2548f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 25562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("-P")) { 25662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 25762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileAutoStop = true; 25862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("--start-profiler")) { 25962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 26062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileAutoStop = false; 2619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 2629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 2639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 2649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String uri = nextArg(); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (uri != null) { 2719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Intent oldIntent = intent; 272746a95ab7145a1c7583d1f2d6004a508cd7a31dcChristian Mehlmauer intent = Intent.parseUri(uri, 0); 2739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getAction() != null) { 2749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(oldIntent.getAction()); 2759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 2769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (oldIntent.getData() != null || oldIntent.getType() != null) { 2779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setDataAndType(oldIntent.getData(), oldIntent.getType()); 2789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 2799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Set cats = oldIntent.getCategories(); 2809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cats != null) { 2819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor Iterator it = cats.iterator(); 2829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (it.hasNext()) { 2839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory((String)it.next()); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2936fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 2946fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker Intent intent = makeIntent(); 2956fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 2966fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker ComponentName cn = mAm.startService(null, intent, intent.getType()); 2976fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 2986fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 2996fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 3006fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 3016fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 3029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 3049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Starting: " + intent); 3059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 30662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 30762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor fd = null; 30862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 30962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mProfileFile != null) { 31062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn try { 31162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn fd = ParcelFileDescriptor.open( 31262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn new File(mProfileFile), 31362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor.MODE_CREATE | 31462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor.MODE_TRUNCATE | 31562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor.MODE_READ_WRITE); 31662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } catch (FileNotFoundException e) { 31762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn System.err.println("Error: Unable to open file: " + mProfileFile); 31862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn return; 31962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 32062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 32162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 3229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // XXX should do something to determine the MIME type. 3238f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn IActivityManager.WaitResult result = null; 3248f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn int res; 3258f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (mWaitOption) { 3268f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result = mAm.startActivityAndWait(null, intent, intent.getType(), 32762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn null, 0, null, null, 0, false, mDebugOption, 32862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile, fd, mProfileAutoStop); 3298f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn res = result.result; 3308f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else { 3318f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn res = mAm.startActivity(null, intent, intent.getType(), 33262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn null, 0, null, null, 0, false, mDebugOption, 33362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile, fd, mProfileAutoStop); 3348f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3358f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 3368f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn boolean launched = false; 3379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor switch (res) { 3389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SUCCESS: 3398f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 3409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_SWITCHES_CANCELED: 3428f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 3438f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because the " 3459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " current activity is being kept for the user."); 3469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_DELIVERED_TO_TOP: 3488f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 3498f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, intent has " 3519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "been delivered to currently running " 3529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "top-most instance."); 3539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_RETURN_INTENT_TO_CALLER: 3558f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 3568f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started because intent " 3589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "should be handled by the caller"); 3599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_TASK_TO_FRONT: 3618f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn launched = true; 3628f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Warning: Activity not started, its current " 3649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "task has been brought to the front"); 3659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_INTENT_NOT_RESOLVED: 3678f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Error: Activity not started, unable to " 3699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "resolve " + intent.toString()); 3709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_CLASS_NOT_FOUND: 3728f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println(NO_CLASS_ERROR_CODE); 3738f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println("Error: Activity class " + 3749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.getComponent().toShortString() 3759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + " does not exist."); 3769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 3788f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you requested to " 3809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "both forward and receive its result"); 3819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor case IActivityManager.START_PERMISSION_DENIED: 3838f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, you do not " 3859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor + "have permission to access it."); 3869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor default: 3888f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn out.println( 3899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "Error: Activity not started, unknown error code " + res); 3909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor break; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3928f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (mWaitOption && launched) { 3938f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result == null) { 3948f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result = new IActivityManager.WaitResult(); 3958f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn result.who = intent.getComponent(); 3968f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 3978f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 3988f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.who != null) { 3998f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 4008f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4018f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.thisTime >= 0) { 4028f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("ThisTime: " + result.thisTime); 4038f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4048f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn if (result.totalTime >= 0) { 4058f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("TotalTime: " + result.totalTime); 4068f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4078f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn System.out.println("Complete"); 4088f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 411351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang private void runForceStop() throws Exception { 412351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang mAm.forceStopPackage(nextArgRequired()); 413351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 414351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang 4159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 4179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 4189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 4199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false); 4209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 4339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 4349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 4359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 4369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 4379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 4389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 4399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 4409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 4419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 4429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 4439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 44446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--no_window_animation") 44546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn || opt.equals("--no-window-animation")) { 4469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 4479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 4489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 4499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 4509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 4569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 4659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 4669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 4679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) { 4719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 4819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 4829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 4849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 48546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn static void removeWallOption() { 48646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 48746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props != null && props.contains("-Xprofile:wallclock")) { 48846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.replace("-Xprofile:wallclock", ""); 48946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.trim(); 49046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn SystemProperties.set("dalvik.vm.extra-opts", props); 49146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 49246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 49346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 4949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 4959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 4969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 49746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn boolean wall = false; 4987eabe55db6b113f83c2cefcd06812648927de877Romain Guy int profileType = 0; 49946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 50046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String process = null; 50146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 5029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 5037eabe55db6b113f83c2cefcd06812648927de877Romain Guy if ("looper".equals(cmd)) { 5047eabe55db6b113f83c2cefcd06812648927de877Romain Guy cmd = nextArgRequired(); 5057eabe55db6b113f83c2cefcd06812648927de877Romain Guy profileType = 1; 5067eabe55db6b113f83c2cefcd06812648927de877Romain Guy } 5077eabe55db6b113f83c2cefcd06812648927de877Romain Guy 5089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 5099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 51046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = "--wall".equals(nextOption()); 51146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = nextArgRequired(); 51246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if ("stop".equals(cmd)) { 51362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn process = nextArg(); 51446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else { 51546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // Compatibility with old syntax: process is specified first. 51646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = cmd; 51746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn cmd = nextArgRequired(); 51846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("start".equals(cmd)) { 51946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn start = true; 52046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (!"stop".equals(cmd)) { 52146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new IllegalArgumentException("Profile command " + process + " not valid"); 52246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 52346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 52446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 52546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn ParcelFileDescriptor fd = null; 52646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 52746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (start) { 5289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 5299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 5309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 5319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 5329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 5339f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 5349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 5359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 5369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 5379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 5389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5409f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 54146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn try { 54246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (wall) { 54346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // XXX doesn't work -- this needs to be set before booting. 54446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 54546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props == null || !props.contains("-Xprofile:wallclock")) { 54646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props + " -Xprofile:wallclock"; 54746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //SystemProperties.set("dalvik.vm.extra-opts", props); 54846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 54946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (start) { 55046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 55146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 5527eabe55db6b113f83c2cefcd06812648927de877Romain Guy if (!mAm.profileControl(process, start, profileFile, fd, profileType)) { 55346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = false; 55446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new AndroidException("PROFILE FAILED on process " + process); 55546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 55646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } finally { 55746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (!wall) { 55846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 55946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 5609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 563824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 564824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden boolean managed = !"-n".equals(nextOption()); 565824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 566824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 567824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 568824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 569824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 570824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden fd = ParcelFileDescriptor.open( 571824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden new File(heapFile), 572824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 573824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 574824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 575824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 576824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 577824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 578824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 579824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 580824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden if (!mAm.dumpHeap(process, managed, heapFile, fd)) { 581824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 582824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 583824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 584824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 585287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn class MyActivityController extends IActivityController.Stub { 586f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final String mGdbPort; 587f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 588287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_NORMAL = 0; 589287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_CRASHED = 1; 590287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_EARLY_ANR = 2; 591287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_ANR = 3; 592287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 593287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mState; 594287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 595287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_DEFAULT = 0; 596287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 597287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_DIALOG = 0; 598287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_KILL = 1; 599287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 600287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_CONTINUE = 0; 601287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_KILL = 1; 602287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 603287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_DIALOG = 0; 604287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_KILL = 1; 605287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_WAIT = 1; 606287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 607287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mResult; 608287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 609f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Process mGdbProcess; 610f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Thread mGdbThread; 611f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn boolean mGotGdbPrint; 612f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 613f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController(String gdbPort) { 614f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbPort = gdbPort; 615f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 616f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 617287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 618287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityResuming(String pkg) throws RemoteException { 619287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 620287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity resuming: " + pkg); 621287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 622287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 623287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 624287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 625287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 626287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 627287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 628287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity starting: " + pkg); 629287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 630287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 631287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 632287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 633287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 634287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 635287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn long timeMillis, String stackTrace) throws RemoteException { 636287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 637287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS CRASHED"); 638287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 639287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 640287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("shortMsg: " + shortMsg); 641287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("longMsg: " + longMsg); 642287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("timeMillis: " + timeMillis); 643287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("stack:"); 644287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(stackTrace); 645287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 646f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_CRASHED); 647287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return result == RESULT_CRASH_KILL ? false : true; 648287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 649287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 650287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 651287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 652287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appEarlyNotResponding(String processName, int pid, String annotation) 653287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 654287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 655287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING"); 656287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 657287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 658287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("annotation: " + annotation); 659f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_EARLY_ANR); 660287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_EARLY_ANR_KILL) return -1; 661287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 662287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 663287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 664287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 665287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 666287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appNotResponding(String processName, int pid, String processStats) 667287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 668287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 669287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS NOT RESPONDING"); 670287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 671287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 672287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processStats:"); 673287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(processStats); 674287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 675f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_ANR); 676287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_KILL) return -1; 677287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_WAIT) return 1; 678287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 679287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 680287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 681287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 682f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn void killGdbLocked() { 683f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = false; 684f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbProcess != null) { 685f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Stopping gdbserver"); 686f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.destroy(); 687f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = null; 688f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 689f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread != null) { 690f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.interrupt(); 691f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = null; 692f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 693f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 694f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 695f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int waitControllerLocked(int pid, int state) { 696f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbPort != null) { 697f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 698f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 699f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 700f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Starting gdbserver on port " + mGdbPort); 701f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Do the following:"); 702f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort); 703f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" gdbclient app_process :" + mGdbPort); 704f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 705f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = Runtime.getRuntime().exec(new String[] { 706f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid) 707f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }); 708f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final InputStreamReader converter = new InputStreamReader( 709f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.getInputStream()); 710f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = new Thread() { 711f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn @Override 712f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn public void run() { 713f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn BufferedReader in = new BufferedReader(converter); 714f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String line; 715f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int count = 0; 716f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while (true) { 717f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn synchronized (MyActivityController.this) { 718f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread == null) { 719f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 720f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 721f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (count == 2) { 722f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = true; 723f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController.this.notifyAll(); 724f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 725f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 726f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 727f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn line = in.readLine(); 728f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (line == null) { 729f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 730f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 731f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("GDB: " + line); 732f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn count++; 733f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 734f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 735f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 736f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 737f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 738f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }; 739f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.start(); 740f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 741f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn // Stupid waiting for .5s. Doesn't matter if we end early. 742f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 743f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn this.wait(500); 744f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (InterruptedException e) { 745f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 746f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 747f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 748f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Failure starting gdbserver: " + e); 749f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 750f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 751f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 752287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = state; 753287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 754287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 755287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 756287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while (mState != STATE_NORMAL) { 757287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 758287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn wait(); 759287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (InterruptedException e) { 760287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 761287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 762287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 763f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 764f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 765287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mResult; 766287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 767287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 768287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void resumeController(int result) { 769287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 770287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 771287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mResult = result; 772287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn notifyAll(); 773287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 774287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 775287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 776287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void printMessageForState() { 777287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn switch (mState) { 778287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_NORMAL: 779287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Monitoring activity manager... available commands:"); 780287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 781287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_CRASHED: 782287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after crash... available commands:"); 783287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show crash dialog"); 784287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 785287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_EARLY_ANR: 787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after early ANR... available commands:"); 788287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: standard ANR processing"); 789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_ANR: 792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after ANR... available commands:"); 793287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show ANR dialog"); 794287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 795287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(w)ait: wait some more"); 796287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 797287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 798287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(q)uit: finish monitoring"); 799287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 800287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 801287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void run() throws RemoteException { 802287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 803287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 804287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 805287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(this); 806287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 807287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 808287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn InputStreamReader converter = new InputStreamReader(System.in); 809287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn BufferedReader in = new BufferedReader(converter); 810287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn String line; 811287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 812287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while ((line = in.readLine()) != null) { 813287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn boolean addNewline = true; 814287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (line.length() <= 0) { 815287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn addNewline = false; 816287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("q".equals(line) || "quit".equals(line)) { 817287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_DEFAULT); 818287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 819287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_CRASHED) { 820287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 821287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_DIALOG); 822287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 823287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_KILL); 824287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 825287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 826287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 827287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_ANR) { 828287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 829287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_DIALOG); 830287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 831287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_KILL); 832287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("w".equals(line) || "wait".equals(line)) { 833287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_WAIT); 834287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 835287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 836287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 837287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_EARLY_ANR) { 838287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 839287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_CONTINUE); 840287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 841287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_KILL); 842287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 843287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 844287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 845287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 846287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 847287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 848287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 849287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 850287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (addNewline) { 851287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 852287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 853287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 854287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 855287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 856287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 857287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (IOException e) { 858287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn e.printStackTrace(); 859287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } finally { 860287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(null); 861287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 862287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 863287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 864287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 865287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private void runMonitor() throws Exception { 866f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String opt; 867f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String gdbPort = null; 868f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while ((opt=nextOption()) != null) { 869f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (opt.equals("--gdb")) { 870f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn gdbPort = nextArgRequired(); 871f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } else { 872f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 873f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn showUsage(); 874f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 875f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 876f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 877f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 878f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController controller = new MyActivityController(gdbPort); 879287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn controller.run(); 880287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 881287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 882e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn private void runScreenCompat() throws Exception { 883e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String mode = nextArgRequired(); 884e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn boolean enabled; 885e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if ("on".equals(mode)) { 886e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = true; 887e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if ("off".equals(mode)) { 888e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = false; 889e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 890e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode); 891e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn showUsage(); 892e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return; 893e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 894e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 895e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String packageName = nextArgRequired(); 896e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn do { 897e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn try { 8980f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mAm.setPackageScreenCompatMode(packageName, enabled 8990f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ? ActivityManager.COMPAT_MODE_ENABLED 9000f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn : ActivityManager.COMPAT_MODE_DISABLED); 901e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } catch (RemoteException e) { 902e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 903e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn packageName = nextArg(); 904e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } while (packageName != null); 905e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 906e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 9077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void runDisplaySize() throws Exception { 9087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String size = nextArgRequired(); 9097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int m, n; 9107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if ("reset".equals(size)) { 9117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n = -1; 9127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 9137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int div = size.indexOf('x'); 9147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 9157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad size " + size); 9167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn showUsage(); 9177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 9187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String mstr = size.substring(0, div); 9207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String nstr = size.substring(div+1); 9217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 9227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = Integer.parseInt(mstr); 9237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = Integer.parseInt(nstr); 9247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (NumberFormatException e) { 9257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad number " + e); 9267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn showUsage(); 9277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 9287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 9317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m < n) { 9327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int tmp = m; 9337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n; 9347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = tmp; 9357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 9377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 9387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Context.WINDOW_SERVICE)); 9397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wm == null) { 9407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 9417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 9427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 9447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 9457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m >= 0 && n >= 0) { 9467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn wm.setForcedDisplaySize(m, n); 9477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 9487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn wm.clearForcedDisplaySize(); 9497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (RemoteException e) { 951351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 9527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 9537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 9549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 9559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 9569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 9579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void performReceive( 95868d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn Intent intent, int rc, String data, Bundle ext, boolean ord, 95968d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn boolean sticky) { 9609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String line = "Broadcast completed: result=" + rc; 9619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 9629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (ext != null) line = line + ", extras: " + ext; 9639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 9649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mFinished = true; 9659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor notifyAll(); 9669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 9679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 9689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 9719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 9729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 9809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 982305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 10459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 10549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 10559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 10569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 10579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 10849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 10859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 10869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 10879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 10889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 10899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 10959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 10969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 10979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 10989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 11049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 11059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 110662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>] <INTENT>\n" + 110746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am startservice <INTENT>\n" + 110846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am force-stop <PACKAGE>\n" + 110946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am broadcast <INTENT>\n" + 111062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" + 111146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--no-window-animation] <COMPONENT>\n" + 11127eabe55db6b113f83c2cefcd06812648927de877Romain Guy " am profile [looper] start <PROCESS> <FILE>\n" + 111362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am profile [looper] stop [<PROCESS>]\n" + 111446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am dumpheap [flags] <PROCESS> <FILE>\n" + 111546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am monitor [--gdb <port>]\n" + 111646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am screen-compat [on|off] <PACKAGE>\n" + 111746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am display-size [reset|MxN]\n" + 11189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 111946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am start: start an Activity. Options are:\n" + 112046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -D: enable debugging\n" + 112146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -W: wait for launch to complete\n" + 112262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " --start-profiler <FILE>: start profiler and send results to <FILE>\n" + 112362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " -P <FILE>: like above, but profiling stops when app goes idle\n" + 11249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 112546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am startservice: start a Service.\n" + 11266fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker "\n" + 112746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am force-stop: force stop everything associated with <PACKAGE>.\n" + 1128351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang "\n" + 112946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am broadcast: send a broadcast Intent.\n" + 11309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 113146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" + 113246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" + 113346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with\n" + 113446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e perf true] to generate raw output for performance measurements.\n" + 113546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a\n" + 113646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " common form is [-e <testrunner_flag> <value>[,<value>...]].\n" + 113746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -p <FILE>: write profiling data to <FILE>\n" + 113846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -w: wait for instrumentation to finish before returning. Required for\n" + 113946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " test runners.\n" + 114046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --no-window-animation: turn off window animations will running.\n" + 11419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 114246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am profile: start and stop profiler on a process.\n" + 1143f9b5eed81d690ab8f336cb3345b46a36e278f180Joe Malin "\n" + 114446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am dumpheap: dump the heap of a process. Options are:\n" + 114546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -n: dump native heap instead of managed heap\n" + 11469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 114746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am monitor: start monitoring for crashes or ANRs.\n" + 114846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --gdb: start gdbserv on the given port at crash/ANR\n" + 1149287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn "\n" + 115046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + 1151e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn "\n" + 115246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am display-size: override display size.\n" + 11537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "\n" + 115446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "<INTENT> specifications include these flags and arguments:\n" + 115546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 115646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 115746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 115846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--esn <EXTRA_KEY> ...]\n" + 115946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 116046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 116146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 11628ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu " [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" + 116346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" + 116446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" + 116546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 116646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 116746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--debug-log-resolution] [--exclude-stopped-packages]\n" + 116846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--include-stopped-packages]\n" + 116946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 117046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 117146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 117246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 117346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 117446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 117546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-single-top] [--activity-clear-task]\n" + 117646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-task-on-home]\n" + 117746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 117846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [<URI>]\n" 11799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1182