mirror of
https://github.com/adelphes/android-dev-ext.git
synced 2025-12-23 01:48:18 +00:00
Compare commits
215 Commits
v1.3.2
...
adelphes/j
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e84509a072 | ||
|
|
6a29651208 | ||
|
|
f551a92236 | ||
|
|
33daf68649 | ||
|
|
cc3b995de3 | ||
|
|
f2137eb35c | ||
|
|
78c8c4ac6a | ||
|
|
f33cc13ebd | ||
|
|
346c4a937b | ||
|
|
2fd2c001ce | ||
|
|
a902d3daeb | ||
|
|
b5cc60a516 | ||
|
|
4740f6533a | ||
|
|
92129e4cb0 | ||
|
|
f50aaa48aa | ||
|
|
7aa04dfc56 | ||
|
|
b2eb0c973b | ||
|
|
27db9f5e3b | ||
|
|
279807a4c5 | ||
|
|
ea9a7f1a85 | ||
|
|
10848b2910 | ||
|
|
4cd0764a9d | ||
|
|
dc8098c471 | ||
|
|
ad585a8a84 | ||
|
|
9fde7bcd9d | ||
|
|
3e1bd63330 | ||
|
|
7d1d215b79 | ||
|
|
1b2cd957ec | ||
|
|
2f5ed65461 | ||
|
|
00da3cd2f1 | ||
|
|
31f3826971 | ||
|
|
9498888ee6 | ||
|
|
d74837158a | ||
|
|
cd1c360ef0 | ||
|
|
61397dab95 | ||
|
|
bdb5986c4b | ||
|
|
acd18e4105 | ||
|
|
3dbe1dea3e | ||
|
|
0205a317d9 | ||
|
|
3e77b3f1c9 | ||
|
|
a278237486 | ||
|
|
6ca4ea353d | ||
|
|
4554b8890e | ||
|
|
2716505a77 | ||
|
|
fed16b22f5 | ||
|
|
3a55d3627f | ||
|
|
2ee1c72b6a | ||
|
|
c8311ea2e4 | ||
|
|
bb1a326768 | ||
|
|
18049ea08c | ||
|
|
113a7379ed | ||
|
|
baabf1e7a9 | ||
|
|
71600cf366 | ||
|
|
a567ea7266 | ||
|
|
2c522e38b1 | ||
|
|
8f9bf25e4c | ||
|
|
edb16c667b | ||
|
|
c943408613 | ||
|
|
43dbcb4d47 | ||
|
|
8aaf6a6f0e | ||
|
|
563142661a | ||
|
|
f9a2665364 | ||
|
|
7038bf7090 | ||
|
|
175ce1d644 | ||
|
|
849c49acb6 | ||
|
|
cda0810df1 | ||
|
|
e2765fd982 | ||
|
|
f67c03bb34 | ||
|
|
b0a2475696 | ||
|
|
69e77eae8a | ||
|
|
b45314cc95 | ||
|
|
e7e73387aa | ||
|
|
089d174e08 | ||
|
|
b70592a0f7 | ||
|
|
db865825d0 | ||
|
|
591907f523 | ||
|
|
cd6bf29e9f | ||
|
|
ce345965e5 | ||
|
|
3073dfcd25 | ||
|
|
085f027856 | ||
|
|
56464ef537 | ||
|
|
4f0e55a909 | ||
|
|
fbb275600a | ||
|
|
4fc616daa1 | ||
|
|
df210b4659 | ||
|
|
491086a750 | ||
|
|
43c701adc8 | ||
|
|
153a6e869b | ||
|
|
6badc9fdb6 | ||
|
|
a034a90735 | ||
|
|
82e660eabc | ||
|
|
9be298293f | ||
|
|
7fd7809be3 | ||
|
|
f4743e456b | ||
|
|
1255a15bba | ||
|
|
f05b34171c | ||
|
|
d869afe2fa | ||
|
|
c1f2ccdc4a | ||
|
|
b143772b26 | ||
|
|
0f296379c6 | ||
|
|
2da127edc0 | ||
|
|
13cdd1e0bc | ||
|
|
3c505b05be | ||
|
|
458d8e553e | ||
|
|
4f62b5a06e | ||
|
|
b9fd805a6d | ||
|
|
29e6132cac | ||
|
|
d85f49546a | ||
|
|
143a31b0c4 | ||
|
|
1c8eb75b4f | ||
|
|
fe28924e0c | ||
|
|
dc39ae53b1 | ||
|
|
9d4e8ab7d0 | ||
|
|
ecf67d44c0 | ||
|
|
198317a5c2 | ||
|
|
bccc29251c | ||
|
|
e88475dddd | ||
|
|
8df1a3464b | ||
|
|
26e54bba37 | ||
|
|
b61ef125fc | ||
|
|
6af16cac43 | ||
|
|
9017752d7b | ||
|
|
58ff585a9d | ||
|
|
46838686ea | ||
|
|
9ac6086bad | ||
|
|
8b71037a58 | ||
|
|
eeb6d7c3d0 | ||
|
|
f74f4b26c6 | ||
|
|
b050f3a82d | ||
|
|
1801a81c0f | ||
|
|
14582503da | ||
|
|
4af183e4e1 | ||
|
|
a8653f26df | ||
|
|
2f3349c359 | ||
|
|
549473d765 | ||
|
|
01ae51d91a | ||
|
|
18d56e0bc0 | ||
|
|
da8d37aafd | ||
|
|
f4a18ebcdc | ||
|
|
c70b75783e | ||
|
|
ac9a7ed43a | ||
|
|
d0308781f7 | ||
|
|
974ec93841 | ||
|
|
c454753385 | ||
|
|
3ab97ef235 | ||
|
|
5b29b9998d | ||
|
|
90c537b82d | ||
|
|
cd725638cd | ||
|
|
87a2d72ae3 | ||
|
|
c9ab48031e | ||
|
|
dd9d23c64a | ||
|
|
b175b52065 | ||
|
|
6dffe61d62 | ||
|
|
309cc47107 | ||
|
|
41adfbe53e | ||
|
|
74a21ecbf8 | ||
|
|
252b476147 | ||
|
|
74a0339962 | ||
|
|
426735aa25 | ||
|
|
7c9acfd7ca | ||
|
|
261abb9cc7 | ||
|
|
1b1202598c | ||
|
|
c09620c481 | ||
|
|
3a85c6f819 | ||
|
|
6fd6376dea | ||
|
|
04c0e97c81 | ||
|
|
bbc6007338 | ||
|
|
930237359e | ||
|
|
c16bb1b30a | ||
|
|
f14d70feb6 | ||
|
|
67c1fc9db6 | ||
|
|
49b5480870 | ||
|
|
6bcdecee07 | ||
|
|
a4be37d872 | ||
|
|
6ef64b1d9c | ||
|
|
4750212484 | ||
|
|
20831c2326 | ||
|
|
fc9d58b9da | ||
|
|
c56732c689 | ||
|
|
ebc5f73bcc | ||
|
|
7d6af70ae1 | ||
|
|
ce6ed14aaa | ||
|
|
b30228c10b | ||
|
|
00d4998301 | ||
|
|
52db53e65a | ||
|
|
37dddc48d9 | ||
|
|
18ff477d34 | ||
|
|
de846fef12 | ||
|
|
4ba7fd1b3d | ||
|
|
f294cb2af1 | ||
|
|
67f1b617ff | ||
|
|
09c15ef401 | ||
|
|
13068cbcea | ||
|
|
432cd24f3c | ||
|
|
1238d7980a | ||
|
|
19810a2f75 | ||
|
|
61b787d5ff | ||
|
|
c113e8bee0 | ||
|
|
ee8f6513bf | ||
|
|
4ed8411180 | ||
|
|
9c579662e6 | ||
|
|
b1d4261f28 | ||
|
|
b50e7bea46 | ||
|
|
9a4dd63dc7 | ||
|
|
c43ba6ccf1 | ||
|
|
4f70cb0128 | ||
|
|
81a608b6da | ||
|
|
ff8cf5b91a | ||
|
|
a46474c3c2 | ||
|
|
23dc6d3871 | ||
|
|
bdc5b1d4cd | ||
|
|
25a6ace1e4 | ||
|
|
66cee87685 | ||
|
|
79bba76b9f | ||
|
|
3156a2ddc2 |
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,18 +1,5 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
### version 1.3.2
|
|
||||||
* Update analytics library
|
|
||||||
* Update lodash version - security advisory https://www.npmjs.com/advisories/1523
|
|
||||||
|
|
||||||
### version 1.3.0
|
|
||||||
* Support `ADB_SERVER_SOCKET`, `ANDROID_ADB_SERVER_ADDRESS` & `ANDROID_ADB_SERVER_PORT` env vars when connecting to ADB.
|
|
||||||
* Replace `adbPort` configuration option with a new `adbSocket` value to allow ADB server host to be overidden. (`adbPort` is now deprecated).
|
|
||||||
* Allow the JDWP local port to be fixed using a new `jdwpPort` configuration option.
|
|
||||||
|
|
||||||
### version 1.2.1
|
|
||||||
* Java Intellisense: automatically import dependencies of AndroidX libraries.
|
|
||||||
* Debugger: Warn about open instances of Android Studio
|
|
||||||
|
|
||||||
### version 1.2.0
|
### version 1.2.0
|
||||||
* Java Intellisense beta.
|
* Java Intellisense beta.
|
||||||
|
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ The following settings are used to configure the debugger:
|
|||||||
// Fully qualified path to the built APK (Android Application Package).
|
// Fully qualified path to the built APK (Android Application Package).
|
||||||
"apkFile": "${workspaceRoot}/app/build/outputs/apk/app-debug.apk",
|
"apkFile": "${workspaceRoot}/app/build/outputs/apk/app-debug.apk",
|
||||||
|
|
||||||
// `host:port` configuration for connecting to the ADB (Android Debug Bridge) server instance.
|
// Port number to connect to the local ADB (Android Debug Bridge) instance.
|
||||||
// Default: localhost:5037
|
// Default: 5037
|
||||||
"adbSocket": "localhost:5037",
|
"adbPort": 5037,
|
||||||
|
|
||||||
// Automatically launch 'adb start-server' if not already started.
|
// Automatically launch 'adb start-server' if not already started.
|
||||||
// Default: true
|
// Default: true
|
||||||
|
|||||||
28
extension.js
28
extension.js
@@ -12,11 +12,8 @@ const { selectTargetDevice } = require('./src/utils/device');
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {vscode.ExtensionContext} context
|
* @param {vscode.ExtensionContext} context
|
||||||
* @param {string} uid
|
|
||||||
* @param {number} session_id
|
|
||||||
* @param {*} vscode_props
|
|
||||||
*/
|
*/
|
||||||
async function createLanguageClient(context, uid, session_id, vscode_props) {
|
async function createLanguageClient(context) {
|
||||||
// The server is implemented in node
|
// The server is implemented in node
|
||||||
let serverModule = context.asAbsolutePath(path.join('langserver', 'server.js'));
|
let serverModule = context.asAbsolutePath(path.join('langserver', 'server.js'));
|
||||||
// The debug options for the server
|
// The debug options for the server
|
||||||
@@ -48,6 +45,8 @@ async function createLanguageClient(context, uid, session_id, vscode_props) {
|
|||||||
}
|
}
|
||||||
const sourceFiles = (await vscode.workspace.findFiles(`${globSearchRoot}**/*.java`, null, 1000, null)).map(uri => uri.toString());
|
const sourceFiles = (await vscode.workspace.findFiles(`${globSearchRoot}**/*.java`, null, 1000, null)).map(uri => uri.toString());
|
||||||
|
|
||||||
|
const mpids = analytics.getIDs(context);
|
||||||
|
|
||||||
// Options to control the language client
|
// Options to control the language client
|
||||||
/** @type {import('vscode-languageclient').LanguageClientOptions} */
|
/** @type {import('vscode-languageclient').LanguageClientOptions} */
|
||||||
let clientOptions = {
|
let clientOptions = {
|
||||||
@@ -58,11 +57,11 @@ async function createLanguageClient(context, uid, session_id, vscode_props) {
|
|||||||
initializationOptions: {
|
initializationOptions: {
|
||||||
// extensionPath points to the root of the extension (the folder where this file is)
|
// extensionPath points to the root of the extension (the folder where this file is)
|
||||||
extensionPath: context.extensionPath,
|
extensionPath: context.extensionPath,
|
||||||
uid,
|
mpuid: mpids.uid,
|
||||||
session_id,
|
mpsid: mpids.sid,
|
||||||
vscode_props,
|
|
||||||
initialSettings: config,
|
initialSettings: config,
|
||||||
sourceFiles,
|
sourceFiles,
|
||||||
|
vscodeVersion: vscode.version,
|
||||||
workspaceFolders: (vscode.workspace.workspaceFolders || []).map(z => z.uri.toString()),
|
workspaceFolders: (vscode.workspace.workspaceFolders || []).map(z => z.uri.toString()),
|
||||||
},
|
},
|
||||||
synchronize: {
|
synchronize: {
|
||||||
@@ -115,18 +114,10 @@ function activate(context) {
|
|||||||
/* Only the logcat stuff is configured here. The debugger is launched from src/debugMain.js */
|
/* Only the logcat stuff is configured here. The debugger is launched from src/debugMain.js */
|
||||||
AndroidContentProvider.register(context, vscode.workspace);
|
AndroidContentProvider.register(context, vscode.workspace);
|
||||||
|
|
||||||
const { uid } = analytics.getIDs(context);
|
const mpids = analytics.getIDs(context);
|
||||||
const session_id = Math.trunc(Math.random() * Number.MAX_SAFE_INTEGER);
|
analytics.init(undefined, mpids.uid, mpids.sid, package_json, { vscode_version: vscode.version });
|
||||||
const vscode_props = {
|
|
||||||
appName: vscode.env.appName,
|
|
||||||
language: vscode.env.language,
|
|
||||||
shell: vscode.env.shell,
|
|
||||||
uiKind: vscode.env.uiKind,
|
|
||||||
vscode_version: vscode.version,
|
|
||||||
}
|
|
||||||
analytics.init(undefined, uid, session_id, '', package_json, vscode_props, 'extension-start');
|
|
||||||
|
|
||||||
createLanguageClient(context, uid, session_id, vscode_props).then(client => {
|
createLanguageClient(context).then(client => {
|
||||||
languageClient = client;
|
languageClient = client;
|
||||||
refreshLanguageServerEnabledState();
|
refreshLanguageServerEnabledState();
|
||||||
});
|
});
|
||||||
@@ -181,7 +172,6 @@ function activate(context) {
|
|||||||
|
|
||||||
// this method is called when your extension is deactivated
|
// this method is called when your extension is deactivated
|
||||||
function deactivate() {
|
function deactivate() {
|
||||||
analytics.event('extension-deactivate');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.activate = activate;
|
exports.activate = activate;
|
||||||
|
|||||||
@@ -1,53 +1,38 @@
|
|||||||
const os = require('os');
|
let mp;
|
||||||
const uuid = require('uuid').v4;
|
|
||||||
let client;
|
|
||||||
/** @type {string} */
|
/** @type {string} */
|
||||||
let uid;
|
let uid;
|
||||||
/** @type {string} */
|
/** @type {string} */
|
||||||
let did = uuid();
|
let sid;
|
||||||
/** @type {number} */
|
|
||||||
let session_id;
|
|
||||||
/** @type {Map<string,[number,number]>} */
|
/** @type {Map<string,[number,number]>} */
|
||||||
const timeLabels = new Map();
|
const timeLabels = new Map();
|
||||||
let session_start = Date.now();
|
let session_start = Date.now();
|
||||||
/** @type {string|Promise<string>} */
|
|
||||||
let ip = '';
|
|
||||||
let queued_events = null;
|
|
||||||
let package_info = null;
|
|
||||||
let vscode_info = null;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} [t]
|
* @param {string} [t]
|
||||||
* @param {string} u
|
* @param {string} [u]
|
||||||
* @param {number} s
|
* @param {string} [s]
|
||||||
* @param {string} ipaddr
|
* @param {{name:string,version:string}} [package_json]
|
||||||
* @param {{name:string,version:string}} package_json
|
* @param {*} [props]
|
||||||
* @param {*} vscode_props
|
|
||||||
* @param {string} caller
|
|
||||||
*/
|
*/
|
||||||
function init(t = '94635b4642d80407accd3739fa35bed6', u, s, ipaddr, package_json, vscode_props, caller) {
|
function init(t = '0cca95950055c6553804a46ce7e3df18', u, s, package_json, props) {
|
||||||
if (client) {
|
if (mp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
client = require('@amplitude/node').init(t);
|
mp = require('mixpanel').init(t);
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uid = u;
|
uid = u;
|
||||||
session_id = s || Math.trunc(Math.random() * Number.MAX_SAFE_INTEGER);
|
sid = s;
|
||||||
ip = ipaddr || (getCurrentIP()
|
|
||||||
.catch(() => '')
|
|
||||||
.then(res => ip = res));
|
|
||||||
package_info = package_json;
|
|
||||||
vscode_info = vscode_props;
|
|
||||||
|
|
||||||
if (!caller) {
|
if (!props) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const os = require('os');
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
event(caller, {
|
event(`${package_json.name}-start`, {
|
||||||
extension: package_json.name,
|
extension: package_json.name,
|
||||||
ext_version: package_json.version,
|
ext_version: package_json.version,
|
||||||
arch: process.arch,
|
arch: process.arch,
|
||||||
@@ -58,59 +43,30 @@ function init(t = '94635b4642d80407accd3739fa35bed6', u, s, ipaddr, package_json
|
|||||||
release: os.release(),
|
release: os.release(),
|
||||||
localtime: now.toTimeString(),
|
localtime: now.toTimeString(),
|
||||||
tz: now.getTimezoneOffset(),
|
tz: now.getTimezoneOffset(),
|
||||||
...vscode_props,
|
...props
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCurrentIP() {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
require('https').get(
|
|
||||||
Buffer.from('aHR0cHM6Ly91YTF4c3JhM2ZhLmV4ZWN1dGUtYXBpLmV1LXdlc3QtMi5hbWF6b25hd3MuY29tL3JlbA==','base64').toString(),
|
|
||||||
{ headers: { 'Content-Type': 'application/json' } },
|
|
||||||
res => resolve(res.headers['x-request-ip'])
|
|
||||||
)
|
|
||||||
.on('error', err => reject(err));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {string} eventName
|
* @param {string} eventName
|
||||||
* @param {*} [properties]
|
* @param {*} [properties]
|
||||||
*/
|
*/
|
||||||
function event(eventName, properties) {
|
function event(eventName, properties) {
|
||||||
if (!client || !eventName || (!uid && !did) || !ip) {
|
if (!mp) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (queued_events) {
|
|
||||||
queued_events.push({eventName, properties});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ip instanceof Promise) {
|
|
||||||
queued_events = [{eventName, properties}]
|
|
||||||
ip.catch(() => {}).then(() => {
|
|
||||||
const e = queued_events;
|
|
||||||
queued_events = null;
|
|
||||||
e.forEach(({eventName, properties}) => event(eventName, properties));
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
client.logEvent({
|
if (uid) {
|
||||||
event_type: eventName,
|
mp.track(eventName, {
|
||||||
user_id: uid,
|
distinct_id: uid,
|
||||||
device_id: uid ? undefined : did,
|
session_id: sid,
|
||||||
app_version: package_info.version,
|
|
||||||
ip,
|
|
||||||
language: vscode_info.language,
|
|
||||||
os_name: process.platform,
|
|
||||||
os_version: os.release(),
|
|
||||||
session_id,
|
|
||||||
event_properties: {
|
|
||||||
session_length: Math.trunc((Date.now() - session_start) / 60e3),
|
session_length: Math.trunc((Date.now() - session_start) / 60e3),
|
||||||
...properties,
|
...properties,
|
||||||
}
|
});
|
||||||
});
|
} else {
|
||||||
|
mp.track(eventName, properties);
|
||||||
|
}
|
||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,18 +113,29 @@ function timeEnd(label, time_unit = 'ms', additionalProps = {}) {
|
|||||||
function getIDs(context) {
|
function getIDs(context) {
|
||||||
if (!context || !context.globalState) {
|
if (!context || !context.globalState) {
|
||||||
return {
|
return {
|
||||||
uid: '',
|
uid: '', sid: ''
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
let uuidv4 = () => {
|
||||||
|
try {
|
||||||
|
uuidv4 = require('uuid').v4;
|
||||||
|
return uuidv4();
|
||||||
|
} catch {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
let u = uid || (uid = context.globalState.get('mix-panel-id'));
|
let u = uid || (uid = context.globalState.get('mix-panel-id'));
|
||||||
if (typeof u !== 'string' || u.length > 36) {
|
if (typeof u !== 'string' || u.length > 36) {
|
||||||
u = uid = uuid();
|
u = uid = uuidv4();
|
||||||
context.globalState.update('mix-panel-id', u);
|
context.globalState.update('mix-panel-id', u);
|
||||||
}
|
}
|
||||||
|
let s = sid || (sid = uuidv4());
|
||||||
return {
|
return {
|
||||||
uid: u,
|
uid: u,
|
||||||
|
sid: s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.init = init;
|
exports.init = init;
|
||||||
exports.event = event;
|
exports.event = event;
|
||||||
exports.time = time;
|
exports.time = time;
|
||||||
|
|||||||
@@ -370,10 +370,7 @@ async function getCompletionItems(params, liveParsers, androidLibrary) {
|
|||||||
|
|
||||||
completionRequestCount += 1;
|
completionRequestCount += 1;
|
||||||
if ((completionRequestCount === 1) || (completionRequestCount === 5) || ((completionRequestCount % 25) === 0)) {
|
if ((completionRequestCount === 1) || (completionRequestCount === 5) || ((completionRequestCount % 25) === 0)) {
|
||||||
event('completion-requests', {
|
event('completion-requests', { comp_req_count: completionRequestCount });
|
||||||
comp_req_count: completionRequestCount, // total count for this session
|
|
||||||
comp_req_partial_count: (completionRequestCount % 25) || 25,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let parsed = docinfo.parsed;
|
let parsed = docinfo.parsed;
|
||||||
|
|||||||
@@ -41,10 +41,7 @@ async function getSignatureHelp(request, liveParsers) {
|
|||||||
|
|
||||||
methodsigRequestCount += 1;
|
methodsigRequestCount += 1;
|
||||||
if ((methodsigRequestCount === 1) || (methodsigRequestCount === 5) || ((methodsigRequestCount % 25) === 0)) {
|
if ((methodsigRequestCount === 1) || (methodsigRequestCount === 5) || ((methodsigRequestCount % 25) === 0)) {
|
||||||
event('method-sig-requests', {
|
event('method-sig-requests', { methsig_req_count: methodsigRequestCount });
|
||||||
methsig_req_count: methodsigRequestCount,
|
|
||||||
methsig_req_partial_count: (methodsigRequestCount % 25) || 25,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// locate the token at the requested position
|
// locate the token at the requested position
|
||||||
|
|||||||
78
langserver/package-lock.json
generated
78
langserver/package-lock.json
generated
@@ -1,29 +1,23 @@
|
|||||||
{
|
{
|
||||||
"name": "langserver",
|
"name": "langserver",
|
||||||
"version": "1.0.4",
|
"version": "1.0.3",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@amplitude/node": {
|
|
||||||
"version": "0.3.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@amplitude/node/-/node-0.3.3.tgz",
|
|
||||||
"integrity": "sha512-Uzg4MRAuD053Ex67Iu2lm2GovnVte1uKI3q7CXlMCYZ9ylZmAkPbTnjg9OVyD4f+IiUfgK4p3bE7r9p7jqSDLA==",
|
|
||||||
"requires": {
|
|
||||||
"@amplitude/types": "^0.3.2",
|
|
||||||
"tslib": "^1.9.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@amplitude/types": {
|
|
||||||
"version": "0.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@amplitude/types/-/types-0.3.2.tgz",
|
|
||||||
"integrity": "sha512-7+m7nhJMFGbpsppOUsCH8f4FOFyAxgKFuXkKknU/LP2CMYVjWEIoLTKKgaJPc2c8wXaK5KPXVetb8VeiGbuaGg=="
|
|
||||||
},
|
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "13.13.4",
|
"version": "13.13.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz",
|
||||||
"integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==",
|
"integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"agent-base": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
|
||||||
|
"requires": {
|
||||||
|
"es6-promisify": "^5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
@@ -85,6 +79,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
},
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "3.2.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||||
|
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "^2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"duplexer2": {
|
"duplexer2": {
|
||||||
"version": "0.1.4",
|
"version": "0.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
|
||||||
@@ -93,6 +95,19 @@
|
|||||||
"readable-stream": "^2.0.2"
|
"readable-stream": "^2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"es6-promise": {
|
||||||
|
"version": "4.2.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
|
||||||
|
"integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
|
||||||
|
},
|
||||||
|
"es6-promisify": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
|
||||||
|
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
|
||||||
|
"requires": {
|
||||||
|
"es6-promise": "^4.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fs.realpath": {
|
"fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@@ -127,6 +142,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
|
||||||
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
|
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
|
||||||
},
|
},
|
||||||
|
"https-proxy-agent": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==",
|
||||||
|
"requires": {
|
||||||
|
"agent-base": "^4.3.0",
|
||||||
|
"debug": "^3.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"inflight": {
|
"inflight": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||||
@@ -147,10 +171,10 @@
|
|||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
},
|
},
|
||||||
"java-mti": {
|
"java-mti": {
|
||||||
"version": "github:adelphes/java-mti#ec164ace68267813a1ca9df18651b51e3f3f067d",
|
"version": "github:adelphes/java-mti#d0e1e45bad4d2bba453dbcb5ad527db023f223e8",
|
||||||
"from": "github:adelphes/java-mti#ec164ac",
|
"from": "github:adelphes/java-mti#d0e1e45",
|
||||||
"requires": {
|
"requires": {
|
||||||
"unzipper": "0.10.11"
|
"unzipper": "^0.10.11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"listenercount": {
|
"listenercount": {
|
||||||
@@ -171,6 +195,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||||
},
|
},
|
||||||
|
"mixpanel": {
|
||||||
|
"version": "0.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.11.0.tgz",
|
||||||
|
"integrity": "sha512-TS7AkCmfC+vGshlCOjEcITFoFxlt5fdSEqmN+d+pTXAhE5v+jPQW2uUcn9W+Oq4NVXz+kdskU09dsm9vmNl0ig==",
|
||||||
|
"requires": {
|
||||||
|
"https-proxy-agent": "3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"mkdirp": {
|
"mkdirp": {
|
||||||
"version": "0.5.5",
|
"version": "0.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
|
||||||
@@ -179,6 +211,11 @@
|
|||||||
"minimist": "^1.2.5"
|
"minimist": "^1.2.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
},
|
||||||
"once": {
|
"once": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||||
@@ -242,11 +279,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
|
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
|
||||||
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
|
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
|
||||||
},
|
},
|
||||||
"tslib": {
|
|
||||||
"version": "1.13.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
|
|
||||||
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
|
|
||||||
},
|
|
||||||
"unzipper": {
|
"unzipper": {
|
||||||
"version": "0.10.11",
|
"version": "0.10.11",
|
||||||
"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz",
|
"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "langserver",
|
"name": "langserver",
|
||||||
"version": "1.0.4",
|
"version": "1.0.3",
|
||||||
"description": "Language server for Android development",
|
"description": "Language server for Android development",
|
||||||
"main": "server.js",
|
"main": "server.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@amplitude/node": "^0.3.3",
|
"java-mti": "adelphes/java-mti#d0e1e45",
|
||||||
"java-mti": "adelphes/java-mti#ec164ac",
|
"mixpanel": "0.11.0",
|
||||||
"uuid": "8.2.0",
|
"uuid": "8.2.0",
|
||||||
"vscode-languageserver": "6.1.1",
|
"vscode-languageserver": "6.1.1",
|
||||||
"vscode-languageserver-textdocument": "1.0.1",
|
"vscode-languageserver-textdocument": "1.0.1",
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ connection.onInitialize((params) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Settings.set(startupOpts.initialSettings);
|
Settings.set(startupOpts.initialSettings);
|
||||||
analytics.init(undefined, startupOpts.uid, startupOpts.session_id, '', package_json, startupOpts.vscode_props, 'langserver-start');
|
analytics.init(undefined, startupOpts.mpuid, uuidv4(), package_json, { vscode_version: startupOpts.vscodeVersion });
|
||||||
|
|
||||||
loadCodeCompletionLibrary(startupOpts.extensionPath, Settings.codeCompletionLibraries);
|
loadCodeCompletionLibrary(startupOpts.extensionPath, Settings.codeCompletionLibraries);
|
||||||
|
|
||||||
|
|||||||
8
package-lock.json
generated
8
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "android-dev-ext",
|
"name": "android-dev-ext",
|
||||||
"version": "1.3.2",
|
"version": "1.2.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -710,9 +710,9 @@
|
|||||||
"integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc="
|
"integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc="
|
||||||
},
|
},
|
||||||
"lodash": {
|
"lodash": {
|
||||||
"version": "4.17.19",
|
"version": "4.17.15",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||||
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
|
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"long": {
|
"long": {
|
||||||
|
|||||||
32
package.json
32
package.json
@@ -2,7 +2,7 @@
|
|||||||
"name": "android-dev-ext",
|
"name": "android-dev-ext",
|
||||||
"displayName": "Android",
|
"displayName": "Android",
|
||||||
"description": "Android debugging support for VS Code",
|
"description": "Android debugging support for VS Code",
|
||||||
"version": "1.3.2",
|
"version": "1.2.0",
|
||||||
"publisher": "adelphes",
|
"publisher": "adelphes",
|
||||||
"preview": true,
|
"preview": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -238,7 +238,8 @@
|
|||||||
"launch": {
|
"launch": {
|
||||||
"required": [
|
"required": [
|
||||||
"appSrcRoot",
|
"appSrcRoot",
|
||||||
"apkFile"
|
"apkFile",
|
||||||
|
"adbPort"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"amStartArgs": {
|
"amStartArgs": {
|
||||||
@@ -264,17 +265,12 @@
|
|||||||
},
|
},
|
||||||
"adbPort": {
|
"adbPort": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Port number to connect to the local ADB (Android Debug Bridge) instance. Default: 5037\nDeprecated: Configure the 'adbSocket' property instead.",
|
"description": "Port number to connect to the local ADB (Android Debug Bridge) instance. Default: 5037",
|
||||||
"default": 5037
|
"default": 5037
|
||||||
},
|
},
|
||||||
"adbSocket": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "`host : port` configuration for connecting to the ADB (Android Debug Bridge) server instance. Default: \"localhost:5037\"",
|
|
||||||
"default": "localhost:5037"
|
|
||||||
},
|
|
||||||
"autoStartADB": {
|
"autoStartADB": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"description": "Automatically attempt to launch 'adb start-server' if not already started. Default: true",
|
"description": "Automatically launch 'adb start-server' if not already started. Default: true",
|
||||||
"default": true
|
"default": true
|
||||||
},
|
},
|
||||||
"callStackDisplaySize": {
|
"callStackDisplaySize": {
|
||||||
@@ -282,11 +278,6 @@
|
|||||||
"description": "Number of entries to display in call stack views (for locations outside of the project source). 0 shows the entire call stack. Default: 1",
|
"description": "Number of entries to display in call stack views (for locations outside of the project source). 0 shows the entire call stack. Default: 1",
|
||||||
"default": 1
|
"default": 1
|
||||||
},
|
},
|
||||||
"jdwpPort": {
|
|
||||||
"type": "integer",
|
|
||||||
"description": "Manually specify the local port used for connecting to the on-device debugger client.\nThis can be useful if you are using port-forwarding to connect to a remote device.\nThe specified port must be available and different from the ADB socket port.\nSet to 0 for automatic (dynamic) assignment.\nDefault: 0",
|
|
||||||
"default": 0
|
|
||||||
},
|
|
||||||
"launchActivity": {
|
"launchActivity": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Manually specify the activity to run when the app is started.",
|
"description": "Manually specify the activity to run when the app is started.",
|
||||||
@@ -334,6 +325,7 @@
|
|||||||
"attach": {
|
"attach": {
|
||||||
"required": [
|
"required": [
|
||||||
"appSrcRoot",
|
"appSrcRoot",
|
||||||
|
"adbPort",
|
||||||
"processId"
|
"processId"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -344,19 +336,9 @@
|
|||||||
},
|
},
|
||||||
"adbPort": {
|
"adbPort": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Port number to connect to the local ADB (Android Debug Bridge) instance. Default: 5037\nDeprecated: Configure the 'adbSocket' property instead.",
|
"description": "Port number to connect to the local ADB (Android Debug Bridge) instance. Default: 5037",
|
||||||
"default": 5037
|
"default": 5037
|
||||||
},
|
},
|
||||||
"adbSocket": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "`host : port` configuration for connecting to the ADB (Android Debug Bridge) server instance. Default: \"localhost:5037\"",
|
|
||||||
"default": "localhost:5037"
|
|
||||||
},
|
|
||||||
"jdwpPort": {
|
|
||||||
"type": "integer",
|
|
||||||
"description": "Manually specify the local port used for connecting to the on-device debugger client.\nThis can be useful if you are using port-forwarding to connect to a remote device.\nThe specified port must be available and different from the ADB socket port.\nSet to 0 for automatic (dynamic) assignment.\nDefault: 0",
|
|
||||||
"default": 0
|
|
||||||
},
|
|
||||||
"processId": {
|
"processId": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "PID of process to attach to.\n\"${command:PickAndroidProcess}\" will display a list of debuggable PIDs to choose from during launch.",
|
"description": "PID of process to attach to.\n\"${command:PickAndroidProcess}\" will display a list of debuggable PIDs to choose from during launch.",
|
||||||
|
|||||||
@@ -36,94 +36,17 @@ function parse_device_list(data, extended = false) {
|
|||||||
return devicelist;
|
return devicelist;
|
||||||
}
|
}
|
||||||
|
|
||||||
let adbSocketParams;
|
|
||||||
/**
|
|
||||||
* Return the host and port for connecting to the ADB server
|
|
||||||
*/
|
|
||||||
function getADBSocketParams() {
|
|
||||||
// this is memoized to prevent alterations once the debug session is up and running
|
|
||||||
if (adbSocketParams) {
|
|
||||||
return adbSocketParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
return adbSocketParams = getIntialADBSocketParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the socket parameters for connecting to an ADB server instance.
|
|
||||||
|
|
||||||
* In priority order (highest first):
|
|
||||||
* 1. adbSocket debug configuration value
|
|
||||||
* 2. non-default adbPort debug configuration value (using localhost)
|
|
||||||
* 3. ADB_SERVER_SOCKET environment variable
|
|
||||||
* 4. ANDROID_ADB_SERVER_ADDRESS / ANDROID_ADB_SERVER_PORT environment variables
|
|
||||||
* 5. [localhost]:5037
|
|
||||||
*/
|
|
||||||
function getIntialADBSocketParams() {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a trimmed environment variable or return a blank string
|
|
||||||
* @param {string} name
|
|
||||||
*/
|
|
||||||
function envValue(name) {
|
|
||||||
return (process.env[name] || '').trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
function decode_port_string(s) {
|
|
||||||
if (!/^\d+$/.test(s)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const portnum = parseInt(s, 10);
|
|
||||||
if (portnum < 1 || portnum > 65535) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
return portnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
const default_host = '', default_port = 5037;
|
|
||||||
|
|
||||||
// the ADBSocket.HostPort value is automatically set with adbSocket/adbPort values from
|
|
||||||
// the debug configuration when the debugger session starts.
|
|
||||||
let socket_str = ADBSocket.HostPort.trim();
|
|
||||||
|
|
||||||
if (socket_str !== ADBSocket.DefaultHostPort) {
|
|
||||||
// non-default debug configuration values are configured (1. or 2.)
|
|
||||||
const [host, port] = socket_str.split(':');
|
|
||||||
return {
|
|
||||||
host,
|
|
||||||
port: decode_port_string(port) || default_port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ADB_SERVER_SOCKET=tcp:<host>:<port>
|
|
||||||
const adb_server_socket_match = envValue('ADB_SERVER_SOCKET').match(/^\s*tcp(?::(.*))?(?::(\d+))\s*$/);
|
|
||||||
if (adb_server_socket_match) {
|
|
||||||
return {
|
|
||||||
host: adb_server_socket_match[1] || default_host,
|
|
||||||
port: decode_port_string(adb_server_socket_match[2]) || default_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
host: envValue('ANDROID_ADB_SERVER_ADDRESS') || default_host,
|
|
||||||
port: decode_port_string(envValue('ANDROID_ADB_SERVER_PORT')) || default_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ADBClient {
|
class ADBClient {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} [deviceid]
|
* @param {string} [deviceid]
|
||||||
* @param {number} [adbPort] the port number to connect to ADB
|
* @param {number} [adbPort] the port number to connect to ADB
|
||||||
* @param {number} [adbHost] the hostname/ip address to connect to ADB
|
|
||||||
*/
|
*/
|
||||||
constructor(deviceid, adbPort, adbHost) {
|
constructor(deviceid, adbPort = ADBSocket.ADBPort) {
|
||||||
this.deviceid = deviceid;
|
this.deviceid = deviceid;
|
||||||
this.adbsocket = null;
|
this.adbsocket = null;
|
||||||
this.jdwp_socket = null;
|
this.jdwp_socket = null;
|
||||||
const default_adb_socket = getADBSocketParams();
|
this.adbPort = adbPort;
|
||||||
this.adbHost = adbHost || default_adb_socket.host;
|
|
||||||
this.adbPort = adbPort || default_adb_socket.port;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async test_adb_connection() {
|
async test_adb_connection() {
|
||||||
@@ -247,10 +170,7 @@ class ADBClient {
|
|||||||
// note that upon success, this method does not close the connection (it must be left open for
|
// note that upon success, this method does not close the connection (it must be left open for
|
||||||
// future commands to be sent over the jdwp socket)
|
// future commands to be sent over the jdwp socket)
|
||||||
this.jdwp_socket = new JDWPSocket(o.onreply, o.ondisconnect);
|
this.jdwp_socket = new JDWPSocket(o.onreply, o.ondisconnect);
|
||||||
// assume the 'local' port (routed to connect to the process on the device)
|
await this.jdwp_socket.connect(o.localport)
|
||||||
// is set up on the same host that the adb server is running on
|
|
||||||
const adb_server_socket = getADBSocketParams();
|
|
||||||
await this.jdwp_socket.connect(o.localport, adb_server_socket.host);
|
|
||||||
await this.jdwp_socket.start();
|
await this.jdwp_socket.start();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -356,9 +276,12 @@ class ADBClient {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
connect_to_adb() {
|
/**
|
||||||
|
* @param {string} [hostname]
|
||||||
|
*/
|
||||||
|
connect_to_adb(hostname = '127.0.0.1') {
|
||||||
this.adbsocket = new ADBSocket();
|
this.adbsocket = new ADBSocket();
|
||||||
return this.adbsocket.connect(this.adbPort, this.adbHost);
|
return this.adbsocket.connect(this.adbPort, hostname);
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnect_from_adb () {
|
disconnect_from_adb () {
|
||||||
@@ -367,4 +290,3 @@ class ADBClient {
|
|||||||
};
|
};
|
||||||
|
|
||||||
exports.ADBClient = ADBClient;
|
exports.ADBClient = ADBClient;
|
||||||
exports.getADBSocketParams = getADBSocketParams;
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const {
|
|||||||
// node and external modules
|
// node and external modules
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const uuidv4 = require('uuid').v4;
|
||||||
|
|
||||||
// our stuff
|
// our stuff
|
||||||
const { ADBClient } = require('./adbclient');
|
const { ADBClient } = require('./adbclient');
|
||||||
@@ -110,8 +111,9 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
|
|
||||||
this.terminate_reason = '';
|
this.terminate_reason = '';
|
||||||
|
|
||||||
|
this.session_id = uuidv4();
|
||||||
this.session_start = new Date();
|
this.session_start = new Date();
|
||||||
analytics.init(undefined, undefined, undefined, '', require('../package.json'), {}, 'debugger-start');
|
analytics.init();
|
||||||
|
|
||||||
// this debugger uses one-based lines and columns
|
// this debugger uses one-based lines and columns
|
||||||
this.setDebuggerLinesStartAt1(true);
|
this.setDebuggerLinesStartAt1(true);
|
||||||
@@ -137,8 +139,8 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
response.body.supportsExceptionInfoRequest = true;
|
response.body.supportsExceptionInfoRequest = true;
|
||||||
response.body.supportsHitConditionalBreakpoints = true;
|
response.body.supportsHitConditionalBreakpoints = true;
|
||||||
|
|
||||||
this.sendResponse(response);
|
this.sendResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} msg
|
* @param {string} msg
|
||||||
@@ -323,11 +325,8 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef AndroidAttachArguments
|
* @typedef AndroidAttachArguments
|
||||||
* @property {number} adbPort
|
|
||||||
* @property {string} adbSocket
|
|
||||||
* @property {string} appSrcRoot
|
* @property {string} appSrcRoot
|
||||||
* @property {boolean} autoStartADB
|
* @property {boolean} autoStartADB
|
||||||
* @property {number} jdwpPort
|
|
||||||
* @property {number} processId
|
* @property {number} processId
|
||||||
* @property {string} targetDevice
|
* @property {string} targetDevice
|
||||||
* @property {boolean} trace
|
* @property {boolean} trace
|
||||||
@@ -341,7 +340,7 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
this.trace = args.trace;
|
this.trace = args.trace;
|
||||||
onMessagePrint(this.LOG.bind(this));
|
onMessagePrint(this.LOG.bind(this));
|
||||||
}
|
}
|
||||||
D(JSON.stringify({type: 'attach', args, env:process.env}, null, ' '));
|
D(`Attach: ${JSON.stringify(args)}`);
|
||||||
|
|
||||||
if (args.targetDevice === 'null') {
|
if (args.targetDevice === 'null') {
|
||||||
// "null" is returned from the device picker if there's an error or if the
|
// "null" is returned from the device picker if there's an error or if the
|
||||||
@@ -369,18 +368,6 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the custom ADB host and port
|
|
||||||
if (typeof args.adbSocket === 'string' && args.adbSocket) {
|
|
||||||
ADBSocket.HostPort = args.adbSocket;
|
|
||||||
} else if (typeof args.adbPort === 'number' && args.adbPort >= 0 && args.adbPort <= 65535) {
|
|
||||||
ADBSocket.HostPort = `:${args.adbPort}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the fixed JDWP port number (if any)
|
|
||||||
if (typeof args.jdwpPort === 'number' && args.jdwpPort >= 0 && args.jdwpPort <= 65535) {
|
|
||||||
Debugger.portManager.fixedport = args.jdwpPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// app_src_root must end in a path-separator for correct validation of sub-paths
|
// app_src_root must end in a path-separator for correct validation of sub-paths
|
||||||
this.app_src_root = ensure_path_end_slash(args.appSrcRoot);
|
this.app_src_root = ensure_path_end_slash(args.appSrcRoot);
|
||||||
@@ -443,28 +430,25 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
await this.dbgr.resume();
|
await this.dbgr.resume();
|
||||||
|
|
||||||
analytics.event('debug-started', {
|
analytics.event('debug-started', {
|
||||||
dbg_start: this.session_start.toTimeString(),
|
dbg_session_id: this.session_id,
|
||||||
|
dbg_start: this.session_start.toLocaleTimeString(),
|
||||||
dbg_tz: this.session_start.getTimezoneOffset(),
|
dbg_tz: this.session_start.getTimezoneOffset(),
|
||||||
dbg_kind: 'attach',
|
dbg_kind: 'attach',
|
||||||
dbg_device_api: this.device_api_level,
|
dbg_device_api: this.device_api_level,
|
||||||
dbg_emulator: /^emulator/.test(this._device.serial),
|
dbg_emulator: /^emulator/.test(this._device.serial),
|
||||||
})
|
})
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
const msg = e.message||e.msg;
|
|
||||||
//this.performDisconnect();
|
//this.performDisconnect();
|
||||||
// exceptions use message, adbclient uses msg
|
// exceptions use message, adbclient uses msg
|
||||||
this.LOG('Attach failed: '+(msg||'No additional information is available'));
|
this.LOG('Attach failed: '+(e.message||e.msg||'No additional information is available'));
|
||||||
// more info for adb connect errors
|
// more info for adb connect errors
|
||||||
if (/^ADB server is not running/.test(e.msg)) {
|
if (/^ADB server is not running/.test(e.msg)) {
|
||||||
this.LOG('Make sure the Android SDK Platform Tools are installed and run:');
|
this.LOG('Make sure the Android SDK Platform Tools are installed and run:');
|
||||||
this.LOG(' adb start-server');
|
this.LOG(' adb start-server');
|
||||||
this.LOG('If you are running ADB using a non-default configuration, also make sure the adbSocket value in your launch.json is correct.');
|
this.LOG('If you are running ADB on a non-default port, also make sure the adbPort value in your launch.json is correct.');
|
||||||
}
|
|
||||||
if (/ADB|JDWP/.test(msg)) {
|
|
||||||
this.LOG('Ensure any instances of Android Studio are closed and ADB is running.');
|
|
||||||
}
|
}
|
||||||
// tell the client we're done
|
// tell the client we're done
|
||||||
this.terminate_reason = `start-exception: ${msg}`;
|
this.terminate_reason = `start-exception: ${e.message||e.msg}`;
|
||||||
this.sendEvent(new TerminatedEvent(false));
|
this.sendEvent(new TerminatedEvent(false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -472,13 +456,11 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
/**
|
/**
|
||||||
* @typedef AndroidLaunchArguments
|
* @typedef AndroidLaunchArguments
|
||||||
* @property {number} adbPort
|
* @property {number} adbPort
|
||||||
* @property {string} adbSocket
|
|
||||||
* @property {string[]} amStartArgs
|
* @property {string[]} amStartArgs
|
||||||
* @property {string} apkFile
|
* @property {string} apkFile
|
||||||
* @property {string} appSrcRoot
|
* @property {string} appSrcRoot
|
||||||
* @property {boolean} autoStartADB
|
* @property {boolean} autoStartADB
|
||||||
* @property {number} callStackDisplaySize
|
* @property {number} callStackDisplaySize
|
||||||
* @property {number} jdwpPort
|
|
||||||
* @property {string} launchActivity
|
* @property {string} launchActivity
|
||||||
* @property {string} manifestFile
|
* @property {string} manifestFile
|
||||||
* @property {string[]} pmInstallArgs
|
* @property {string[]} pmInstallArgs
|
||||||
@@ -498,7 +480,7 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
this.trace = args.trace;
|
this.trace = args.trace;
|
||||||
onMessagePrint(this.LOG.bind(this));
|
onMessagePrint(this.LOG.bind(this));
|
||||||
}
|
}
|
||||||
D(JSON.stringify({type: 'launch', args, env:process.env}, null, ' '));
|
D(`Launch: ${JSON.stringify(args)}`);
|
||||||
|
|
||||||
if (args.targetDevice === 'null') {
|
if (args.targetDevice === 'null') {
|
||||||
// "null" is returned from the device picker if there's an error or if the
|
// "null" is returned from the device picker if there's an error or if the
|
||||||
@@ -526,16 +508,9 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the custom ADB host and port
|
// set the custom ADB port - this should be changed to pass it to each ADBClient instance
|
||||||
if (typeof args.adbSocket === 'string' && args.adbSocket) {
|
if (typeof args.adbPort === 'number' && args.adbPort >= 0 && args.adbPort <= 65535) {
|
||||||
ADBSocket.HostPort = args.adbSocket;
|
ADBSocket.ADBPort = args.adbPort;
|
||||||
} else if (typeof args.adbPort === 'number' && args.adbPort >= 0 && args.adbPort <= 65535) {
|
|
||||||
ADBSocket.HostPort = `:${args.adbPort}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the fixed JDWP port number (if any)
|
|
||||||
if (typeof args.jdwpPort === 'number' && args.jdwpPort >= 0 && args.jdwpPort <= 65535) {
|
|
||||||
Debugger.portManager.fixedport = args.jdwpPort;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -608,7 +583,8 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
await this.dbgr.resume();
|
await this.dbgr.resume();
|
||||||
|
|
||||||
analytics.event('debug-started', {
|
analytics.event('debug-started', {
|
||||||
dbg_start: this.session_start.toTimeString(),
|
dbg_session_id: this.session_id,
|
||||||
|
dbg_start: this.session_start.toLocaleTimeString(),
|
||||||
dbg_tz: this.session_start.getTimezoneOffset(),
|
dbg_tz: this.session_start.getTimezoneOffset(),
|
||||||
dbg_kind: 'debug',
|
dbg_kind: 'debug',
|
||||||
dbg_device_api: this.device_api_level,
|
dbg_device_api: this.device_api_level,
|
||||||
@@ -619,20 +595,16 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
|
|
||||||
this.LOG('Application started');
|
this.LOG('Application started');
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
const msg = e.message || e.msg;
|
|
||||||
// exceptions use message, adbclient uses msg
|
// exceptions use message, adbclient uses msg
|
||||||
this.LOG('Launch failed: '+(msg || 'No additional information is available'));
|
this.LOG('Launch failed: '+(e.message||e.msg||'No additional information is available'));
|
||||||
// more info for adb connect errors
|
// more info for adb connect errors
|
||||||
if (/^ADB server is not running/.test(e.msg)) {
|
if (/^ADB server is not running/.test(e.msg)) {
|
||||||
this.LOG('Make sure the Android SDK Platform Tools are installed and run:');
|
this.LOG('Make sure the Android SDK Platform Tools are installed and run:');
|
||||||
this.LOG(' adb start-server');
|
this.LOG(' adb start-server');
|
||||||
this.LOG('If you are running ADB on a non-default port, also make sure the adbPort value in your launch.json is correct.');
|
this.LOG('If you are running ADB on a non-default port, also make sure the adbPort value in your launch.json is correct.');
|
||||||
}
|
}
|
||||||
if (/ADB|JDWP/.test(msg)) {
|
|
||||||
this.LOG('Ensure any instances of Android Studio are closed.');
|
|
||||||
}
|
|
||||||
// tell the client we're done
|
// tell the client we're done
|
||||||
this.terminate_reason = `start-exception: ${msg}`;
|
this.terminate_reason = `start-exception: ${e.message||e.msg}`;
|
||||||
this.sendEvent(new TerminatedEvent(false));
|
this.sendEvent(new TerminatedEvent(false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -813,8 +785,8 @@ class AndroidDebugSession extends DebugSession {
|
|||||||
D('disconnectRequest');
|
D('disconnectRequest');
|
||||||
this._isDisconnecting = true;
|
this._isDisconnecting = true;
|
||||||
analytics.event('debug-end', {
|
analytics.event('debug-end', {
|
||||||
|
dbg_session_id: this.session_id,
|
||||||
dbg_elapsed: Math.trunc((Date.now() - this.session_start.getTime())/1e3),
|
dbg_elapsed: Math.trunc((Date.now() - this.session_start.getTime())/1e3),
|
||||||
dbg_kind: this.debug_mode,
|
|
||||||
dbg_term_reason: this.terminate_reason,
|
dbg_term_reason: this.terminate_reason,
|
||||||
});
|
});
|
||||||
if (this.debuggerAttached) {
|
if (this.debuggerAttached) {
|
||||||
|
|||||||
@@ -52,14 +52,9 @@ class Debugger extends EventEmitter {
|
|||||||
|
|
||||||
static portManager = {
|
static portManager = {
|
||||||
portrange: { lowest: 31000, highest: 31099 },
|
portrange: { lowest: 31000, highest: 31099 },
|
||||||
fixedport: 0,
|
|
||||||
inuseports: new Set(),
|
inuseports: new Set(),
|
||||||
debuggers: {},
|
debuggers: {},
|
||||||
reserveport: function () {
|
reserveport: function () {
|
||||||
if (this.fixedport > 0 && this.fixedport < 65536) {
|
|
||||||
this.inuseports.add(this.fixedport);
|
|
||||||
return this.fixedport;
|
|
||||||
}
|
|
||||||
// choose a random port to use each time
|
// choose a random port to use each time
|
||||||
for (let i = 0; i < 10000; i++) {
|
for (let i = 0; i < 10000; i++) {
|
||||||
const portidx = this.portrange.lowest + ((Math.random() * 100) | 0);
|
const portidx = this.portrange.lowest + ((Math.random() * 100) | 0);
|
||||||
|
|||||||
@@ -7,17 +7,10 @@ const AndroidSocket = require('./androidsocket');
|
|||||||
class ADBSocket extends AndroidSocket {
|
class ADBSocket extends AndroidSocket {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The host and port number to run ADB commands on, in 'host:port' format (host part is optional).
|
* The port number to run ADB on.
|
||||||
* The value can be overriden by the adbSocket (or the deprecated adbPort) value in each debug configuration.
|
* The value can be overriden by the adbPort value in each configuration.
|
||||||
*
|
|
||||||
* The default host value is left blank as this is the simplest way to
|
|
||||||
* specify "connect to the local machine" without explicitly specifying
|
|
||||||
* 'localhost' or '127.0.0.1' (which may be mapped to something else)
|
|
||||||
*/
|
*/
|
||||||
static HostPort = `:5037`;
|
static ADBPort = 5037;
|
||||||
static get DefaultHostPort() {
|
|
||||||
return `:5037`
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super('ADBSocket');
|
super('ADBSocket');
|
||||||
@@ -25,14 +18,13 @@ class ADBSocket extends AndroidSocket {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads and checks the reply from an ADB command
|
* Reads and checks the reply from an ADB command
|
||||||
* @param {string} command
|
|
||||||
* @param {boolean} [throw_on_fail] true if the function should throw on non-OKAY status
|
* @param {boolean} [throw_on_fail] true if the function should throw on non-OKAY status
|
||||||
*/
|
*/
|
||||||
async read_adb_status(command, throw_on_fail = true) {
|
async read_adb_status(throw_on_fail = true) {
|
||||||
// read back the status
|
// read back the status
|
||||||
const status = await this.read_bytes(4, 'latin1')
|
const status = await this.read_bytes(4, 'latin1')
|
||||||
if (status !== 'OKAY' && throw_on_fail) {
|
if (status !== 'OKAY' && throw_on_fail) {
|
||||||
throw new Error(`ADB command '${command}' failed. Status: '${status}'`);
|
throw new Error(`ADB command failed. Status: '${status}'`);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@@ -65,7 +57,7 @@ class ADBSocket extends AndroidSocket {
|
|||||||
*/
|
*/
|
||||||
async cmd_and_status(command) {
|
async cmd_and_status(command) {
|
||||||
await this.write_adb_command(command);
|
await this.write_adb_command(command);
|
||||||
return this.read_adb_status(command);
|
return this.read_adb_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -112,7 +104,7 @@ class ADBSocket extends AndroidSocket {
|
|||||||
await this.write_bytes(done_and_mtime);
|
await this.write_bytes(done_and_mtime);
|
||||||
|
|
||||||
// read the final status and any error message
|
// read the final status and any error message
|
||||||
const result = await this.read_adb_status('sync:', false);
|
const result = await this.read_adb_status(false);
|
||||||
const failmsg = await this.read_le_length_data('latin1');
|
const failmsg = await this.read_le_length_data('latin1');
|
||||||
|
|
||||||
// finish the transfer mode
|
// finish the transfer mode
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
const { ADBClient, getADBSocketParams } = require('../adbclient');
|
const { ADBClient } = require('../adbclient');
|
||||||
|
const ADBSocket = require('../sockets/adbsocket');
|
||||||
const { LOG } = require('../utils/print');
|
const { LOG } = require('../utils/print');
|
||||||
|
|
||||||
function getAndroidSDKFolder() {
|
function getAndroidSDKFolder() {
|
||||||
@@ -40,21 +41,19 @@ function getADBPathName() {
|
|||||||
return path.join(android_sdk, 'platform-tools', /^win/.test(process.platform)?'adb.exe':'adb');
|
return path.join(android_sdk, 'platform-tools', /^win/.test(process.platform)?'adb.exe':'adb');
|
||||||
}
|
}
|
||||||
|
|
||||||
function startADBServer() {
|
/**
|
||||||
|
* @param {number} port
|
||||||
|
*/
|
||||||
|
function startADBServer(port) {
|
||||||
|
if (typeof port !== 'number' || port <= 0 || port >= 65536) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const adb_exe_path = getADBPathName();
|
const adb_exe_path = getADBPathName();
|
||||||
if (!adb_exe_path) {
|
if (!adb_exe_path) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const adb_socket = getADBSocketParams();
|
const adb_start_server_args = ['-P',`${port}`,'start-server'];
|
||||||
// don't try and start ADB if the server is on a remote host
|
|
||||||
if (!/^(localhost|127\.\d+\.\d+\.\d+)?$/.test(adb_socket.host)) {
|
|
||||||
LOG(`Cannot launch adb server on remote host ${adb_socket.host}:${adb_socket.port}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const adb_start_server_args = ['-P',`${adb_socket.port}`,'start-server'];
|
|
||||||
if (adb_socket.host) {
|
|
||||||
adb_start_server_args.unshift(`-H`, adb_socket.host);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
LOG([adb_exe_path, ...adb_start_server_args].join(' '));
|
LOG([adb_exe_path, ...adb_start_server_args].join(' '));
|
||||||
const stdout = require('child_process').execFileSync(adb_exe_path, adb_start_server_args, {
|
const stdout = require('child_process').execFileSync(adb_exe_path, adb_start_server_args, {
|
||||||
@@ -74,7 +73,7 @@ async function checkADBStarted(auto_start) {
|
|||||||
const err = await new ADBClient().test_adb_connection();
|
const err = await new ADBClient().test_adb_connection();
|
||||||
// if adb is not running, see if we can start it ourselves using ANDROID_HOME (and a sensible port number)
|
// if adb is not running, see if we can start it ourselves using ANDROID_HOME (and a sensible port number)
|
||||||
if (err && auto_start) {
|
if (err && auto_start) {
|
||||||
return startADBServer();
|
return startADBServer(ADBSocket.ADBPort);
|
||||||
}
|
}
|
||||||
return !err;
|
return !err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user