microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
32cab018cd5684ab85039f50e45d9857ebf6e2f4

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/debugger/android/androidPlatform.ts

107lines · modeblame

e639e7a4Daniel10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as Q from "q";
710f8655digeff10 years ago5
f8d32439dlebu10 years ago6import {IAppPlatform} from "../platformResolver";
b0061ac6Meena Kunnathur Balakrishnan10 years ago7import {CommandExecutor} from "../../common/commandExecutor";
710f8655digeff10 years ago8import {ExtensionMessageSender, ExtensionMessage} from "../../common/extensionMessaging";
9import {IRunOptions} from "../../common/launchArgs";
c2bf3c4fdigeff10 years ago10import {Log} from "../../common/log/log";
8953be57dlebu10 years ago11import {PackageNameResolver} from "../../common/android/packageNameResolver";
f8b7022ddigeff10 years ago12import {OutputVerifier, PatternToFailure} from "../../common/outputVerifier";
fcb6a5dadlebu10 years ago13import {DeviceHelper, IDevice} from "../../common/android/deviceHelper";
710f8655digeff10 years ago14import {Package} from "../../common/node/package";
e639e7a4Daniel10 years ago15
16/**
17* Android specific platform implementation for debugging RN applications.
18*/
f8d32439dlebu10 years ago19export class AndroidPlatform implements IAppPlatform {
710f8655digeff10 years ago20private extensionMessageSender: ExtensionMessageSender;
21
7cc67271digeff10 years ago22// We should add the common Android build/run erros we find to this list
23private static RUN_ANDROID_FAILURE_PATTERNS: PatternToFailure = {
24"Failed to install on any devices": "Could not install the app on any available device. Make sure you have a correctly"
25+ " configured device or emulator running. See https://facebook.github.io/react-native/docs/android-setup.html",
9ce5a776digeff10 years ago26"com.android.ddmlib.ShellCommandUnresponsiveException": "An Android shell command timed-out. Please retry the operation.",
e4c8f7d4digeff10 years ago27"Android project not found": "Android project not found." };
7cc67271digeff10 years ago28
29private static RUN_ANDROID_SUCCESS_PATTERNS: string[] = ["BUILD SUCCESSFUL", "Starting the app", "Starting: Intent"];
bc7a32ceJimmy Thomson10 years ago30
74e87372dlebu10 years ago31private debugTarget: string;
32private packageName: string;
fcb6a5dadlebu10 years ago33private deviceHelper: DeviceHelper;
34
710f8655digeff10 years ago35constructor({ extensionMessageSender = new ExtensionMessageSender()} = {}) {
36this.extensionMessageSender = extensionMessageSender;
fcb6a5dadlebu10 years ago37this.deviceHelper = new DeviceHelper();
38}
e639e7a4Daniel10 years ago39
40public runApp(runOptions: IRunOptions): Q.Promise<void> {
41let pkg = new Package(runOptions.projectRoot);
fcb6a5dadlebu10 years ago42let cexec = new CommandExecutor(runOptions.projectRoot);
ae883d21digeff10 years ago43
44const runAndroidSpawn = cexec.spawnChildReactCommandProcess("run-android");
45const output = new OutputVerifier(
7cc67271digeff10 years ago46() =>
47Q(AndroidPlatform.RUN_ANDROID_SUCCESS_PATTERNS),
48() =>
49Q(AndroidPlatform.RUN_ANDROID_FAILURE_PATTERNS)).process(runAndroidSpawn);
8953be57dlebu10 years ago50
ae883d21digeff10 years ago51return output
74e87372dlebu10 years ago52.then(() => pkg.name())
2010d4e2dlebu10 years ago53.then(appName => new PackageNameResolver(appName).resolvePackageName(runOptions.projectRoot))
8953be57dlebu10 years ago54.then(packageName => {
74e87372dlebu10 years ago55this.packageName = packageName;
2a8515bcdlebu10 years ago56return this.deviceHelper.getConnectedDevices()
2f567aafdlebu10 years ago57.then((devices: IDevice[]) => {
58if (devices.length > 1) {
59/* more than one device or emulator */
74e87372dlebu10 years ago60this.debugTarget = this.getTargetEmulator(runOptions, devices);
61if (this.debugTarget) {
62/* Launching is needed only if we have more than one device active */
2a8515bcdlebu10 years ago63return this.deviceHelper.launchApp(runOptions.projectRoot, packageName, this.debugTarget);
74e87372dlebu10 years ago64}
c2bf3c4fdigeff10 years ago65} else if (devices.length === 1) {
66this.debugTarget = devices[0].id;
2f567aafdlebu10 years ago67}
68});
710f8655digeff10 years ago69}).then(() =>
a9d77c8bdigeff10 years ago70this.startMonitoringLogCat(runOptions.logCatArguments).catch(error => // The LogCatMonitor failing won't stop the debugging experience
710f8655digeff10 years ago71Log.logWarning("Couldn't start LogCat monitor", error)));
e639e7a4Daniel10 years ago72}
2f567aafdlebu10 years ago73
74e87372dlebu10 years ago74public enableJSDebuggingMode(runOptions: IRunOptions): Q.Promise<void> {
fcb6a5dadlebu10 years ago75return this.deviceHelper.reloadAppInDebugMode(runOptions.projectRoot, this.packageName, this.debugTarget);
74e87372dlebu10 years ago76}
77
2f567aafdlebu10 years ago78/**
79* Returns the target emulator, using the following logic:
80* * If an emulator is specified and it is connected, use that one.
81* * Otherwise, use the first one in the list.
82*/
83private getTargetEmulator(runOptions: IRunOptions, devices: IDevice[]): string {
84let activeFilterFunction = (device: IDevice) => {
74e87372dlebu10 years ago85return device.isOnline;
2f567aafdlebu10 years ago86};
87
88let targetFilterFunction = (device: IDevice) => {
89return device.id === runOptions.target && activeFilterFunction(device);
90};
91
74e87372dlebu10 years ago92if (runOptions && runOptions.target && devices) {
2f567aafdlebu10 years ago93/* check if the specified target is active */
74e87372dlebu10 years ago94if (devices.some(targetFilterFunction)) {
2f567aafdlebu10 years ago95return runOptions.target;
96}
97}
98
99/* return the first active device in the list */
100let activeDevices = devices && devices.filter(activeFilterFunction);
101return activeDevices && activeDevices[0] && activeDevices[0].id;
102}
710f8655digeff10 years ago103
a9d77c8bdigeff10 years ago104private startMonitoringLogCat(logCatArguments: string): Q.Promise<void> {
c2bf3c4fdigeff10 years ago105return this.extensionMessageSender.sendMessage(ExtensionMessage.START_MONITORING_LOGCAT, [this.debugTarget, logCatArguments]);
710f8655digeff10 years ago106}
e639e7a4Daniel10 years ago107}