From 6507b01317f8b592befe964dde354c8ff2fda3bd Mon Sep 17 00:00:00 2001 From: DimitarTachev Date: Tue, 4 Dec 2018 11:30:26 +0200 Subject: [PATCH] fix: make the android debugging backwards compatible --- package.json | 1 + src/project/androidProject.ts | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index eaaddc5..8ba5ae3 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@types/lodash": "^4.14.109", "@types/mocha": "^5.2.1", "@types/node": "6.0.46", + "@types/semver": "^5.5.0", "@types/universal-analytics": "0.4.1", "cpx": "^1.5.0", "mocha": "^5.2.0", diff --git a/src/project/androidProject.ts b/src/project/androidProject.ts index 74c0a5d..751b5ba 100644 --- a/src/project/androidProject.ts +++ b/src/project/androidProject.ts @@ -1,14 +1,17 @@ import { ChildProcess } from 'child_process'; import { EventEmitter } from 'events'; +import * as semver from 'semver'; import * as stream from 'stream'; import { NativeScriptCli } from './nativeScriptCli'; import { IDebugResult, Project } from './project'; import * as scanner from './streamScanner'; export class AndroidProject extends Project { + private cliVersion: string; constructor(appRoot: string, cli: NativeScriptCli) { super(appRoot, cli); + this.cliVersion = cli.executeGetVersion(); } public platformName(): string { @@ -37,24 +40,26 @@ export class AndroidProject extends Project { const debugProcess: ChildProcess = super.executeDebugCommand(args); const tnsOutputEventEmitter: EventEmitter = new EventEmitter(); + const shouldWaitAfterRestartMessage = semver.lt(semver.coerce(this.cliVersion), '5.1.0'); + const waitForRestartMessage = shouldWaitAfterRestartMessage || args.indexOf('--debug-brk') > -1; - this.configureReadyEvent(debugProcess.stdout, tnsOutputEventEmitter, args.indexOf('--debug-brk') > -1); + this.configureReadyEvent(debugProcess.stdout, tnsOutputEventEmitter, waitForRestartMessage); return { tnsProcess: debugProcess, tnsOutputEventEmitter }; } - protected configureReadyEvent(readableStream: stream.Readable, eventEmitter: EventEmitter, debugBrk?: boolean): void { + protected configureReadyEvent(readableStream: stream.Readable, eventEmitter: EventEmitter, waitForRestartMessage?: boolean): void { super.configureReadyEvent(readableStream, eventEmitter); let debugPort = null; new scanner.StringMatchingScanner(readableStream).onEveryMatch(new RegExp('device: .* debug port: [0-9]+'), (match: scanner.IMatchFound) => { // device: {device-name} debug port: {debug-port} debugPort = parseInt((match.matches[0] as string).match('(?:debug port: )([\\d]{5})')[1], 10); - if (!debugBrk) { + if (!waitForRestartMessage) { setTimeout(() => { eventEmitter.emit('readyForConnection', debugPort); }, 1000); } }); - if (debugBrk) { + if (waitForRestartMessage) { new scanner.StringMatchingScanner(readableStream).onEveryMatch('# NativeScript Debugger started #', (match: scanner.IMatchFound) => { // wait a little before trying to connect, this gives a chance for adb to be able to connect to the debug socket setTimeout(() => { eventEmitter.emit('readyForConnection', debugPort); }, 1000);