nativescript
Version:
Command-line interface for building NativeScript projects
152 lines • 7.1 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AndroidDeviceDebugService = void 0;
const helpers_1 = require("../common/helpers");
const debug_service_base_1 = require("./debug-service-base");
const constants_1 = require("../common/constants");
const decorators_1 = require("../common/decorators");
const yok_1 = require("../common/yok");
const _ = require("lodash");
class AndroidDeviceDebugService extends debug_service_base_1.DebugServiceBase {
get platform() {
return "android";
}
constructor(device, $devicesService, $cleanupService, $errors, $logger, $androidProcessService, $staticConfig, $net, $deviceLogProvider) {
super(device, $devicesService);
this.device = device;
this.$devicesService = $devicesService;
this.$cleanupService = $cleanupService;
this.$errors = $errors;
this.$logger = $logger;
this.$androidProcessService = $androidProcessService;
this.$staticConfig = $staticConfig;
this.$net = $net;
this.$deviceLogProvider = $deviceLogProvider;
this.deviceIdentifier = device.deviceInfo.identifier;
}
async debug(debugData, debugOptions) {
this._packageName = debugData.applicationIdentifier;
const result = await this.debugCore(debugData.applicationIdentifier, debugOptions);
// TODO: extract this logic outside the debug service
if (debugOptions.start && !debugOptions.justlaunch) {
const pid = await this.$androidProcessService.getAppProcessId(this.deviceIdentifier, debugData.applicationIdentifier);
if (pid) {
this.$deviceLogProvider.setApplicationPidForDevice(this.deviceIdentifier, pid);
this.$deviceLogProvider.setProjectDirForDevice(this.device.deviceInfo.identifier, debugData.projectDir);
const device = await this.$devicesService.getDevice(this.deviceIdentifier);
await device.openDeviceLogStream();
}
}
return result;
}
debugStop() {
return this.removePortForwarding();
}
async removePortForwarding(packageName) {
const port = await this.getForwardedDebugPort(this.device.deviceInfo.identifier, packageName || this._packageName);
return this.device.adb.executeCommand([
"forward",
"--remove",
`tcp:${port}`,
]);
}
// TODO: Remove this method and reuse logic from androidProcessService
async getForwardedDebugPort(deviceId, packageName) {
let port = -1;
const forwardsResult = await this.device.adb.executeCommand([
"forward",
"--list",
]);
const unixSocketName = `${packageName}-inspectorServer`;
//matches 123a188909e6czzc tcp:40001 localabstract:org.nativescript.testUnixSockets-debug
const regexp = new RegExp(`(?:${deviceId} tcp:)([\\d]+)(?= localabstract:${unixSocketName})`, "g");
const match = regexp.exec(forwardsResult);
if (match) {
port = parseInt(match[1]);
}
else {
port = await this.$net.getAvailablePortInRange(40000);
await this.unixSocketForward(port, `${unixSocketName}`);
}
await this.$cleanupService.addCleanupCommand({
command: await this.$staticConfig.getAdbFilePath(),
args: ["-s", deviceId, "forward", "--remove", `tcp:${port}`],
});
return port;
}
// TODO: Remove this method and reuse logic from androidProcessService
async unixSocketForward(local, remote) {
await this.device.adb.executeCommand([
"forward",
`tcp:${local}`,
`localabstract:${remote}`,
]);
}
async debugCore(appId, debugOptions) {
const result = { debugUrl: null };
if (debugOptions.stop) {
await this.removePortForwarding();
return result;
}
await this.validateRunningApp(this.deviceIdentifier, appId);
if (debugOptions.debugBrk) {
await this.waitForDebugServer(appId);
}
const debugPort = await this.getForwardedDebugPort(this.deviceIdentifier, appId);
await this.printDebugPort(this.deviceIdentifier, debugPort);
result.debugUrl = this.getChromeDebugUrl(debugOptions, debugPort);
return result;
}
async printDebugPort(deviceId, port) {
this.$logger.info("device: " + deviceId + " debug port: " + port + "\n");
}
// TODO: extract this logic outside the debug service
async validateRunningApp(deviceId, packageName) {
if (!(await this.isAppRunning(packageName, deviceId))) {
this.$errors.fail(`The application ${packageName} does not appear to be running on ${deviceId} or is not built with debugging enabled. Try starting the application manually.`);
}
}
async waitForDebugServer(appId) {
const debuggerStartedFilePath = `${constants_1.LiveSyncPaths.ANDROID_TMP_DIR_NAME}/${appId}-debugger-started`;
const waitText = `0 ${debuggerStartedFilePath}`;
let maxWait = 12;
let debuggerStarted = false;
while (maxWait > 0 && !debuggerStarted) {
const forwardsResult = await this.device.adb.executeShellCommand([
"ls",
"-s",
debuggerStartedFilePath,
]);
maxWait--;
debuggerStarted = forwardsResult.indexOf(waitText) === -1;
if (!debuggerStarted) {
await (0, helpers_1.sleep)(500);
}
}
if (debuggerStarted) {
this.$logger.info("# NativeScript Debugger started #");
}
else {
this.$logger.warn("# NativeScript Debugger did not start in time #");
}
}
async isAppRunning(appIdentifier, deviceIdentifier) {
const debuggableApps = await this.$androidProcessService.getDebuggableApps(deviceIdentifier);
return !!_.find(debuggableApps, (a) => a.appIdentifier === appIdentifier);
}
}
exports.AndroidDeviceDebugService = AndroidDeviceDebugService;
__decorate([
(0, decorators_1.performanceLog)()
], AndroidDeviceDebugService.prototype, "debug", null);
__decorate([
(0, decorators_1.performanceLog)()
], AndroidDeviceDebugService.prototype, "debugCore", null);
yok_1.injector.register("androidDeviceDebugService", AndroidDeviceDebugService, false);
//# sourceMappingURL=android-device-debug-service.js.map