Am.java revision d8c98fee02b5498270344727d1289004d98c0e73
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 5305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Licensed under the Apache License, Version 2.0 (the "License"); 6305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** you may not use this file except in compliance with the License. 7305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 9305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 11305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** Unless required by applicable law or agreed to in writing, software 12305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** distributed under the License is distributed on an "AS IS" BASIS, 13305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.am; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackbornimport android.app.ActivityManager; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 23287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport android.app.IActivityController; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IInstrumentationWatcher; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Instrumentation; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.content.Context; 299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.content.IIntentReceiver; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 310bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport android.content.pm.IPackageManager; 320bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport android.content.pm.ResolveInfo; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 359c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport android.os.ParcelFileDescriptor; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 3846d110329e659cc9cb9514e220ce273701eb151dDianne Hackbornimport android.os.SystemProperties; 399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport android.util.AndroidException; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.BufferedReader; 439c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 449c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 45287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.IOException; 46287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.InputStreamReader; 478f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream; 489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 490bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.HashSet; 500bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.List; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDebugOption = false; 608f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 610bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn private boolean mStopOption = false; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn private int mRepeat = 0; 642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 6562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private String mProfileFile; 6662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private boolean mProfileAutoStop; 6762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 850bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn e.printStackTrace(System.err); 869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 1059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 1086fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 1096fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 110351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } else if (op.equals("force-stop")) { 111351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang runForceStop(); 112e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill")) { 113e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKill(); 114e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill-all")) { 115e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKillAll(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 120f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 121f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 122824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 123824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 124d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("set-debug-app")) { 125d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runSetDebugApp(); 126d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("clear-debug-app")) { 127d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runClearDebugApp(); 128287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (op.equals("monitor")) { 129287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn runMonitor(); 130e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if (op.equals("screen-compat")) { 131e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn runScreenCompat(); 1327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (op.equals("display-size")) { 1337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn runDisplaySize(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private Intent makeIntent() throws URISyntaxException { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDebugOption = false; 1448f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 1450bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = false; 1462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = 0; 1470bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mProfileFile = null; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 1559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1569f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 1589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1609f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 1619f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1639f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 1649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 1669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 1699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 170305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 171305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 172305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 173305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker hasIntentInfo = true; 1749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 1759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 1789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 1798ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu } else if (opt.equals("--eu")) { 1808ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String key = nextArgRequired(); 1818ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String value = nextArgRequired(); 1828ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu intent.putExtra(key, Uri.parse(value)); 1838ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu hasIntentInfo = true; 1842d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--eia")) { 1852d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 1862d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 1872d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 1882d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra int[] list = new int[strings.length]; 1892d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 1902d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Integer.valueOf(strings[i]); 1912d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 1922d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 1932d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra hasIntentInfo = true; 1946a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 1956a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 1966a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 1976a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 1986a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki hasIntentInfo = true; 1992d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--ela")) { 2002d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 2012d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 2022d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 2032d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra long[] list = new long[strings.length]; 2042d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 2052d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Long.valueOf(strings[i]); 2062d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 2072d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 2082d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra hasIntentInfo = true; 2099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 2109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 2119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 2129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 2139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 2149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 2159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 2179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 2189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 2199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 2209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 2219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 2235ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 2245ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2255ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 2265ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 22746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--exclude-stopped-packages")) { 22846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); 22946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--include-stopped-packages")) { 23046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 2315ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 2325ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 2335ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 2345ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 2355ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 2365ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 2375ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 2385ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 2395ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 2405ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 2415ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 2425ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 2435ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 2445ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 2455ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 2465ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 2475ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 2485ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 2495ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 2505ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 2515ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 2525ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 2535ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 2545ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 2555ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 2565ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 2575ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 2585ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 25946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-clear-task")) { 26046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 26146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-task-on-home")) { 26246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); 2635ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 2645ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 2655ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 2665ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 2679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 2689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mDebugOption = true; 2698f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 2708f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 27162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("-P")) { 27262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 27362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileAutoStop = true; 27462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("--start-profiler")) { 27562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 27662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileAutoStop = false; 2772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (opt.equals("-R")) { 2782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = Integer.parseInt(nextArgRequired()); 2790bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (opt.equals("-S")) { 2800bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = true; 2819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 2829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 2839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 2849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2890bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String arg = nextArg(); 2900bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (arg != null) { 2910bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Intent baseIntent; 2920bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (arg.indexOf(':') >= 0) { 2930bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn // The argument is a URI. Fully parse it, and use that result 2940bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn // to fill in any data not specified so far. 2950bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME); 2960bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (arg.indexOf('/') >= 0) { 2970bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn // The argument is a component name. Build an Intent to launch 2980bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn // it. 2990bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 3000bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 3010bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.setComponent(ComponentName.unflattenFromString(arg)); 3020bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else { 3030bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn // Assume the argument is a package name. 3040bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 3050bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 3060bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.setPackage(arg); 3079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 3080bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle extras = intent.getExtras(); 3090bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras((Bundle)null); 3100bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle uriExtras = baseIntent.getExtras(); 3110bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.replaceExtras((Bundle)null); 3120bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (intent.getAction() != null && baseIntent.getCategories() != null) { 3130bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn HashSet<String> cats = new HashSet<String>(baseIntent.getCategories()); 3140bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn for (String c : cats) { 3150bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.removeCategory(c); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3180bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.fillIn(baseIntent, Intent.FILL_IN_COMPONENT); 3190bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (extras == null) { 3200bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3210bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (uriExtras != null) { 3220bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn uriExtras.putAll(extras); 3230bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3240bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 3250bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras(extras); 3269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3336fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 3346fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker Intent intent = makeIntent(); 3356fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 3366fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker ComponentName cn = mAm.startService(null, intent, intent.getType()); 3376fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 3386fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 3396fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 3406fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 3416fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 3429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 3440bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 3450bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String mimeType = intent.getType(); 3460bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (mimeType == null && intent.getData() != null 3470bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn && "content".equals(intent.getData().getScheme())) { 3480bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mimeType = mAm.getProviderMimeType(intent.getData()); 3490bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 3500bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 3512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn do { 3522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mStopOption) { 3532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn String packageName; 3542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (intent.getComponent() != null) { 3552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = intent.getComponent().getPackageName(); 3562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 3572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IPackageManager pm = IPackageManager.Stub.asInterface( 3582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ServiceManager.getService("package")); 3592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (pm == null) { 3602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Package manager not running; aborting"); 3612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 3622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 3632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn List<ResolveInfo> activities = pm.queryIntentActivities(intent, mimeType, 0); 3642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (activities == null || activities.size() <= 0) { 3652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent does not match any activities: " 3662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 3672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 3682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (activities.size() > 1) { 3692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent matches multiple activities; can't stop: " 3702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 3712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 3722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 3732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = activities.get(0).activityInfo.packageName; 3740bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 3752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Stopping: " + packageName); 3762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.forceStopPackage(packageName); 3772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn Thread.sleep(250); 3782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 3792c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 3802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Starting: " + intent); 3812c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 3832c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor fd = null; 3842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 3852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mProfileFile != null) { 3862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn try { 3872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn fd = ParcelFileDescriptor.open( 3882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn new File(mProfileFile), 3892c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_CREATE | 3902c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_TRUNCATE | 3912c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_READ_WRITE); 3922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } catch (FileNotFoundException e) { 3932c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Unable to open file: " + mProfileFile); 3940bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn return; 3950bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 39662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 3972c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 3982c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IActivityManager.WaitResult result = null; 3992c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn int res; 4002c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption) { 4012c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = mAm.startActivityAndWait(null, intent, mimeType, 4022c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn null, 0, null, null, 0, false, mDebugOption, 4032c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mProfileFile, fd, mProfileAutoStop); 4042c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = result.result; 4052c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 4062c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = mAm.startActivity(null, intent, mimeType, 40762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn null, 0, null, null, 0, false, mDebugOption, 40862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile, fd, mProfileAutoStop); 4098f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4102c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 4112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn boolean launched = false; 4122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn switch (res) { 4132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_SUCCESS: 4142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4162c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_SWITCHES_CANCELED: 4172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because the " 4202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " current activity is being kept for the user."); 4212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4222c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_DELIVERED_TO_TOP: 4232c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4242c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4252c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, intent has " 4262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "been delivered to currently running " 4272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "top-most instance."); 4282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_RETURN_INTENT_TO_CALLER: 4302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because intent " 4332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "should be handled by the caller"); 4342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_TASK_TO_FRONT: 4362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, its current " 4392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "task has been brought to the front"); 4402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_INTENT_NOT_RESOLVED: 4422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unable to " 4442c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "resolve " + intent.toString()); 4452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_CLASS_NOT_FOUND: 4472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println(NO_CLASS_ERROR_CODE); 4482c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println("Error: Activity class " + 4492c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.getComponent().toShortString() 4502c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " does not exist."); 4512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 4532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you requested to " 4552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "both forward and receive its result"); 4562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4572c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn case IActivityManager.START_PERMISSION_DENIED: 4582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you do not " 4602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "have permission to access it."); 4612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn default: 4632c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unknown error code " + res); 4652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 4668f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption && launched) { 4682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result == null) { 4692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = new IActivityManager.WaitResult(); 4702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result.who = intent.getComponent(); 4712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 4732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.who != null) { 4742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 4752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.thisTime >= 0) { 4772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("ThisTime: " + result.thisTime); 4782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4792c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.totalTime >= 0) { 4802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("TotalTime: " + result.totalTime); 4812c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Complete"); 4838f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat--; 4852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mRepeat > 1) { 4862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.unhandledBack(); 4878f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } while (mRepeat > 1); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 491351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang private void runForceStop() throws Exception { 492351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang mAm.forceStopPackage(nextArgRequired()); 493351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 494351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang 495e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKill() throws Exception { 496e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killBackgroundProcesses(nextArgRequired()); 497e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 498e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 499e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKillAll() throws Exception { 500e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killAllBackgroundProcesses(); 501e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 502e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 5039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 5059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 5069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 5079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false); 5089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 5219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 5229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 5239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 5249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 5259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 5269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 5279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 5289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 5299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 5309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 5319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 53246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--no_window_animation") 53346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn || opt.equals("--no-window-animation")) { 5349f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 5359f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 5369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 5379f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 5389f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 5449f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 5539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 5549f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 5559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) { 5599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 5699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 5709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 5729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 57346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn static void removeWallOption() { 57446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 57546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props != null && props.contains("-Xprofile:wallclock")) { 57646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.replace("-Xprofile:wallclock", ""); 57746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.trim(); 57846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn SystemProperties.set("dalvik.vm.extra-opts", props); 57946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 58046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 58146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 5829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 5839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 5849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 58546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn boolean wall = false; 5867eabe55db6b113f83c2cefcd06812648927de877Romain Guy int profileType = 0; 58746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 58846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String process = null; 58946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 5909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 5917eabe55db6b113f83c2cefcd06812648927de877Romain Guy if ("looper".equals(cmd)) { 5927eabe55db6b113f83c2cefcd06812648927de877Romain Guy cmd = nextArgRequired(); 5937eabe55db6b113f83c2cefcd06812648927de877Romain Guy profileType = 1; 5947eabe55db6b113f83c2cefcd06812648927de877Romain Guy } 5957eabe55db6b113f83c2cefcd06812648927de877Romain Guy 5969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 5979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 59846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = "--wall".equals(nextOption()); 59946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = nextArgRequired(); 60046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if ("stop".equals(cmd)) { 60162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn process = nextArg(); 60246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else { 60346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // Compatibility with old syntax: process is specified first. 60446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = cmd; 60546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn cmd = nextArgRequired(); 60646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("start".equals(cmd)) { 60746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn start = true; 60846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (!"stop".equals(cmd)) { 60946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new IllegalArgumentException("Profile command " + process + " not valid"); 61046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 61146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 61246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 61346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn ParcelFileDescriptor fd = null; 61446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 61546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (start) { 6169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 6179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 6189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 6199f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 6209f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 6219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 6229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 6239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 6249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 6259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 6269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 62946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn try { 63046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (wall) { 63146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // XXX doesn't work -- this needs to be set before booting. 63246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 63346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props == null || !props.contains("-Xprofile:wallclock")) { 63446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props + " -Xprofile:wallclock"; 63546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //SystemProperties.set("dalvik.vm.extra-opts", props); 63646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 63746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (start) { 63846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 63946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 6407eabe55db6b113f83c2cefcd06812648927de877Romain Guy if (!mAm.profileControl(process, start, profileFile, fd, profileType)) { 64146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = false; 64246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new AndroidException("PROFILE FAILED on process " + process); 64346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 64446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } finally { 64546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (!wall) { 64646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 64746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 6489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 651824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 652824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden boolean managed = !"-n".equals(nextOption()); 653824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 654824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 655824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 656824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 657824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 658824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden fd = ParcelFileDescriptor.open( 659824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden new File(heapFile), 660824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 661824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 662824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 663824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 664824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 665824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 666824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 667824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 668824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden if (!mAm.dumpHeap(process, managed, heapFile, fd)) { 669824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 670824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 671824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 672824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 673d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runSetDebugApp() throws Exception { 674d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean wait = false; 675d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean persistent = false; 676d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 677d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String opt; 678d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn while ((opt=nextOption()) != null) { 679d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn if (opt.equals("-w")) { 680d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn wait = true; 681d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (opt.equals("--persistent")) { 682d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn persistent = true; 683d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else { 684d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 685d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn showUsage(); 686d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn return; 687d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 688d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 689d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 690d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String pkg = nextArgRequired(); 691d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(pkg, wait, persistent); 692d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 693d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 694d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runClearDebugApp() throws Exception { 695d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(null, false, true); 696d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 697d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 698287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn class MyActivityController extends IActivityController.Stub { 699f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final String mGdbPort; 700f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 701287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_NORMAL = 0; 702287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_CRASHED = 1; 703287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_EARLY_ANR = 2; 704287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_ANR = 3; 705287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 706287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mState; 707287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 708287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_DEFAULT = 0; 709287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 710287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_DIALOG = 0; 711287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_KILL = 1; 712287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 713287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_CONTINUE = 0; 714287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_KILL = 1; 715287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 716287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_DIALOG = 0; 717287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_KILL = 1; 718287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_WAIT = 1; 719287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 720287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mResult; 721287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 722f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Process mGdbProcess; 723f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Thread mGdbThread; 724f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn boolean mGotGdbPrint; 725f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 726f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController(String gdbPort) { 727f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbPort = gdbPort; 728f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 729f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 730287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 731287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityResuming(String pkg) throws RemoteException { 732287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 733287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity resuming: " + pkg); 734287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 735287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 736287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 737287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 738287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 739287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 740287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 741287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity starting: " + pkg); 742287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 743287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 744287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 745287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 746287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 747287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 748287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn long timeMillis, String stackTrace) throws RemoteException { 749287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 750287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS CRASHED"); 751287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 752287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 753287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("shortMsg: " + shortMsg); 754287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("longMsg: " + longMsg); 755287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("timeMillis: " + timeMillis); 756287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("stack:"); 757287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(stackTrace); 758287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 759f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_CRASHED); 760287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return result == RESULT_CRASH_KILL ? false : true; 761287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 762287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 763287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 764287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 765287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appEarlyNotResponding(String processName, int pid, String annotation) 766287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 767287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 768287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING"); 769287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 770287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 771287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("annotation: " + annotation); 772f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_EARLY_ANR); 773287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_EARLY_ANR_KILL) return -1; 774287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 775287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 776287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 777287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 778287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 779287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appNotResponding(String processName, int pid, String processStats) 780287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 781287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 782287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS NOT RESPONDING"); 783287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 784287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 785287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processStats:"); 786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(processStats); 787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 788f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_ANR); 789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_KILL) return -1; 790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_WAIT) return 1; 791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 793287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 794287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 795f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn void killGdbLocked() { 796f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = false; 797f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbProcess != null) { 798f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Stopping gdbserver"); 799f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.destroy(); 800f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = null; 801f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 802f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread != null) { 803f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.interrupt(); 804f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = null; 805f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 806f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 807f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 808f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int waitControllerLocked(int pid, int state) { 809f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbPort != null) { 810f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 811f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 812f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 813f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Starting gdbserver on port " + mGdbPort); 814f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Do the following:"); 815f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort); 816f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" gdbclient app_process :" + mGdbPort); 817f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 818f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = Runtime.getRuntime().exec(new String[] { 819f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid) 820f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }); 821f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final InputStreamReader converter = new InputStreamReader( 822f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.getInputStream()); 823f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = new Thread() { 824f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn @Override 825f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn public void run() { 826f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn BufferedReader in = new BufferedReader(converter); 827f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String line; 828f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int count = 0; 829f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while (true) { 830f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn synchronized (MyActivityController.this) { 831f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread == null) { 832f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 833f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 834f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (count == 2) { 835f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = true; 836f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController.this.notifyAll(); 837f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 838f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 839f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 840f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn line = in.readLine(); 841f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (line == null) { 842f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 843f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 844f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("GDB: " + line); 845f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn count++; 846f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 847f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 848f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 849f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 850f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 851f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }; 852f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.start(); 853f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 854f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn // Stupid waiting for .5s. Doesn't matter if we end early. 855f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 856f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn this.wait(500); 857f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (InterruptedException e) { 858f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 859f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 860f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 861f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Failure starting gdbserver: " + e); 862f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 863f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 864f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 865287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = state; 866287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 867287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 868287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 869287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while (mState != STATE_NORMAL) { 870287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 871287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn wait(); 872287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (InterruptedException e) { 873287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 874287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 875287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 876f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 877f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 878287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mResult; 879287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 880287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 881287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void resumeController(int result) { 882287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 883287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 884287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mResult = result; 885287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn notifyAll(); 886287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 887287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 888287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 889287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void printMessageForState() { 890287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn switch (mState) { 891287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_NORMAL: 892287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Monitoring activity manager... available commands:"); 893287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 894287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_CRASHED: 895287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after crash... available commands:"); 896287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show crash dialog"); 897287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 898287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 899287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_EARLY_ANR: 900287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after early ANR... available commands:"); 901287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: standard ANR processing"); 902287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 903287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 904287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_ANR: 905287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after ANR... available commands:"); 906287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show ANR dialog"); 907287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 908287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(w)ait: wait some more"); 909287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 910287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 911287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(q)uit: finish monitoring"); 912287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 913287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 914287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void run() throws RemoteException { 915287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 916287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 917287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 918287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(this); 919287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 920287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 921287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn InputStreamReader converter = new InputStreamReader(System.in); 922287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn BufferedReader in = new BufferedReader(converter); 923287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn String line; 924287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 925287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while ((line = in.readLine()) != null) { 926287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn boolean addNewline = true; 927287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (line.length() <= 0) { 928287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn addNewline = false; 929287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("q".equals(line) || "quit".equals(line)) { 930287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_DEFAULT); 931287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 932287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_CRASHED) { 933287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 934287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_DIALOG); 935287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 936287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_KILL); 937287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 938287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 939287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 940287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_ANR) { 941287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_DIALOG); 943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_KILL); 945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("w".equals(line) || "wait".equals(line)) { 946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_WAIT); 947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 948287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 949287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 950287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_EARLY_ANR) { 951287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 952287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_CONTINUE); 953287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 954287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_KILL); 955287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 956287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 957287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 958287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 959287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 960287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 961287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 962287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 963287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (addNewline) { 964287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 965287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 966287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 967287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 968287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 969287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 970287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (IOException e) { 971287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn e.printStackTrace(); 972287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } finally { 973287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(null); 974287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 975287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 976287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 977287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 978287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private void runMonitor() throws Exception { 979f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String opt; 980f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String gdbPort = null; 981f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while ((opt=nextOption()) != null) { 982f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (opt.equals("--gdb")) { 983f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn gdbPort = nextArgRequired(); 984f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } else { 985f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 986f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn showUsage(); 987f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 988f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 989f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 990f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 991f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController controller = new MyActivityController(gdbPort); 992287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn controller.run(); 993287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 994287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 995e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn private void runScreenCompat() throws Exception { 996e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String mode = nextArgRequired(); 997e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn boolean enabled; 998e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if ("on".equals(mode)) { 999e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = true; 1000e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if ("off".equals(mode)) { 1001e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = false; 1002e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 1003e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode); 1004e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn showUsage(); 1005e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return; 1006e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1007e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1008e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String packageName = nextArgRequired(); 1009e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn do { 1010e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn try { 10110f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mAm.setPackageScreenCompatMode(packageName, enabled 10120f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ? ActivityManager.COMPAT_MODE_ENABLED 10130f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn : ActivityManager.COMPAT_MODE_DISABLED); 1014e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } catch (RemoteException e) { 1015e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1016e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn packageName = nextArg(); 1017e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } while (packageName != null); 1018e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1019e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 10207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void runDisplaySize() throws Exception { 10217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String size = nextArgRequired(); 10227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int m, n; 10237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if ("reset".equals(size)) { 10247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n = -1; 10257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 10267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int div = size.indexOf('x'); 10277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 10287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad size " + size); 10297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn showUsage(); 10307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 10317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String mstr = size.substring(0, div); 10337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String nstr = size.substring(div+1); 10347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 10357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = Integer.parseInt(mstr); 10367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = Integer.parseInt(nstr); 10377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (NumberFormatException e) { 10387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad number " + e); 10397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn showUsage(); 10407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 10417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 10447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m < n) { 10457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int tmp = m; 10467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n; 10477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = tmp; 10487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 10507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 10517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Context.WINDOW_SERVICE)); 10527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wm == null) { 10537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 10547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 10557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 10577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 10587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m >= 0 && n >= 0) { 10597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn wm.setForcedDisplaySize(m, n); 10607916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 10617916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn wm.clearForcedDisplaySize(); 10627916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10637916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (RemoteException e) { 1064351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 10657916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 10667916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 10679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 10689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 10699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 10709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void performReceive( 107168d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn Intent intent, int rc, String data, Bundle ext, boolean ord, 107268d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn boolean sticky) { 10739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String line = "Broadcast completed: result=" + rc; 10749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 10759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (ext != null) line = line + ", extras: " + ext; 10769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 10779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mFinished = true; 10789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor notifyAll(); 10799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 10809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 10819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 10849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 10859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 10939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1095305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 11589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 11679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 11689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 11699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 11709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 11979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 11989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 11999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 12009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 12019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 12029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 12089f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 12099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 12109f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 12119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 12179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 12189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 12192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" + 12202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " [--R COUNT] [-S] <INTENT>\n" + 122146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am startservice <INTENT>\n" + 122246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am force-stop <PACKAGE>\n" + 1223e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " am kill <PACKAGE>\n" + 1224e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " am kill-all\n" + 122546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am broadcast <INTENT>\n" + 122662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" + 122746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--no-window-animation] <COMPONENT>\n" + 12287eabe55db6b113f83c2cefcd06812648927de877Romain Guy " am profile [looper] start <PROCESS> <FILE>\n" + 122962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am profile [looper] stop [<PROCESS>]\n" + 123046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am dumpheap [flags] <PROCESS> <FILE>\n" + 1231d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am set-debug-app [-w] [--persistent] <PACKAGE>\n" + 1232d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am clear-debug-app\n" + 123346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am monitor [--gdb <port>]\n" + 123446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am screen-compat [on|off] <PACKAGE>\n" + 123546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am display-size [reset|MxN]\n" + 12369f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 123746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am start: start an Activity. Options are:\n" + 123846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -D: enable debugging\n" + 123946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -W: wait for launch to complete\n" + 124062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " --start-profiler <FILE>: start profiler and send results to <FILE>\n" + 124162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " -P <FILE>: like above, but profiling stops when app goes idle\n" + 12422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" + 12432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " the top activity will be finished.\n" + 12440bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " -S: force stop the target app before starting the activity\n" + 12459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 124646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am startservice: start a Service.\n" + 12476fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker "\n" + 124846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am force-stop: force stop everything associated with <PACKAGE>.\n" + 1249351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang "\n" + 1250e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill: Kill all processes associated with <PACKAGE>. Only kills.\n" + 1251e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " processes that are safe to kill -- that is, will not impact the user\n" + 1252e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " experience.\n" + 1253e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 1254e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill-all: Kill all background processes.\n" + 1255e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 125646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am broadcast: send a broadcast Intent.\n" + 12579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 125846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" + 125946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" + 126046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with\n" + 126146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e perf true] to generate raw output for performance measurements.\n" + 126246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a\n" + 126346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " common form is [-e <testrunner_flag> <value>[,<value>...]].\n" + 126446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -p <FILE>: write profiling data to <FILE>\n" + 126546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -w: wait for instrumentation to finish before returning. Required for\n" + 126646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " test runners.\n" + 126746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --no-window-animation: turn off window animations will running.\n" + 12689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 126946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am profile: start and stop profiler on a process.\n" + 1270f9b5eed81d690ab8f336cb3345b46a36e278f180Joe Malin "\n" + 127146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am dumpheap: dump the heap of a process. Options are:\n" + 127246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -n: dump native heap instead of managed heap\n" + 12739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 1274d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am set-debug-app: set application <PACKAGE> to debug. Options are:\n" + 1275d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " -w: wait for debugger when application starts\n" + 1276d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " --persistent: retain this value\n" + 1277d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 1278d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am clear-debug-app: clear the previously set-debug-app.\n" + 1279d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 128046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am monitor: start monitoring for crashes or ANRs.\n" + 128146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --gdb: start gdbserv on the given port at crash/ANR\n" + 1282287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn "\n" + 128346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + 1284e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn "\n" + 128546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am display-size: override display size.\n" + 12867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "\n" + 128746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "<INTENT> specifications include these flags and arguments:\n" + 128846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 128946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 129046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 129146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--esn <EXTRA_KEY> ...]\n" + 129246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 129346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 129446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 12958ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu " [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" + 129646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" + 129746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" + 129846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 129946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 130046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--debug-log-resolution] [--exclude-stopped-packages]\n" + 130146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--include-stopped-packages]\n" + 130246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 130346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 130446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 130546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 130646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 130746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 130846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-single-top] [--activity-clear-task]\n" + 130946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-task-on-home]\n" + 131046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 13110bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " [<URI> | <PACKAGE> | <COMPONENT>]\n" 13129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1315