Am.java revision 80a4af2bbc6af42ae605e454bf89558e564f5244
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; 4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.BufferedReader; 449c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.File; 459c8dd55a9d829c29a3feee9469d8c2f27a9f5516Dianne Hackbornimport java.io.FileNotFoundException; 46287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.IOException; 47287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport java.io.InputStreamReader; 488f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackbornimport java.io.PrintStream; 499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnorimport java.net.URISyntaxException; 500bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.HashSet; 510bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackbornimport java.util.List; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Am { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IActivityManager mAm; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mArgs; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNextArg; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCurArgData; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn private int mStartFlags = 0; 618f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn private boolean mWaitOption = false; 620bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn private boolean mStopOption = false; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn private int mRepeat = 0; 65483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private int mUserId = 0; 662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 6762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn private String mProfileFile; 6862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 699f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor // These are magic strings understood by the Eclipse plugin. 709f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String FATAL_ERROR_CODE = "Error type 1"; 719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; 729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static final String NO_CLASS_ERROR_CODE = "Error type 3"; 739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command-line entry point. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args The command-line arguments 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void main(String[] args) { 809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor (new Am()).run(args); 829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (IllegalArgumentException e) { 839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor showUsage(); 849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: " + e.getMessage()); 859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (Exception e) { 860bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn e.printStackTrace(System.err); 879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.exit(1); 889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void run(String[] args) throws Exception { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args.length < 1) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showUsage(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAm = ActivityManagerNative.getDefault(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAm == null) { 999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println(NO_SYSTEM_ERROR_CODE); 1009f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("Can't connect to activity manager; is the system running?"); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArgs = args; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String op = args[0]; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg = 1; 1069f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op.equals("start")) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runStart(); 1096fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } else if (op.equals("startservice")) { 1106fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker runStartService(); 111351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } else if (op.equals("force-stop")) { 112351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang runForceStop(); 113e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill")) { 114e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKill(); 115e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } else if (op.equals("kill-all")) { 116e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn runKillAll(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("instrument")) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runInstrument(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (op.equals("broadcast")) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendBroadcast(); 121f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project } else if (op.equals("profile")) { 122f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2The Android Open Source Project runProfile(); 123824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } else if (op.equals("dumpheap")) { 124824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden runDumpHeap(); 125d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("set-debug-app")) { 126d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runSetDebugApp(); 127d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (op.equals("clear-debug-app")) { 128d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn runClearDebugApp(); 129287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (op.equals("monitor")) { 130287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn runMonitor(); 131e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if (op.equals("screen-compat")) { 132e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn runScreenCompat(); 1337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (op.equals("display-size")) { 1347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn runDisplaySize(); 135dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else if (op.equals("display-density")) { 136dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn runDisplayDensity(); 137f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-uri")) { 138f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(false); 139f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (op.equals("to-intent-uri")) { 140f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn runToUri(true); 141483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (op.equals("switch-user")) { 142742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani runSwitchUser(); 14380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } else if (op.equals("stop-user")) { 14480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn runStopUser(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Unknown command: " + op); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private Intent makeIntent() throws URISyntaxException { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 152f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn Intent baseIntent = intent; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasIntentInfo = false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 155a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags = 0; 1568f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = false; 1570bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = false; 1582c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = 0; 1590bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mProfileFile = null; 160483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId = 0; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = null; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String type = null; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 1659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 1669f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-a")) { 1679f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setAction(nextArgRequired()); 168f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 169f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 170f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-d")) { 1729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor data = Uri.parse(nextArgRequired()); 173f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 174f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 175f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-t")) { 1779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor type = nextArgRequired(); 178f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 179f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 180f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-c")) { 1829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.addCategory(nextArgRequired()); 183f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 184f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 185f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e") || opt.equals("--es")) { 1879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, value); 190305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker } else if (opt.equals("--esn")) { 191305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker String key = nextArgRequired(); 192305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker intent.putExtra(key, (String) null); 1939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ei")) { 1949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 1959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 1969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Integer.valueOf(value)); 1978ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu } else if (opt.equals("--eu")) { 1988ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String key = nextArgRequired(); 1998ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu String value = nextArgRequired(); 2008ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu intent.putExtra(key, Uri.parse(value)); 2017df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn } else if (opt.equals("--ecn")) { 2027df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String key = nextArgRequired(); 2037df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn String value = nextArgRequired(); 2047df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn ComponentName cn = ComponentName.unflattenFromString(value); 2057df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn if (cn == null) throw new IllegalArgumentException("Bad component name: " + value); 2067df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn intent.putExtra(key, cn); 2072d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--eia")) { 2082d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 2092d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 2102d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 2112d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra int[] list = new int[strings.length]; 2122d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 2132d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Integer.valueOf(strings[i]); 2142d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 2152d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 2166a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki } else if (opt.equals("--el")) { 2176a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String key = nextArgRequired(); 2186a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki String value = nextArgRequired(); 2196a69b4fbaee9a8251401453cd2d3509d52f5b91cMakoto Onuki intent.putExtra(key, Long.valueOf(value)); 2202d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } else if (opt.equals("--ela")) { 2212d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String key = nextArgRequired(); 2222d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String value = nextArgRequired(); 2232d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra String[] strings = value.split(","); 2242d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra long[] list = new long[strings.length]; 2252d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra for (int i = 0; i < strings.length; i++) { 2262d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra list[i] = Long.valueOf(strings[i]); 2272d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra } 2282d1b7a22390a355aa079473810e2b9914af88274Jack Veenstra intent.putExtra(key, list); 2293a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2303a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--ef")) { 2313a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 2323a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 2333a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, Float.valueOf(value)); 2343a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2353a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } else if (opt.equals("--efa")) { 2363a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String key = nextArgRequired(); 2373a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String value = nextArgRequired(); 2383a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen String[] strings = value.split(","); 2393a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen float[] list = new float[strings.length]; 2403a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen for (int i = 0; i < strings.length; i++) { 2413a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen list[i] = Float.valueOf(strings[i]); 2423a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen } 2433a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen intent.putExtra(key, list); 2443a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen hasIntentInfo = true; 2459f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("--ez")) { 2469f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String key = nextArgRequired(); 2479f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String value = nextArgRequired(); 2489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.putExtra(key, Boolean.valueOf(value)); 2499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-n")) { 2509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ComponentName cn = ComponentName.unflattenFromString(str); 2529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + str); 2539f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setComponent(cn); 254f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (intent == baseIntent) { 255f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn hasIntentInfo = true; 256f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 2579f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-f")) { 2589f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String str = nextArgRequired(); 2599f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor intent.setFlags(Integer.decode(str).intValue()); 2605ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-read-uri-permission")) { 2615ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2625ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--grant-write-uri-permission")) { 2635ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 26446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--exclude-stopped-packages")) { 26546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); 26646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--include-stopped-packages")) { 26746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 2685ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--debug-log-resolution")) { 2695ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); 2705ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-brought-to-front")) { 2715ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 2725ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-top")) { 2735ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 2745ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-clear-when-task-reset")) { 2755ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 2765ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-exclude-from-recents")) { 2775ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 2785ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-launched-from-history")) { 2795ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 2805ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-multiple-task")) { 2815ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 2825ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-animation")) { 2835ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 2845ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-history")) { 2855ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 2865ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-no-user-action")) { 2875ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 2885ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-previous-is-top")) { 2895ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 2905ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reorder-to-front")) { 2915ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 2925ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-reset-task-if-needed")) { 2935ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 2945ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--activity-single-top")) { 2955ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 29646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-clear-task")) { 29746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 29846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--activity-task-on-home")) { 29946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); 3005ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-registered-only")) { 3015ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 3025ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } else if (opt.equals("--receiver-replace-pending")) { 3035ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 304f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (opt.equals("--selector")) { 305f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.setDataAndType(data, type); 306f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = new Intent(); 3079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-D")) { 308a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_DEBUG; 3098f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } else if (opt.equals("-W")) { 3108f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn mWaitOption = true; 31162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("-P")) { 31262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 313a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 31462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } else if (opt.equals("--start-profiler")) { 31562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mProfileFile = nextArgRequired(); 316a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags &= ~ActivityManager.START_FLAG_AUTO_STOP_PROFILER; 3172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (opt.equals("-R")) { 3182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat = Integer.parseInt(nextArgRequired()); 3190bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (opt.equals("-S")) { 3200bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mStopOption = true; 32192a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy } else if (opt.equals("--opengl-trace")) { 322a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn mStartFlags |= ActivityManager.START_FLAG_OPENGL_TRACES; 323483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (opt.equals("--user")) { 324483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId = Integer.parseInt(nextArgRequired()); 3259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 3269f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 3279f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return null; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setDataAndType(data, type); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 332f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn final boolean hasSelector = intent != baseIntent; 333f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 334f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // A selector was specified; fix up. 335f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setSelector(intent); 336f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent = baseIntent; 337f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 338f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 3390bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String arg = nextArg(); 340f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = null; 341f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (arg == null) { 342f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (hasSelector) { 343f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // If a selector has been specified, and no arguments 344f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // have been supplied for the main Intent, then we can 345f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // assume it is ACTION_MAIN CATEGORY_LAUNCHER; we don't 346f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // need to have a component name specified yet, the 347f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // selector will take care of that. 3480bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 3490bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 3509f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 351f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf(':') >= 0) { 352f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a URI. Fully parse it, and use that result 353f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // to fill in any data not specified so far. 354f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME); 355f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else if (arg.indexOf('/') >= 0) { 356f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // The argument is a component name. Build an Intent to launch 357f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // it. 358f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 359f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 360f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setComponent(ComponentName.unflattenFromString(arg)); 361f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } else { 362f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn // Assume the argument is a package name. 363f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent = new Intent(Intent.ACTION_MAIN); 364f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.addCategory(Intent.CATEGORY_LAUNCHER); 365f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn baseIntent.setPackage(arg); 366f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 367f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn if (baseIntent != null) { 3680bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle extras = intent.getExtras(); 3690bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras((Bundle)null); 3700bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn Bundle uriExtras = baseIntent.getExtras(); 3710bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.replaceExtras((Bundle)null); 3720bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (intent.getAction() != null && baseIntent.getCategories() != null) { 3730bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn HashSet<String> cats = new HashSet<String>(baseIntent.getCategories()); 3740bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn for (String c : cats) { 3750bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn baseIntent.removeCategory(c); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 378f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn intent.fillIn(baseIntent, Intent.FILL_IN_COMPONENT | Intent.FILL_IN_SELECTOR); 3790bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (extras == null) { 3800bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3810bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } else if (uriExtras != null) { 3820bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn uriExtras.putAll(extras); 3830bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn extras = uriExtras; 3840bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 3850bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn intent.replaceExtras(extras); 3869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor hasIntentInfo = true; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied"); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3936fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker private void runStartService() throws Exception { 3946fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker Intent intent = makeIntent(); 3956fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.out.println("Starting service: " + intent); 3967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ComponentName cn = mAm.startService(null, intent, intent.getType(), 0); 3976fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker if (cn == null) { 3986fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker System.err.println("Error: Not found; no service started."); 3996fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 4006fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker } 4016fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker 4029f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runStart() throws Exception { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 4040bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 4050bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn String mimeType = intent.getType(); 4060bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn if (mimeType == null && intent.getData() != null 4070bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn && "content".equals(intent.getData().getScheme())) { 4080bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn mimeType = mAm.getProviderMimeType(intent.getData()); 4090bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 4100bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn 4112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn do { 4122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mStopOption) { 4132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn String packageName; 4142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (intent.getComponent() != null) { 4152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = intent.getComponent().getPackageName(); 4162c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 4172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IPackageManager pm = IPackageManager.Stub.asInterface( 4182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ServiceManager.getService("package")); 4192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (pm == null) { 4202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Package manager not running; aborting"); 4212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4222c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 423483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<ResolveInfo> activities = pm.queryIntentActivities(intent, mimeType, 0, 424483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId); 4252c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (activities == null || activities.size() <= 0) { 4262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent does not match any activities: " 4272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 4282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else if (activities.size() > 1) { 4302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Intent matches multiple activities; can't stop: " 4312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + intent); 4322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn return; 4332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn packageName = activities.get(0).activityInfo.packageName; 4350bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 4362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Stopping: " + packageName); 4372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.forceStopPackage(packageName); 4382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn Thread.sleep(250); 4392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 4402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Starting: " + intent); 4422c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4442c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor fd = null; 4452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn 4462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mProfileFile != null) { 4472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn try { 4482c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn fd = ParcelFileDescriptor.open( 4492c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn new File(mProfileFile), 4502c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_CREATE | 4512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_TRUNCATE | 4522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn ParcelFileDescriptor.MODE_READ_WRITE); 4532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } catch (FileNotFoundException e) { 4542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.err.println("Error: Unable to open file: " + mProfileFile); 4550bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn return; 4560bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn } 45762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 45892a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy 4592c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn IActivityManager.WaitResult result = null; 4602c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn int res; 4612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption) { 4622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = mAm.startActivityAndWait(null, intent, mimeType, 463a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null); 4642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = result.result; 4652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } else { 4662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn res = mAm.startActivity(null, intent, mimeType, 467a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn null, null, 0, mStartFlags, mProfileFile, fd, null); 4688f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 4692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn PrintStream out = mWaitOption ? System.out : System.err; 4702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn boolean launched = false; 4712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn switch (res) { 472a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SUCCESS: 4732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 475a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_SWITCHES_CANCELED: 4762c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4772c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because the " 4792c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " current activity is being kept for the user."); 4802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 481a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_DELIVERED_TO_TOP: 4822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4832c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, intent has " 4852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "been delivered to currently running " 4862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "top-most instance."); 4872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 488a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_RETURN_INTENT_TO_CALLER: 4892c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4902c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4912c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started because intent " 4922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "should be handled by the caller"); 4932c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 494a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_TASK_TO_FRONT: 4952c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn launched = true; 4962c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 4972c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Warning: Activity not started, its current " 4982c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "task has been brought to the front"); 4992c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 500a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_INTENT_NOT_RESOLVED: 5012c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5022c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unable to " 5032c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "resolve " + intent.toString()); 5042c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 505a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_CLASS_NOT_FOUND: 5062c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println(NO_CLASS_ERROR_CODE); 5072c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println("Error: Activity class " + 5082c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn intent.getComponent().toShortString() 5092c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + " does not exist."); 5102c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 511a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: 5122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you requested to " 5142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "both forward and receive its result"); 5152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 516a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn case ActivityManager.START_PERMISSION_DENIED: 5172c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, you do not " 5192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn + "have permission to access it."); 5202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 5212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn default: 5222c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn out.println( 5232c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "Error: Activity not started, unknown error code " + res); 5242c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn break; 5258f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mWaitOption && launched) { 5272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result == null) { 5282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result = new IActivityManager.WaitResult(); 5292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn result.who = intent.getComponent(); 5302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Status: " + (result.timeout ? "timeout" : "ok")); 5322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.who != null) { 5332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Activity: " + result.who.flattenToShortString()); 5342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.thisTime >= 0) { 5362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("ThisTime: " + result.thisTime); 5372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (result.totalTime >= 0) { 5392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("TotalTime: " + result.totalTime); 5402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } 5412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn System.out.println("Complete"); 5428f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5432c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mRepeat--; 5442c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn if (mRepeat > 1) { 5452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn mAm.unhandledBack(); 5468f7f35e0ccd91c964b9d3eeef81ff829622dfa74Dianne Hackborn } 5472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn } while (mRepeat > 1); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 550351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang private void runForceStop() throws Exception { 551351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang mAm.forceStopPackage(nextArgRequired()); 552351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 553351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang 554e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKill() throws Exception { 555e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killBackgroundProcesses(nextArgRequired()); 556e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 557e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 558e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn private void runKillAll() throws Exception { 559e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn mAm.killAllBackgroundProcesses(); 560e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn } 561e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn 5629f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void sendBroadcast() throws Exception { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = makeIntent(); 5649f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor IntentReceiver receiver = new IntentReceiver(); 5659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println("Broadcasting: " + intent); 566742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false, 567483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mUserId); 5689f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor receiver.waitForFinish(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runInstrument() throws Exception { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String profileFile = null; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wait = false; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean rawMode = false; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean no_window_animation = false; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle args = new Bundle(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String argKey = null, argValue = null; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String opt; 5819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while ((opt=nextOption()) != null) { 5829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (opt.equals("-p")) { 5839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 5849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-w")) { 5859f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wait = true; 5869f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-r")) { 5879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor rawMode = true; 5889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (opt.equals("-e")) { 5899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argKey = nextArgRequired(); 5909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor argValue = nextArgRequired(); 5919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor args.putString(argKey, argValue); 59246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (opt.equals("--no_window_animation") 59346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn || opt.equals("--no-window-animation")) { 5949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor no_window_animation = true; 5959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 5969f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unknown option: " + opt); 5979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cnArg = nextArgRequired(); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName cn = ComponentName.unflattenFromString(cnArg); 6039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationWatcher watcher = null; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wait) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher = new InstrumentationWatcher(); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.setRawOutput(rawMode); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] oldAnims = null; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (no_window_animation) { 6129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor oldAnims = wm.getAnimationScales(); 6139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(0, 0.0f); 6149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScale(1, 0.0f); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher)) { 6189f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString()); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcher != null) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!watcher.waitForFinish()) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_ABORTED: System has crashed."); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldAnims != null) { 6289f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor wm.setAnimationScales(oldAnims); 6299f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 63246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn static void removeWallOption() { 63346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 63446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props != null && props.contains("-Xprofile:wallclock")) { 63546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.replace("-Xprofile:wallclock", ""); 63646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props.trim(); 63746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn SystemProperties.set("dalvik.vm.extra-opts", props); 63846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 63946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 64046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 6419f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private void runProfile() throws Exception { 6429f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String profileFile = null; 6439f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor boolean start = false; 64446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn boolean wall = false; 6457eabe55db6b113f83c2cefcd06812648927de877Romain Guy int profileType = 0; 64646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 64746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String process = null; 64846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 6499f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String cmd = nextArgRequired(); 6507eabe55db6b113f83c2cefcd06812648927de877Romain Guy 6519f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if ("start".equals(cmd)) { 6529f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor start = true; 65346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = "--wall".equals(nextOption()); 65446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = nextArgRequired(); 65546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if ("stop".equals(cmd)) { 65662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn process = nextArg(); 65746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else { 65846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // Compatibility with old syntax: process is specified first. 65946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn process = cmd; 66046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn cmd = nextArgRequired(); 66146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if ("start".equals(cmd)) { 66246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn start = true; 66346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (!"stop".equals(cmd)) { 66446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new IllegalArgumentException("Profile command " + process + " not valid"); 66546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 66646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 66746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 66846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn ParcelFileDescriptor fd = null; 66946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn 67046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (start) { 6719f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor profileFile = nextArgRequired(); 6729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor try { 6739f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor fd = ParcelFileDescriptor.open( 6749f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor new File(profileFile), 6759f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_CREATE | 6769f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_TRUNCATE | 6779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ParcelFileDescriptor.MODE_READ_WRITE); 6789f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (FileNotFoundException e) { 6799f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println("Error: Unable to open file: " + profileFile); 6809f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return; 6819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 6839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 68446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn try { 68546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (wall) { 68646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn // XXX doesn't work -- this needs to be set before booting. 68746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn String props = SystemProperties.get("dalvik.vm.extra-opts"); 68846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (props == null || !props.contains("-Xprofile:wallclock")) { 68946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn props = props + " -Xprofile:wallclock"; 69046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //SystemProperties.set("dalvik.vm.extra-opts", props); 69146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 69246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } else if (start) { 69346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 69446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 6957eabe55db6b113f83c2cefcd06812648927de877Romain Guy if (!mAm.profileControl(process, start, profileFile, fd, profileType)) { 69646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn wall = false; 69746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn throw new AndroidException("PROFILE FAILED on process " + process); 69846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 69946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } finally { 70046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn if (!wall) { 70146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn //removeWallOption(); 70246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn } 7039f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7049f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 7059f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 706824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden private void runDumpHeap() throws Exception { 707824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden boolean managed = !"-n".equals(nextOption()); 708824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String process = nextArgRequired(); 709824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden String heapFile = nextArgRequired(); 710824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor fd = null; 711824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 712824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden try { 713824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden fd = ParcelFileDescriptor.open( 714824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden new File(heapFile), 715824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_CREATE | 716824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_TRUNCATE | 717824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden ParcelFileDescriptor.MODE_READ_WRITE); 718824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } catch (FileNotFoundException e) { 719824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden System.err.println("Error: Unable to open file: " + heapFile); 720824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden return; 721824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 722824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 723824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden if (!mAm.dumpHeap(process, managed, heapFile, fd)) { 724824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden throw new AndroidException("HEAP DUMP FAILED on process " + process); 725824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 726824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden } 727824c510752fd6a30cdba5ed7324cb80a5043ce26Andy McFadden 728d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runSetDebugApp() throws Exception { 729d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean wait = false; 730d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn boolean persistent = false; 731d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 732d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String opt; 733d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn while ((opt=nextOption()) != null) { 734d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn if (opt.equals("-w")) { 735d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn wait = true; 736d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else if (opt.equals("--persistent")) { 737d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn persistent = true; 738d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } else { 739d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 740d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn return; 741d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 742d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 743d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 744d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn String pkg = nextArgRequired(); 745d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(pkg, wait, persistent); 746d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 747d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 748d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn private void runClearDebugApp() throws Exception { 749d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn mAm.setDebugApp(null, false, true); 750d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn } 751d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn 752742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private void runSwitchUser() throws Exception { 753742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani String user = nextArgRequired(); 754742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mAm.switchUser(Integer.parseInt(user)); 755742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 756742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 75780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn private void runStopUser() throws Exception { 75880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String user = nextArgRequired(); 75980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn int res = mAm.stopUser(Integer.parseInt(user), null); 76080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn if (res != ActivityManager.USER_OP_SUCCESS) { 76180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn String txt = ""; 76280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn switch (res) { 76380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_IS_CURRENT: 76480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Can't stop current user)"; 76580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 76680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn case ActivityManager.USER_OP_UNKNOWN_USER: 76780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn txt = " (Unknown user " + user + ")"; 76880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn break; 76980a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 77080a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn System.err.println("Switch failed: " + res + txt); 77180a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 77280a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn } 77380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn 774287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn class MyActivityController extends IActivityController.Stub { 775f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final String mGdbPort; 776f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 777287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_NORMAL = 0; 778287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_CRASHED = 1; 779287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_EARLY_ANR = 2; 780287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int STATE_ANR = 3; 781287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 782287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mState; 783287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 784287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_DEFAULT = 0; 785287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_DIALOG = 0; 787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_CRASH_KILL = 1; 788287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_CONTINUE = 0; 790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_EARLY_ANR_KILL = 1; 791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_DIALOG = 0; 793287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_KILL = 1; 794287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int RESULT_ANR_WAIT = 1; 795287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 796287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn int mResult; 797287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 798f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Process mGdbProcess; 799f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn Thread mGdbThread; 800f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn boolean mGotGdbPrint; 801f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 802f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController(String gdbPort) { 803f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbPort = gdbPort; 804f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 805f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 806287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 807287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityResuming(String pkg) throws RemoteException { 808287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 809287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity resuming: " + pkg); 810287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 811287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 812287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 813287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 814287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 815287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 816287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 817287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** Activity starting: " + pkg); 818287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 819287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return true; 820287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 821287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 822287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 823287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 824287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn long timeMillis, String stackTrace) throws RemoteException { 825287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 826287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS CRASHED"); 827287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 828287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 829287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("shortMsg: " + shortMsg); 830287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("longMsg: " + longMsg); 831287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("timeMillis: " + timeMillis); 832287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("stack:"); 833287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(stackTrace); 834287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 835f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_CRASHED); 836287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return result == RESULT_CRASH_KILL ? false : true; 837287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 838287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 839287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 840287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 841287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appEarlyNotResponding(String processName, int pid, String annotation) 842287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 843287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 844287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: EARLY PROCESS NOT RESPONDING"); 845287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 846287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 847287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("annotation: " + annotation); 848f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_EARLY_ANR); 849287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_EARLY_ANR_KILL) return -1; 850287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 851287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 852287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 853287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 854287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn @Override 855287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int appNotResponding(String processName, int pid, String processStats) 856287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn throws RemoteException { 857287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 858287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("** ERROR: PROCESS NOT RESPONDING"); 859287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processName: " + processName); 860287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processPid: " + pid); 861287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("processStats:"); 862287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.print(processStats); 863287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("#"); 864f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int result = waitControllerLocked(pid, STATE_ANR); 865287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_KILL) return -1; 866287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (result == RESULT_ANR_WAIT) return 1; 867287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return 0; 868287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 869287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 870287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 871f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn void killGdbLocked() { 872f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = false; 873f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbProcess != null) { 874f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Stopping gdbserver"); 875f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.destroy(); 876f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = null; 877f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 878f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread != null) { 879f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.interrupt(); 880f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = null; 881f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 882f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 883f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 884f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int waitControllerLocked(int pid, int state) { 885f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbPort != null) { 886f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 887f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 888f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 889f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Starting gdbserver on port " + mGdbPort); 890f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("Do the following:"); 891f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" adb forward tcp:" + mGdbPort + " tcp:" + mGdbPort); 892f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println(" gdbclient app_process :" + mGdbPort); 893f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 894f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess = Runtime.getRuntime().exec(new String[] { 895f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn "gdbserver", ":" + mGdbPort, "--attach", Integer.toString(pid) 896f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }); 897f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn final InputStreamReader converter = new InputStreamReader( 898f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbProcess.getInputStream()); 899f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread = new Thread() { 900f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn @Override 901f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn public void run() { 902f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn BufferedReader in = new BufferedReader(converter); 903f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String line; 904f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn int count = 0; 905f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while (true) { 906f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn synchronized (MyActivityController.this) { 907f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (mGdbThread == null) { 908f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 909f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 910f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (count == 2) { 911f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGotGdbPrint = true; 912f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController.this.notifyAll(); 913f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 914f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 915f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 916f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn line = in.readLine(); 917f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (line == null) { 918f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 919f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 920f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.out.println("GDB: " + line); 921f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn count++; 922f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 923f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 924f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 925f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 926f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 927f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn }; 928f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn mGdbThread.start(); 929f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 930f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn // Stupid waiting for .5s. Doesn't matter if we end early. 931f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn try { 932f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn this.wait(500); 933f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (InterruptedException e) { 934f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 935f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 936f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } catch (IOException e) { 937f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Failure starting gdbserver: " + e); 938f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 939f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 940f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 941287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = state; 942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while (mState != STATE_NORMAL) { 946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn wait(); 948287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (InterruptedException e) { 949287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 950287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 951287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 952f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn killGdbLocked(); 953f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 954287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mResult; 955287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 956287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 957287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void resumeController(int result) { 958287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 959287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 960287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mResult = result; 961287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn notifyAll(); 962287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 963287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 964287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 965287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void printMessageForState() { 966287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn switch (mState) { 967287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_NORMAL: 968287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Monitoring activity manager... available commands:"); 969287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 970287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_CRASHED: 971287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after crash... available commands:"); 972287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show crash dialog"); 973287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 974287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 975287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_EARLY_ANR: 976287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after early ANR... available commands:"); 977287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: standard ANR processing"); 978287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 979287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 980287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn case STATE_ANR: 981287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Waiting after ANR... available commands:"); 982287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(c)ontinue: show ANR dialog"); 983287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(k)ill: immediately kill app"); 984287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(w)ait: wait some more"); 985287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 986287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 987287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("(q)uit: finish monitoring"); 988287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 989287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 990287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void run() throws RemoteException { 991287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn try { 992287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 993287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 994287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(this); 995287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mState = STATE_NORMAL; 996287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 997287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn InputStreamReader converter = new InputStreamReader(System.in); 998287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn BufferedReader in = new BufferedReader(converter); 999287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn String line; 1000287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1001287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn while ((line = in.readLine()) != null) { 1002287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn boolean addNewline = true; 1003287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (line.length() <= 0) { 1004287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn addNewline = false; 1005287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("q".equals(line) || "quit".equals(line)) { 1006287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_DEFAULT); 1007287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn break; 1008287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_CRASHED) { 1009287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1010287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_DIALOG); 1011287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1012287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_CRASH_KILL); 1013287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1014287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1015287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1016287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_ANR) { 1017287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1018287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_DIALOG); 1019287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1020287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_KILL); 1021287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("w".equals(line) || "wait".equals(line)) { 1022287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_ANR_WAIT); 1023287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1024287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1025287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1026287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (mState == STATE_EARLY_ANR) { 1027287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if ("c".equals(line) || "continue".equals(line)) { 1028287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_CONTINUE); 1029287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if ("k".equals(line) || "kill".equals(line)) { 1030287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn resumeController(RESULT_EARLY_ANR_KILL); 1031287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1032287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1033287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1034287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 1035287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println("Invalid command: " + line); 1036287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1037287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1038287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn synchronized (this) { 1039287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (addNewline) { 1040287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn System.out.println(""); 1041287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1042287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn printMessageForState(); 1043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1045287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } catch (IOException e) { 1047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn e.printStackTrace(); 1048287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } finally { 1049287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mAm.setActivityController(null); 1050287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1051287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1052287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1053287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1054287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private void runMonitor() throws Exception { 1055f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String opt; 1056f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn String gdbPort = null; 1057f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn while ((opt=nextOption()) != null) { 1058f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn if (opt.equals("--gdb")) { 1059f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn gdbPort = nextArgRequired(); 1060f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } else { 1061f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn System.err.println("Error: Unknown option: " + opt); 1062f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn return; 1063f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1064f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn } 1065f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn 1066f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn MyActivityController controller = new MyActivityController(gdbPort); 1067287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn controller.run(); 1068287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1069287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1070e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn private void runScreenCompat() throws Exception { 1071e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String mode = nextArgRequired(); 1072e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn boolean enabled; 1073e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if ("on".equals(mode)) { 1074e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = true; 1075e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else if ("off".equals(mode)) { 1076e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn enabled = false; 1077e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } else { 1078e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn System.err.println("Error: enabled mode must be 'on' or 'off' at " + mode); 1079e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return; 1080e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1081e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 1082e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn String packageName = nextArgRequired(); 1083e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn do { 1084e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn try { 10850f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn mAm.setPackageScreenCompatMode(packageName, enabled 10860f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn ? ActivityManager.COMPAT_MODE_ENABLED 10870f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn : ActivityManager.COMPAT_MODE_DISABLED); 1088e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } catch (RemoteException e) { 1089e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1090e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn packageName = nextArg(); 1091e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } while (packageName != null); 1092e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn } 1093e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 10947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void runDisplaySize() throws Exception { 10957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String size = nextArgRequired(); 10967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int m, n; 10977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if ("reset".equals(size)) { 10987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n = -1; 10997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 11007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int div = size.indexOf('x'); 11017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (div <= 0 || div >= (size.length()-1)) { 11027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad size " + size); 11037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 11047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String mstr = size.substring(0, div); 11067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn String nstr = size.substring(div+1); 11077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 11087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = Integer.parseInt(mstr); 11097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = Integer.parseInt(nstr); 11107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (NumberFormatException e) { 11117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println("Error: bad number " + e); 11127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return; 11137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 11167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m < n) { 11177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int tmp = m; 11187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn m = n; 11197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn n = tmp; 11207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 11227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 11237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Context.WINDOW_SERVICE)); 11247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wm == null) { 11257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 11267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 11277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 11297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 11307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (m >= 0 && n >= 0) { 113159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // TODO(multidisplay): For now Configuration only applies to main screen. 113259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner wm.setForcedDisplaySize(Display.DEFAULT_DISPLAY, m, n); 11337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 113459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner wm.clearForcedDisplaySize(Display.DEFAULT_DISPLAY); 11357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (RemoteException e) { 1137351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang } 11387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 11397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 1140dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn private void runDisplayDensity() throws Exception { 1141dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn String densityStr = nextArgRequired(); 1142dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int density; 1143dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if ("reset".equals(densityStr)) { 1144dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn density = -1; 1145dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else { 1146dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn try { 1147dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn density = Integer.parseInt(densityStr); 1148dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } catch (NumberFormatException e) { 1149dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println("Error: bad number " + e); 1150dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return; 1151dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1152dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (density < 72) { 1153dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println("Error: density must be >= 72"); 1154dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn return; 1155dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1156dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1157dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1158dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.checkService( 1159dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn Context.WINDOW_SERVICE)); 1160dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (wm == null) { 1161dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn System.err.println(NO_SYSTEM_ERROR_CODE); 1162dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn throw new AndroidException("Can't connect to window manager; is the system running?"); 1163dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1164dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1165dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn try { 1166dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn if (density > 0) { 1167dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn // TODO(multidisplay): For now Configuration only applies to main screen. 1168dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn wm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); 1169dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } else { 1170dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn wm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); 1171dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1172dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } catch (RemoteException e) { 1173dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1174dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn } 1175dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn 1176f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn private void runToUri(boolean intentScheme) throws Exception { 1177f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn Intent intent = makeIntent(); 1178f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn System.out.println(intent.toUri(intentScheme ? Intent.URI_INTENT_SCHEME : 0)); 1179f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn } 1180f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn 11819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private class IntentReceiver extends IIntentReceiver.Stub { 11829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private boolean mFinished = false; 11839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 11849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void performReceive( 118568d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn Intent intent, int rc, String data, Bundle ext, boolean ord, 118668d881cf2d2b252f6f795cd64d43e316a1d736e5Dianne Hackborn boolean sticky) { 11879f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String line = "Broadcast completed: result=" + rc; 11889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (data != null) line = line + ", data=\"" + data + "\""; 11899f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (ext != null) line = line + ", extras: " + ext; 11909f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.out.println(line); 11919f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mFinished = true; 11929f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor notifyAll(); 11939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 11949f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 11959f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor public synchronized void waitForFinish() { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11979f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor while (!mFinished) wait(); 11989f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } catch (InterruptedException e) { 11999f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class InstrumentationWatcher extends IInstrumentationWatcher.Stub { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFinished = false; 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRawMode = false; 12079f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209305e1b8fe926430e63d167ebed0c1f4d191ebcdcDoug Zongker * Set or reset "raw mode". In "raw mode", all bundles are dumped. In "pretty mode", 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if a bundle includes Instrumentation.REPORT_KEY_STREAMRESULT, just print that. 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawMode true for raw mode, false for pretty mode. 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setRawOutput(boolean rawMode) { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRawMode = rawMode; 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) { 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.print(pretty); 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_STATUS_CODE: " + resultCode); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void instrumentationFinished(ComponentName name, int resultCode, 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle results) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pretty printer mode? 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pretty = null; 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRawMode && results != null) { 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pretty = results.getString(Instrumentation.REPORT_KEY_STREAMRESULT); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pretty != null) { 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(pretty); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results != null) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String key : results.keySet()) { 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println( 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key)); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("INSTRUMENTATION_CODE: " + resultCode); 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinished = true; 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean waitForFinish() { 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!mFinished) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAm.asBinder().pingBinder()) { 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(1000); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 12729f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalStateException(e); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String nextOption() { 12819f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (mCurArgData != null) { 12829f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 12839f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); 12849f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNextArg >= mArgs.length) { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String arg = mArgs[mNextArg]; 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!arg.startsWith("-")) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextArg++; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.equals("--")) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 1 && arg.charAt(1) != '-') { 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (arg.length() > 2) { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = arg.substring(2); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg.substring(0, 2); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurArgData = null; 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13099f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArg() { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurArgData != null) { 13119f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = mCurArgData; 13129f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor mCurArgData = null; 13139f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return arg; 13149f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else if (mNextArg < mArgs.length) { 13159f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor return mArgs[mNextArg++]; 13169f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor } else { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13219f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private String nextArgRequired() { 13229f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String arg = nextArg(); 13239f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor if (arg == null) { 13249f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor String prev = mArgs[mNextArg - 1]; 13259f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return arg; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13309f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor private static void showUsage() { 13319f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor System.err.println( 13329f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "usage: am [subcommand] [options]\n" + 13332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn "usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]\n" + 133492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy " [--R COUNT] [-S] [--opengl-trace] <INTENT>\n" + 133546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am startservice <INTENT>\n" + 133646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am force-stop <PACKAGE>\n" + 1337e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " am kill <PACKAGE>\n" + 1338e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " am kill-all\n" + 133946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am broadcast <INTENT>\n" + 134062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]\n" + 134146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--no-window-animation] <COMPONENT>\n" + 134213b907353f18215b52b5ceda24bbf520d91d72a1Romain Guy " am profile start <PROCESS> <FILE>\n" + 134313b907353f18215b52b5ceda24bbf520d91d72a1Romain Guy " am profile stop [<PROCESS>]\n" + 134446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am dumpheap [flags] <PROCESS> <FILE>\n" + 1345d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am set-debug-app [-w] [--persistent] <PACKAGE>\n" + 1346d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " am clear-debug-app\n" + 134746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am monitor [--gdb <port>]\n" + 134846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am screen-compat [on|off] <PACKAGE>\n" + 134946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " am display-size [reset|MxN]\n" + 1350dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn " am display-density [reset|DENSITY]\n" + 1351f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " am to-uri [INTENT]\n" + 1352f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " am to-intent-uri [INTENT]\n" + 13537e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn " am switch-user <USER_ID>\n" + 135480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " am stop-user <USER_ID>\n" + 13559f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 135646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am start: start an Activity. Options are:\n" + 135746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -D: enable debugging\n" + 135846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -W: wait for launch to complete\n" + 135962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " --start-profiler <FILE>: start profiler and send results to <FILE>\n" + 136062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn " -P <FILE>: like above, but profiling stops when app goes idle\n" + 13612c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " -R: repeat the activity launch <COUNT> times. Prior to each repeat,\n" + 13622c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn " the top activity will be finished.\n" + 13630bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " -S: force stop the target app before starting the activity\n" + 136492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy " --opengl-trace: enable tracing of OpenGL functions\n" + 13659f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 136646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am startservice: start a Service.\n" + 13676fb35fe1accfbdcbf0252e55cf7ef823c12f4c05Doug Zongker "\n" + 136846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am force-stop: force stop everything associated with <PACKAGE>.\n" + 1369351f32270a489577e040bbeccc423b0bac1637dcXianzhu Wang "\n" + 1370e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill: Kill all processes associated with <PACKAGE>. Only kills.\n" + 1371e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " processes that are safe to kill -- that is, will not impact the user\n" + 1372e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn " experience.\n" + 1373e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 1374e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "am kill-all: Kill all background processes.\n" + 1375e4d4fbc8c0257a79d9c6091cea2c264415bd2733Dianne Hackborn "\n" + 137646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am broadcast: send a broadcast Intent.\n" + 13779f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 137846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am instrument: start an Instrumentation. Typically this target <COMPONENT>\n" + 137946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " is the form <TEST_PACKAGE>/<RUNNER_CLASS>. Options are:\n" + 138046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT). Use with\n" + 138146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e perf true] to generate raw output for performance measurements.\n" + 138246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -e <NAME> <VALUE>: set argument <NAME> to <VALUE>. For test runners a\n" + 138346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " common form is [-e <testrunner_flag> <value>[,<value>...]].\n" + 138446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -p <FILE>: write profiling data to <FILE>\n" + 138546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -w: wait for instrumentation to finish before returning. Required for\n" + 138646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " test runners.\n" + 138746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --no-window-animation: turn off window animations will running.\n" + 13889f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 138946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am profile: start and stop profiler on a process.\n" + 1390f9b5eed81d690ab8f336cb3345b46a36e278f180Joe Malin "\n" + 139146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am dumpheap: dump the heap of a process. Options are:\n" + 139246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " -n: dump native heap instead of managed heap\n" + 13939f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor "\n" + 1394d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am set-debug-app: set application <PACKAGE> to debug. Options are:\n" + 1395d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " -w: wait for debugger when application starts\n" + 1396d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn " --persistent: retain this value\n" + 1397d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 1398d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "am clear-debug-app: clear the previously set-debug-app.\n" + 1399d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn "\n" + 140046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am monitor: start monitoring for crashes or ANRs.\n" + 140146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " --gdb: start gdbserv on the given port at crash/ANR\n" + 1402287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn "\n" + 140346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + 1404e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn "\n" + 140546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "am display-size: override display size.\n" + 14067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "\n" + 1407dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn "am display-density: override display density.\n" + 1408dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn "\n" + 1409f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "am to-uri: print the given Intent specification as a URI.\n" + 1410f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "\n" + 1411f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "am to-intent-uri: print the given Intent specification as an intent: URI.\n" + 1412f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn "\n" + 141380a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "am switch-user: switch to put USER_ID in the foreground, starting" + 141480a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " execution of that user if it is currently stopped.\n" + 141580a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "\n" + 141680a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "am stop-user: stop execution of USER_ID, not allowing it to run any" + 141780a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn " code until a later explicit switch to it.\n" + 141880a4af2bbc6af42ae605e454bf89558e564f5244Dianne Hackborn "\n" + 141946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn "<INTENT> specifications include these flags and arguments:\n" + 142046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" + 142146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-c <CATEGORY> [-c <CATEGORY>] ...]\n" + 142246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]\n" + 142346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--esn <EXTRA_KEY> ...]\n" + 142446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]\n" + 142546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]\n" + 142646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]\n" + 14273a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen " [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]\n" + 14288ffb0c0210857210a51d7a9a0f1afb73afbf8677Guang Zhu " [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]\n" + 14297df7d2022d9bebc21a13dcb7ddacaa61f9c2e38eDianne Hackborn " [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]\n" + 143046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]\n" + 143146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]\n" + 14323a2ce935b94383141d1c8a7878fa9308ce718fe5Mike J. Chen " [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]\n" + 143346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [-n <COMPONENT>] [-f <FLAGS>]\n" + 143446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--grant-read-uri-permission] [--grant-write-uri-permission]\n" + 143546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--debug-log-resolution] [--exclude-stopped-packages]\n" + 143646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--include-stopped-packages]\n" + 143746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-brought-to-front] [--activity-clear-top]\n" + 143846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-clear-when-task-reset] [--activity-exclude-from-recents]\n" + 143946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-launched-from-history] [--activity-multiple-task]\n" + 144046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-animation] [--activity-no-history]\n" + 144146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-no-user-action] [--activity-previous-is-top]\n" + 144246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-reorder-to-front] [--activity-reset-task-if-needed]\n" + 144346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-single-top] [--activity-clear-task]\n" + 144446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--activity-task-on-home]\n" + 144546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn " [--receiver-registered-only] [--receiver-replace-pending]\n" + 1446f5b8671c340f189c50b41c53622f979b6d5e0a57Dianne Hackborn " [--selector]\n" + 14470bb1e9139e30aa954f46b0b6fdec2595fac33b80Dianne Hackborn " [<URI> | <PACKAGE> | <COMPONENT>]\n" 14489f4af53561daae8ffe77157068d67ab10d9e2a4dDan Egnor ); 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1451