@aiot-toolkit/emulator 2.0.1-alpha.9 → 2.0.2-batchmanifest-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -1
- package/lib/avd/index.d.ts +12 -0
- package/lib/avd/index.js +58 -36
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -5
- package/lib/instance/common.d.ts +42 -0
- package/lib/instance/common.js +227 -0
- package/lib/instance/dev.d.ts +35 -0
- package/lib/instance/dev.js +258 -0
- package/lib/instance/index.d.ts +13 -0
- package/lib/instance/index.js +38 -0
- package/lib/instance/miwear.d.ts +74 -0
- package/lib/instance/miwear.js +437 -0
- package/lib/instance/preDev.d.ts +51 -0
- package/lib/instance/preDev.js +285 -0
- package/lib/static/advancedFeatures.ini +1 -0
- package/lib/static/constants.d.ts +17 -0
- package/lib/static/constants.js +25 -3
- package/lib/static/debugger_ip.cfg +1 -0
- package/lib/typing/Avd.js +0 -2
- package/lib/typing/Instance.d.ts +17 -1
- package/lib/typing/Instance.js +0 -2
- package/lib/utils/index.d.ts +13 -0
- package/lib/utils/index.js +88 -0
- package/package.json +8 -4
- package/lib/avd/index.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/instance/goldfish.d.ts +0 -35
- package/lib/instance/goldfish.js +0 -312
- package/lib/instance/goldfish.js.map +0 -1
- package/lib/static/constants.js.map +0 -1
- package/lib/typing/Avd.js.map +0 -1
- package/lib/typing/Instance.js.map +0 -1
package/lib/instance/goldfish.js
DELETED
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
-
};
|
|
37
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
const UxFileUtils_1 = __importDefault(require("@aiot-toolkit/aiotpack/lib/utils/ux/UxFileUtils"));
|
|
39
|
-
const shared_utils_1 = require("@aiot-toolkit/shared-utils");
|
|
40
|
-
const ColorConsole_1 = __importDefault(require("@aiot-toolkit/shared-utils/lib/ColorConsole"));
|
|
41
|
-
const FileUtil_1 = __importDefault(require("@aiot-toolkit/shared-utils/lib/utils/FileUtil"));
|
|
42
|
-
const adbMiwt = __importStar(require("@miwt/adb"));
|
|
43
|
-
const child_process_1 = require("child_process");
|
|
44
|
-
const find_process_1 = __importDefault(require("find-process"));
|
|
45
|
-
const fs_1 = __importDefault(require("fs"));
|
|
46
|
-
const os_1 = __importDefault(require("os"));
|
|
47
|
-
const path_1 = __importDefault(require("path"));
|
|
48
|
-
const portfinder_1 = __importDefault(require("portfinder"));
|
|
49
|
-
const avd_1 = __importDefault(require("../avd"));
|
|
50
|
-
const constants_1 = require("../static/constants");
|
|
51
|
-
class GoldfishInstance {
|
|
52
|
-
constructor(params) {
|
|
53
|
-
this.adbPort = 15555;
|
|
54
|
-
this.debugPort = 10055;
|
|
55
|
-
this.host9pPort = 7878;
|
|
56
|
-
this.projectPath = params.projectPath;
|
|
57
|
-
this.sdkHome = params.sdkHome || constants_1.defaultSDKHome;
|
|
58
|
-
this.avdHome = params.avdHome || constants_1.defaultAvdHome;
|
|
59
|
-
this.velaAvdCls = new avd_1.default({
|
|
60
|
-
sdkHome: this.sdkHome,
|
|
61
|
-
avdHome: this.avdHome
|
|
62
|
-
});
|
|
63
|
-
const { package: appPackageName } = UxFileUtils_1.default.getMainfestInfo(this.projectPath, params.sourceRoot);
|
|
64
|
-
this.packageName = appPackageName;
|
|
65
|
-
}
|
|
66
|
-
/** 获取模拟器二进制文件所在位置 */
|
|
67
|
-
getEmulatorBinPath() {
|
|
68
|
-
const osPlatform = os_1.default.platform();
|
|
69
|
-
const osArch = os_1.default.arch();
|
|
70
|
-
const platform = osPlatform === 'win32' ? 'windows' : osPlatform;
|
|
71
|
-
const arch = (osArch === 'arm64' || osArch === 'aarch64') ? 'aarch64' : 'x86_64';
|
|
72
|
-
return path_1.default.resolve(constants_1.defaultEmulatorHome, `${platform}-${arch}`, 'emulator');
|
|
73
|
-
}
|
|
74
|
-
/** 在goldfish模拟器中运行快应用 */
|
|
75
|
-
start(options) {
|
|
76
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
-
// host启动9p server
|
|
78
|
-
yield this.ensure9pServerRunnning();
|
|
79
|
-
// TODO: 打包快应用
|
|
80
|
-
// 将rpk推到host的defaultQuickappHome目录
|
|
81
|
-
this.pushRpk();
|
|
82
|
-
// 启动模拟器
|
|
83
|
-
yield this.startGoldfish(options);
|
|
84
|
-
const connected = yield this.connectGoldfish();
|
|
85
|
-
if (connected) {
|
|
86
|
-
ColorConsole_1.default.log({
|
|
87
|
-
message: '### Emulator ### Goldfish emulator connected successfully'
|
|
88
|
-
});
|
|
89
|
-
// 在模拟器中启动快应用
|
|
90
|
-
this.startupQuickApp(options);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
ColorConsole_1.default.log({
|
|
94
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
95
|
-
message: '### Emulator ### Failed to connect emulator, please check whether the adb is normal'
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/** 在goldfish中启动快应用 */
|
|
101
|
-
startupQuickApp(options) {
|
|
102
|
-
try {
|
|
103
|
-
const appMountDir = path_1.default.resolve(this.sdkHome, 'qa');
|
|
104
|
-
const mountCmd = `adb -s 127.0.0.1:${this.adbPort} shell mount -t v9fs -o tag=10.0.2.2,port=${this.host9pPort},aname=${appMountDir} /data`;
|
|
105
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Excuting adb cmd: ${mountCmd}` });
|
|
106
|
-
adbMiwt.execAdbCmdSync(mountCmd);
|
|
107
|
-
let vappCmd = `adb -s 127.0.0.1:${this.adbPort} shell vapp app/${this.packageName} &`;
|
|
108
|
-
if (options.devtool) {
|
|
109
|
-
vappCmd = `adb -s 127.0.0.1:${this.adbPort} shell vapp --jsdebugger=10.0.2.15:101 app/${this.packageName} &`;
|
|
110
|
-
}
|
|
111
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Excuting adb cmd: ${vappCmd}` });
|
|
112
|
-
// vapp进程会一直pending,不会退出。这里必须加stdio: 'ignore',否则快应用无法运行成功
|
|
113
|
-
adbMiwt.execAdbCmdAsync(vappCmd, { stdio: 'ignore', encoding: 'utf-8' });
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
ColorConsole_1.default.log({
|
|
117
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
118
|
-
message: `### Emulator ### Failed to startup quickapp: ${e.message}`,
|
|
119
|
-
isOnlyPrintError: true
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/** host启动9pServer */
|
|
124
|
-
ensure9pServerRunnning() {
|
|
125
|
-
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
126
|
-
var _a;
|
|
127
|
-
const yaFileName = os_1.default.platform() === 'win32' ? 'ya-vm-file-server.exe' : 'ya-vm-file-server';
|
|
128
|
-
const pidList = yield (0, find_process_1.default)('name', yaFileName);
|
|
129
|
-
if (pidList.length > 0) {
|
|
130
|
-
ColorConsole_1.default.log({ message: '### Emulator ### 9p server started in host' });
|
|
131
|
-
return resolve();
|
|
132
|
-
}
|
|
133
|
-
ColorConsole_1.default.log({ message: '### Emulator ### Starting 9p server in host' });
|
|
134
|
-
const quickappMountDir = path_1.default.resolve(this.sdkHome, 'qa');
|
|
135
|
-
const serverBinPath = path_1.default.resolve(constants_1.defaultToolsHome, yaFileName);
|
|
136
|
-
fs_1.default.chmodSync(serverBinPath, 0o777);
|
|
137
|
-
this.host9pPort = yield portfinder_1.default.getPortPromise({ port: 7878 });
|
|
138
|
-
const address = `127.0.0.1:${this.host9pPort}`;
|
|
139
|
-
this.v9fsProcess = (0, child_process_1.spawn)(serverBinPath, [
|
|
140
|
-
'--mount-point',
|
|
141
|
-
quickappMountDir,
|
|
142
|
-
'--network-address',
|
|
143
|
-
address,
|
|
144
|
-
'--debug'
|
|
145
|
-
]);
|
|
146
|
-
(_a = this.v9fsProcess.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
147
|
-
const output = data.toString();
|
|
148
|
-
if (output.match(/Server started, listening on: 127.0.0.1:(\d+)/)) {
|
|
149
|
-
ColorConsole_1.default.log({ message: output });
|
|
150
|
-
ColorConsole_1.default.log({ message: '### Emulator ### 9p server starts successfully' });
|
|
151
|
-
return resolve();
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
this.v9fsProcess.on('exit', (code) => {
|
|
155
|
-
ColorConsole_1.default.log({
|
|
156
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
157
|
-
message: `### Emulator ### ya-vm-file-server exited with code ${code}`,
|
|
158
|
-
isOnlyPrintError: true
|
|
159
|
-
});
|
|
160
|
-
return reject();
|
|
161
|
-
});
|
|
162
|
-
}));
|
|
163
|
-
}
|
|
164
|
-
/** 启动goldfish模拟器 */
|
|
165
|
-
startGoldfish(options) {
|
|
166
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
-
const { avdName, devtool } = options;
|
|
168
|
-
const emulatorBin = this.getEmulatorBinPath();
|
|
169
|
-
ColorConsole_1.default.log({ message: `### Emulator ### emulator path: ${emulatorBin}` });
|
|
170
|
-
const avdInfo = this.velaAvdCls.getVelaAvdInfo(avdName);
|
|
171
|
-
const { avdArch, avdImagePath } = avdInfo;
|
|
172
|
-
this.adbPort = yield portfinder_1.default.getPortPromise({ port: this.adbPort });
|
|
173
|
-
ColorConsole_1.default.log({ message: `### Emulator ### adb port: ${this.adbPort}` });
|
|
174
|
-
if (!avdImagePath) {
|
|
175
|
-
ColorConsole_1.default.log({
|
|
176
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
177
|
-
message: `### Emulator ### Unable to find vela image via avd`
|
|
178
|
-
});
|
|
179
|
-
process.exit();
|
|
180
|
-
}
|
|
181
|
-
const nuttxBinPath = path_1.default.resolve(avdImagePath, 'nuttx');
|
|
182
|
-
ColorConsole_1.default.log({ message: `### Emulator ### nuttx path: ${nuttxBinPath}` });
|
|
183
|
-
let portMappingStr = `user,id=u1,hostfwd=tcp:127.0.0.1:${this.adbPort}-10.0.2.15:5555`;
|
|
184
|
-
if (devtool) {
|
|
185
|
-
this.debugPort = yield portfinder_1.default.getPortPromise({ port: this.debugPort });
|
|
186
|
-
ColorConsole_1.default.log({ message: `### Emulator ### debug port: ${this.debugPort}` });
|
|
187
|
-
portMappingStr += `,hostfwd=tcp:127.0.0.1:${this.debugPort}-10.0.2.15:101`;
|
|
188
|
-
}
|
|
189
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Start qemu with TCP: ${portMappingStr}` });
|
|
190
|
-
const stdioType = options.disableNSH ? 'pipe' : 'inherit';
|
|
191
|
-
return new Promise((resolve) => {
|
|
192
|
-
var _a, _b;
|
|
193
|
-
this.goldfishProcess = (0, child_process_1.spawn)(emulatorBin, [
|
|
194
|
-
'-nuttx',
|
|
195
|
-
'-avd',
|
|
196
|
-
avdName,
|
|
197
|
-
'-avd-arch',
|
|
198
|
-
avdArch,
|
|
199
|
-
'-show-kernel',
|
|
200
|
-
'-kernel',
|
|
201
|
-
nuttxBinPath,
|
|
202
|
-
'-qemu',
|
|
203
|
-
'-netdev',
|
|
204
|
-
portMappingStr,
|
|
205
|
-
'-device',
|
|
206
|
-
'virtio-net-device,netdev=u1,bus=virtio-mmio-bus.3'
|
|
207
|
-
], { stdio: stdioType });
|
|
208
|
-
if (options.disableNSH) {
|
|
209
|
-
(_a = this.goldfishProcess.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
210
|
-
console.log(data.toString());
|
|
211
|
-
if (data.toString().includes('(NSH)')) {
|
|
212
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Goldfish emulator starts successfully` });
|
|
213
|
-
resolve();
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
(_b = this.goldfishProcess.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
|
|
217
|
-
console.log(data.toString());
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
setTimeout(() => {
|
|
222
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Goldfish emulator starts successfully` });
|
|
223
|
-
resolve();
|
|
224
|
-
}, 2000);
|
|
225
|
-
}
|
|
226
|
-
this.goldfishProcess.on('exit', (code) => {
|
|
227
|
-
ColorConsole_1.default.log({
|
|
228
|
-
level: shared_utils_1.LOG_LEVEL.Error,
|
|
229
|
-
message: `### Emulator ### Goldfish emulator exited with code ${code}`,
|
|
230
|
-
isOnlyPrintError: true
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
/** 通过adb连接模拟器 */
|
|
237
|
-
connectGoldfish() {
|
|
238
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
let adbConnected = false;
|
|
240
|
-
const connectFn = () => __awaiter(this, void 0, void 0, function* () {
|
|
241
|
-
const sn = `127.0.0.1:${this.adbPort}`;
|
|
242
|
-
while (!adbConnected) {
|
|
243
|
-
const adbKillCmd = `adb kill-server`;
|
|
244
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Excuting adb cmd: ${adbKillCmd}` });
|
|
245
|
-
adbMiwt.execAdbCmdSync(adbKillCmd);
|
|
246
|
-
const adbConnectCmd = `adb connect ${sn}`;
|
|
247
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Excuting adb cmd: ${adbConnectCmd}` });
|
|
248
|
-
const str = adbMiwt.execAdbCmdSync(adbConnectCmd);
|
|
249
|
-
ColorConsole_1.default.log({ message: `### Emulator ### ${str}` });
|
|
250
|
-
const devices = yield adbMiwt.getAdbDevices();
|
|
251
|
-
ColorConsole_1.default.log({ message: `### Emulator ### adb devices: ${JSON.stringify(devices)}` });
|
|
252
|
-
adbConnected =
|
|
253
|
-
devices.filter((item) => item.sn === sn && item.status === 'device').length > 0;
|
|
254
|
-
}
|
|
255
|
-
Promise.resolve(adbConnected);
|
|
256
|
-
});
|
|
257
|
-
yield Promise.race([
|
|
258
|
-
connectFn(),
|
|
259
|
-
new Promise((resolve) => {
|
|
260
|
-
setTimeout(() => resolve(false), 600 * 1000);
|
|
261
|
-
})
|
|
262
|
-
]);
|
|
263
|
-
return adbConnected;
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
/** 将打包后的文件推到挂载的快应用目录 */
|
|
267
|
-
pushRpk() {
|
|
268
|
-
const buildDir = path_1.default.resolve(this.projectPath, 'build');
|
|
269
|
-
const { package: appPackageName } = UxFileUtils_1.default.getMainfestInfo(this.projectPath);
|
|
270
|
-
const appRunDir = path_1.default.resolve(this.sdkHome, 'qa/app', appPackageName);
|
|
271
|
-
ColorConsole_1.default.log({ message: `### Emulator ### Pushing ${appPackageName} to ${appRunDir}` });
|
|
272
|
-
fs_1.default.rmSync(appRunDir, { recursive: true, force: true });
|
|
273
|
-
FileUtil_1.default.copyFiles(buildDir, appRunDir);
|
|
274
|
-
ColorConsole_1.default.log({
|
|
275
|
-
message: `### Emulator ### Push ${appPackageName} to ${appRunDir} successfully`
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
/** 杀死进程 */
|
|
279
|
-
killProcess(currProcess) {
|
|
280
|
-
if (currProcess && currProcess.pid && currProcess.exitCode === null) {
|
|
281
|
-
console.log('process pid:', currProcess.pid);
|
|
282
|
-
try {
|
|
283
|
-
if (os_1.default.platform() === 'win32') {
|
|
284
|
-
(0, child_process_1.execSync)(`taskkill /pid ${currProcess.pid} /T /F`);
|
|
285
|
-
}
|
|
286
|
-
else if (os_1.default.platform() === 'darwin') {
|
|
287
|
-
process.kill(currProcess.pid);
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
currProcess.kill();
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
catch (err) {
|
|
294
|
-
ColorConsole_1.default.log({ message: `kill process get error :\n${err.stack}` });
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
/** 停止模拟器并释放相关资源 */
|
|
299
|
-
stop() {
|
|
300
|
-
if (this.goldfishProcess) {
|
|
301
|
-
this.killProcess(this.goldfishProcess);
|
|
302
|
-
this.goldfishProcess = undefined;
|
|
303
|
-
}
|
|
304
|
-
if (this.v9fsProcess) {
|
|
305
|
-
this.killProcess(this.v9fsProcess);
|
|
306
|
-
this.v9fsProcess = undefined;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
exports.default = GoldfishInstance;
|
|
311
|
-
|
|
312
|
-
//# sourceMappingURL=goldfish.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["instance/goldfish.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kGAAyE;AACzE,6DAAsD;AACtD,+FAAsE;AACtE,6FAAoE;AACpE,mDAAoC;AACpC,iDAA6D;AAC7D,gEAAsC;AACtC,4CAAmB;AACnB,4CAAmB;AACnB,gDAAuB;AACvB,4DAAmC;AACnC,iDAA+B;AAC/B,mDAK4B;AAG5B,MAAM,gBAAgB;IAYpB,YAAY,MAAkC;QARtC,YAAO,GAAW,KAAK,CAAA;QACxB,cAAS,GAAW,KAAK,CAAA;QACxB,eAAU,GAAW,IAAI,CAAA;QAO/B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,0BAAc,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,0BAAc,CAAA;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,aAAU,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAA;QACF,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,qBAAW,CAAC,eAAe,CAC7D,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,UAAU,CAClB,CAAA;QACD,IAAI,CAAC,WAAW,GAAG,cAAc,CAAA;IACnC,CAAC;IAED,qBAAqB;IACrB,kBAAkB;QAChB,MAAM,UAAU,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAA;QAChC,MAAM,MAAM,GAAG,YAAE,CAAC,IAAI,EAAE,CAAA;QACxB,MAAM,QAAQ,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;QAChE,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;QAChF,OAAO,cAAI,CAAC,OAAO,CAAC,+BAAmB,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;IAC7E,CAAC;IAED,yBAAyB;IACnB,KAAK,CAAC,OAAsB;;YAChC,kBAAkB;YAClB,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAA;YACnC,cAAc;YACd,mCAAmC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,QAAQ;YACR,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;YAC9C,IAAI,SAAS,EAAE;gBACb,sBAAY,CAAC,GAAG,CAAC;oBACf,OAAO,EAAE,2DAA2D;iBACrE,CAAC,CAAA;gBACF,aAAa;gBACb,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;aAC9B;iBAAM;gBACL,sBAAY,CAAC,GAAG,CAAC;oBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;oBACtB,OAAO,EACL,qFAAqF;iBACxF,CAAC,CAAA;aACH;QACH,CAAC;KAAA;IAED,sBAAsB;IACtB,eAAe,CAAC,OAAsB;QACpC,IAAI;YACF,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,OAAO,6CAA6C,IAAI,CAAC,UAAU,UAAU,WAAW,QAAQ,CAAA;YAC1I,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,sCAAsC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC/E,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;YAChC,IAAI,OAAO,GAAG,oBAAoB,IAAI,CAAC,OAAO,mBAAmB,IAAI,CAAC,WAAW,IAAI,CAAA;YACrF,IAAI,OAAO,CAAC,OAAO,EAAE;gBACnB,OAAO,GAAG,oBAAoB,IAAI,CAAC,OAAO,8CAA8C,IAAI,CAAC,WAAW,IAAI,CAAA;aAC7G;YACD,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,sCAAsC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC9E,yDAAyD;YACzD,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;SACzE;QAAC,OAAO,CAAM,EAAE;YACf,sBAAY,CAAC,GAAG,CAAC;gBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,gDAAgD,CAAC,CAAC,OAAO,EAAE;gBACpE,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;SACH;IACH,CAAC;IACD,qBAAqB;IACrB,sBAAsB;QACpB,OAAO,IAAI,OAAO,CAAC,CAAO,OAAO,EAAE,MAAM,EAAE,EAAE;;YAC3C,MAAM,UAAU,GAAG,YAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,mBAAmB,CAAA;YAC5F,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAW,EAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAA;gBAC3E,OAAO,OAAO,EAAE,CAAA;aACjB;YACD,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAA;YAC5E,MAAM,gBAAgB,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACzD,MAAM,aAAa,GAAG,cAAI,CAAC,OAAO,CAAC,4BAAgB,EAAE,UAAU,CAAC,CAAA;YAChE,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;YAClC,IAAI,CAAC,UAAU,GAAG,MAAM,oBAAU,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACjE,MAAM,OAAO,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,CAAA;YAC9C,IAAI,CAAC,WAAW,GAAG,IAAA,qBAAK,EAAC,aAAa,EAAE;gBACtC,eAAe;gBACf,gBAAgB;gBAChB,mBAAmB;gBACnB,OAAO;gBACP,SAAS;aACV,CAAC,CAAA;YAEF,MAAA,IAAI,CAAC,WAAW,CAAC,MAAM,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;gBAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,EAAE;oBACjE,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;oBACrC,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAA;oBAC/E,OAAO,OAAO,EAAE,CAAA;iBACjB;YACH,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,sBAAY,CAAC,GAAG,CAAC;oBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;oBACtB,OAAO,EAAE,uDAAuD,IAAI,EAAE;oBACtE,gBAAgB,EAAE,IAAI;iBACvB,CAAC,CAAA;gBACF,OAAO,MAAM,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB;IACd,aAAa,CAAC,OAAsB;;YACxC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC7C,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,mCAAmC,WAAW,EAAE,EAAE,CAAC,CAAA;YAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACvD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;YACzC,IAAI,CAAC,OAAO,GAAG,MAAM,oBAAU,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACtE,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YAC3E,IAAI,CAAC,YAAY,EAAE;gBACjB,sBAAY,CAAC,GAAG,CAAC;oBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;oBACtB,OAAO,EAAE,oDAAoD;iBAC9D,CAAC,CAAA;gBACF,OAAO,CAAC,IAAI,EAAE,CAAA;aACf;YACD,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YACxD,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,gCAAgC,YAAY,EAAE,EAAE,CAAC,CAAA;YAC7E,IAAI,cAAc,GAAG,oCAAoC,IAAI,CAAC,OAAO,iBAAiB,CAAA;YACtF,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,SAAS,GAAG,MAAM,oBAAU,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;gBAC1E,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,gCAAgC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;gBAC/E,cAAc,IAAI,0BAA0B,IAAI,CAAC,SAAS,gBAAgB,CAAA;aAC3E;YACD,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,yCAAyC,cAAc,EAAE,EAAE,CAAC,CAAA;YACxF,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;YAEzD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;;gBACnC,IAAI,CAAC,eAAe,GAAG,IAAA,qBAAK,EAC1B,WAAW,EACX;oBACE,QAAQ;oBACR,MAAM;oBACN,OAAO;oBACP,WAAW;oBACX,OAAO;oBACP,cAAc;oBACd,SAAS;oBACT,YAAY;oBACZ,OAAO;oBACP,SAAS;oBACT,cAAc;oBACd,SAAS;oBACT,mDAAmD;iBACpD,EACD,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAA;gBACD,IAAI,OAAO,CAAC,UAAU,EAAE;oBACtB,MAAA,IAAI,CAAC,eAAe,CAAC,MAAM,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;wBACvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;wBAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;4BACrC,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,wDAAwD,EAAE,CAAC,CAAA;4BACvF,OAAO,EAAE,CAAA;yBACV;oBACH,CAAC,CAAC,CAAA;oBACF,MAAA,IAAI,CAAC,eAAe,CAAC,MAAM,0CAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;oBAC9B,CAAC,CAAC,CAAA;iBACH;qBAAM;oBACL,UAAU,CAAC,GAAG,EAAE;wBACd,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,wDAAwD,EAAE,CAAC,CAAA;wBACvF,OAAO,EAAE,CAAA;oBACX,CAAC,EAAE,IAAI,CAAC,CAAA;iBACT;gBACD,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACvC,sBAAY,CAAC,GAAG,CAAC;wBACf,KAAK,EAAE,wBAAS,CAAC,KAAK;wBACtB,OAAO,EAAE,uDAAuD,IAAI,EAAE;wBACtE,gBAAgB,EAAE,IAAI;qBACvB,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAED,iBAAiB;IACX,eAAe;;YACnB,IAAI,YAAY,GAAG,KAAK,CAAA;YACxB,MAAM,SAAS,GAAG,GAAS,EAAE;gBAC3B,MAAM,EAAE,GAAG,aAAa,IAAI,CAAC,OAAO,EAAE,CAAA;gBACtC,OAAO,CAAC,YAAY,EAAE;oBACpB,MAAM,UAAU,GAAG,iBAAiB,CAAA;oBACpC,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,sCAAsC,UAAU,EAAE,EAAE,CAAC,CAAA;oBACjF,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;oBAClC,MAAM,aAAa,GAAG,eAAe,EAAE,EAAE,CAAA;oBACzC,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,sCAAsC,aAAa,EAAE,EAAE,CAAC,CAAA;oBACpF,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;oBACjD,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,EAAE,EAAE,CAAC,CAAA;oBACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAA;oBAC7C,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,iCAAiC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;oBACzF,YAAY;wBACV,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;iBAClF;gBACD,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAC/B,CAAC,CAAA,CAAA;YACD,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,SAAS,EAAE;gBACX,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACtB,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,CAAA;gBAC9C,CAAC,CAAC;aACH,CAAC,CAAA;YACF,OAAO,YAAY,CAAA;QACrB,CAAC;KAAA;IAED,wBAAwB;IACxB,OAAO;QACL,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACxD,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,qBAAW,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACjF,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QACtE,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,4BAA4B,cAAc,OAAO,SAAS,EAAE,EAAE,CAAC,CAAA;QAC3F,YAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,kBAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QACvC,sBAAY,CAAC,GAAG,CAAC;YACf,OAAO,EAAE,yBAAyB,cAAc,OAAO,SAAS,eAAe;SAChF,CAAC,CAAA;IACJ,CAAC;IAED,WAAW;IACX,WAAW,CAAC,WAA0B;QACpC,IAAI,WAAW,IAAI,WAAW,CAAC,GAAG,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,EAAE;YACnE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;YAC5C,IAAI;gBACF,IAAI,YAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE;oBAC7B,IAAA,wBAAQ,EAAC,iBAAiB,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAA;iBACnD;qBAAM,IAAI,YAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;oBACrC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;iBAC9B;qBAAM;oBACL,WAAW,CAAC,IAAI,EAAE,CAAA;iBACnB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,sBAAY,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,6BAA8B,GAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;aACnF;SACF;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI;QACF,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACtC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;SACjC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAClC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;SAC7B;IACH,CAAC;CACF;AAED,kBAAe,gBAAgB,CAAA","file":"goldfish.js","sourcesContent":["import UxFileUtils from '@aiot-toolkit/aiotpack/lib/utils/ux/UxFileUtils'\nimport { LOG_LEVEL } from '@aiot-toolkit/shared-utils'\nimport ColorConsole from '@aiot-toolkit/shared-utils/lib/ColorConsole'\nimport FileUtil from '@aiot-toolkit/shared-utils/lib/utils/FileUtil'\nimport * as adbMiwt from '@miwt/adb'\nimport { ChildProcess, execSync, spawn } from 'child_process'\nimport findProcess from 'find-process'\nimport fs from 'fs'\nimport os from 'os'\nimport path from 'path'\nimport portfinder from 'portfinder'\nimport VelaAvdCls from '../avd'\nimport {\n defaultAvdHome,\n defaultEmulatorHome,\n defaultSDKHome,\n defaultToolsHome\n} from '../static/constants'\nimport { INewGoldfishInstanceParams, IStartOptions } from '../typing/Instance'\n\nclass GoldfishInstance {\n private projectPath: string\n private sdkHome: string\n private avdHome: string\n private adbPort: number = 15555\n public debugPort: number = 10055\n private host9pPort: number = 7878\n private velaAvdCls: VelaAvdCls\n private packageName: string\n public goldfishProcess: ChildProcess | undefined\n public v9fsProcess: ChildProcess | undefined\n\n constructor(params: INewGoldfishInstanceParams) {\n this.projectPath = params.projectPath\n this.sdkHome = params.sdkHome || defaultSDKHome\n this.avdHome = params.avdHome || defaultAvdHome\n this.velaAvdCls = new VelaAvdCls({\n sdkHome: this.sdkHome,\n avdHome: this.avdHome\n })\n const { package: appPackageName } = UxFileUtils.getMainfestInfo(\n this.projectPath,\n params.sourceRoot\n )\n this.packageName = appPackageName\n }\n\n /** 获取模拟器二进制文件所在位置 */\n getEmulatorBinPath() {\n const osPlatform = os.platform()\n const osArch = os.arch()\n const platform = osPlatform === 'win32' ? 'windows' : osPlatform\n const arch = (osArch === 'arm64' || osArch === 'aarch64') ? 'aarch64' : 'x86_64'\n return path.resolve(defaultEmulatorHome, `${platform}-${arch}`, 'emulator')\n }\n\n /** 在goldfish模拟器中运行快应用 */\n async start(options: IStartOptions) {\n // host启动9p server\n await this.ensure9pServerRunnning()\n // TODO: 打包快应用\n // 将rpk推到host的defaultQuickappHome目录\n this.pushRpk()\n // 启动模拟器\n await this.startGoldfish(options)\n const connected = await this.connectGoldfish()\n if (connected) {\n ColorConsole.log({\n message: '### Emulator ### Goldfish emulator connected successfully'\n })\n // 在模拟器中启动快应用\n this.startupQuickApp(options)\n } else {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message:\n '### Emulator ### Failed to connect emulator, please check whether the adb is normal'\n })\n }\n }\n\n /** 在goldfish中启动快应用 */\n startupQuickApp(options: IStartOptions) {\n try {\n const appMountDir = path.resolve(this.sdkHome, 'qa')\n const mountCmd = `adb -s 127.0.0.1:${this.adbPort} shell mount -t v9fs -o tag=10.0.2.2,port=${this.host9pPort},aname=${appMountDir} /data`\n ColorConsole.log({ message: `### Emulator ### Excuting adb cmd: ${mountCmd}` })\n adbMiwt.execAdbCmdSync(mountCmd)\n let vappCmd = `adb -s 127.0.0.1:${this.adbPort} shell vapp app/${this.packageName} &`\n if (options.devtool) {\n vappCmd = `adb -s 127.0.0.1:${this.adbPort} shell vapp --jsdebugger=10.0.2.15:101 app/${this.packageName} &`\n }\n ColorConsole.log({ message: `### Emulator ### Excuting adb cmd: ${vappCmd}` })\n // vapp进程会一直pending,不会退出。这里必须加stdio: 'ignore',否则快应用无法运行成功\n adbMiwt.execAdbCmdAsync(vappCmd, { stdio: 'ignore', encoding: 'utf-8' })\n } catch (e: any) {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `### Emulator ### Failed to startup quickapp: ${e.message}`,\n isOnlyPrintError: true\n })\n }\n }\n /** host启动9pServer */\n ensure9pServerRunnning(): Promise<void> {\n return new Promise(async (resolve, reject) => {\n const yaFileName = os.platform() === 'win32' ? 'ya-vm-file-server.exe' : 'ya-vm-file-server'\n const pidList = await findProcess('name', yaFileName)\n if (pidList.length > 0) {\n ColorConsole.log({ message: '### Emulator ### 9p server started in host' })\n return resolve()\n }\n ColorConsole.log({ message: '### Emulator ### Starting 9p server in host' })\n const quickappMountDir = path.resolve(this.sdkHome, 'qa')\n const serverBinPath = path.resolve(defaultToolsHome, yaFileName)\n fs.chmodSync(serverBinPath, 0o777)\n this.host9pPort = await portfinder.getPortPromise({ port: 7878 })\n const address = `127.0.0.1:${this.host9pPort}`\n this.v9fsProcess = spawn(serverBinPath, [\n '--mount-point',\n quickappMountDir,\n '--network-address',\n address,\n '--debug'\n ])\n\n this.v9fsProcess.stderr?.on('data', (data) => {\n const output = data.toString()\n if (output.match(/Server started, listening on: 127.0.0.1:(\\d+)/)) {\n ColorConsole.log({ message: output })\n ColorConsole.log({ message: '### Emulator ### 9p server starts successfully' })\n return resolve()\n }\n })\n\n this.v9fsProcess.on('exit', (code) => {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `### Emulator ### ya-vm-file-server exited with code ${code}`,\n isOnlyPrintError: true\n })\n return reject()\n })\n })\n }\n\n /** 启动goldfish模拟器 */\n async startGoldfish(options: IStartOptions) {\n const { avdName, devtool } = options\n const emulatorBin = this.getEmulatorBinPath()\n ColorConsole.log({ message: `### Emulator ### emulator path: ${emulatorBin}` })\n const avdInfo = this.velaAvdCls.getVelaAvdInfo(avdName)\n const { avdArch, avdImagePath } = avdInfo\n this.adbPort = await portfinder.getPortPromise({ port: this.adbPort })\n ColorConsole.log({ message: `### Emulator ### adb port: ${this.adbPort}` })\n if (!avdImagePath) {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `### Emulator ### Unable to find vela image via avd`\n })\n process.exit()\n }\n const nuttxBinPath = path.resolve(avdImagePath, 'nuttx')\n ColorConsole.log({ message: `### Emulator ### nuttx path: ${nuttxBinPath}` })\n let portMappingStr = `user,id=u1,hostfwd=tcp:127.0.0.1:${this.adbPort}-10.0.2.15:5555`\n if (devtool) {\n this.debugPort = await portfinder.getPortPromise({ port: this.debugPort })\n ColorConsole.log({ message: `### Emulator ### debug port: ${this.debugPort}` })\n portMappingStr += `,hostfwd=tcp:127.0.0.1:${this.debugPort}-10.0.2.15:101`\n }\n ColorConsole.log({ message: `### Emulator ### Start qemu with TCP: ${portMappingStr}` })\n const stdioType = options.disableNSH ? 'pipe' : 'inherit'\n\n return new Promise<void>((resolve) => {\n this.goldfishProcess = spawn(\n emulatorBin,\n [\n '-nuttx',\n '-avd',\n avdName,\n '-avd-arch',\n avdArch,\n '-show-kernel',\n '-kernel',\n nuttxBinPath,\n '-qemu',\n '-netdev',\n portMappingStr,\n '-device',\n 'virtio-net-device,netdev=u1,bus=virtio-mmio-bus.3'\n ],\n { stdio: stdioType }\n )\n if (options.disableNSH) {\n this.goldfishProcess.stdout?.on('data', (data: Buffer) => {\n console.log(data.toString())\n if (data.toString().includes('(NSH)')) {\n ColorConsole.log({ message: `### Emulator ### Goldfish emulator starts successfully` })\n resolve()\n }\n })\n this.goldfishProcess.stderr?.on('data', (data) => {\n console.log(data.toString())\n })\n } else {\n setTimeout(() => {\n ColorConsole.log({ message: `### Emulator ### Goldfish emulator starts successfully` })\n resolve()\n }, 2000)\n }\n this.goldfishProcess.on('exit', (code) => {\n ColorConsole.log({\n level: LOG_LEVEL.Error,\n message: `### Emulator ### Goldfish emulator exited with code ${code}`,\n isOnlyPrintError: true\n })\n })\n })\n }\n\n /** 通过adb连接模拟器 */\n async connectGoldfish() {\n let adbConnected = false\n const connectFn = async () => {\n const sn = `127.0.0.1:${this.adbPort}`\n while (!adbConnected) {\n const adbKillCmd = `adb kill-server`\n ColorConsole.log({ message: `### Emulator ### Excuting adb cmd: ${adbKillCmd}` })\n adbMiwt.execAdbCmdSync(adbKillCmd)\n const adbConnectCmd = `adb connect ${sn}`\n ColorConsole.log({ message: `### Emulator ### Excuting adb cmd: ${adbConnectCmd}` })\n const str = adbMiwt.execAdbCmdSync(adbConnectCmd)\n ColorConsole.log({ message: `### Emulator ### ${str}` })\n const devices = await adbMiwt.getAdbDevices()\n ColorConsole.log({ message: `### Emulator ### adb devices: ${JSON.stringify(devices)}` })\n adbConnected =\n devices.filter((item) => item.sn === sn && item.status === 'device').length > 0\n }\n Promise.resolve(adbConnected)\n }\n await Promise.race([\n connectFn(),\n new Promise((resolve) => {\n setTimeout(() => resolve(false), 600 * 1000)\n })\n ])\n return adbConnected\n }\n\n /** 将打包后的文件推到挂载的快应用目录 */\n pushRpk() {\n const buildDir = path.resolve(this.projectPath, 'build')\n const { package: appPackageName } = UxFileUtils.getMainfestInfo(this.projectPath)\n const appRunDir = path.resolve(this.sdkHome, 'qa/app', appPackageName)\n ColorConsole.log({ message: `### Emulator ### Pushing ${appPackageName} to ${appRunDir}` })\n fs.rmSync(appRunDir, { recursive: true, force: true })\n FileUtil.copyFiles(buildDir, appRunDir)\n ColorConsole.log({\n message: `### Emulator ### Push ${appPackageName} to ${appRunDir} successfully`\n })\n }\n\n /** 杀死进程 */\n killProcess(currProcess?: ChildProcess) {\n if (currProcess && currProcess.pid && currProcess.exitCode === null) {\n console.log('process pid:', currProcess.pid)\n try {\n if (os.platform() === 'win32') {\n execSync(`taskkill /pid ${currProcess.pid} /T /F`)\n } else if (os.platform() === 'darwin') {\n process.kill(currProcess.pid)\n } else {\n currProcess.kill()\n }\n } catch (err) {\n ColorConsole.log({ message: `kill process get error :\\n${(err as Error).stack}` })\n }\n }\n }\n\n /** 停止模拟器并释放相关资源 */\n stop() {\n if (this.goldfishProcess) {\n this.killProcess(this.goldfishProcess)\n this.goldfishProcess = undefined\n }\n if (this.v9fsProcess) {\n this.killProcess(this.v9fsProcess)\n this.v9fsProcess = undefined\n }\n }\n}\n\nexport default GoldfishInstance\n"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["static/constants.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAmB;AACnB,gDAAuB;AAEV,QAAA,cAAc,GAAG,cAAI,CAAC,OAAO,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AACtD,QAAA,cAAc,GAAG,cAAI,CAAC,OAAO,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;AAC9D,QAAA,gBAAgB,GAAG,cAAI,CAAC,OAAO,CAAC,sBAAc,EAAE,mBAAmB,CAAC,CAAA;AACpE,QAAA,mBAAmB,GAAG,cAAI,CAAC,OAAO,CAAC,sBAAc,EAAE,UAAU,CAAC,CAAA;AAC9D,QAAA,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,sBAAc,EAAE,OAAO,CAAC,CAAA;AACvD,QAAA,mBAAmB,GAAG,cAAI,CAAC,OAAO,CAAC,sBAAc,EAAE,IAAI,CAAC,CAAA;AACxD,QAAA,gBAAgB,GAAG,cAAI,CAAC,OAAO,CAAC,sBAAc,EAAE,OAAO,CAAC,CAAA","file":"constants.js","sourcesContent":["import os from 'os'\nimport path from 'path'\n\nexport const defaultSDKHome = path.resolve(os.homedir(), '.export')\nexport const defaultAvdHome = path.resolve(os.homedir(), '.android', 'avd')\nexport const defaultImageHome = path.resolve(defaultSDKHome, 'system-images/arm')\nexport const defaultEmulatorHome = path.resolve(defaultSDKHome, 'emulator')\nexport const defaultSkinHome = path.resolve(defaultSDKHome, 'skins')\nexport const defaultQuickappHome = path.resolve(defaultSDKHome, 'qa')\nexport const defaultToolsHome = path.resolve(defaultSDKHome, 'tools')"],"sourceRoot":"../../src"}
|
package/lib/typing/Avd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["typing/Avd.ts"],"names":[],"mappings":";;;AAMA,IAAY,YAA4C;AAAxD,WAAY,YAAY;IAAG,2BAAW,CAAA;IAAE,+BAAe,CAAA;AAAA,CAAC,EAA5C,YAAY,4BAAZ,YAAY,QAAgC","file":"Avd.js","sourcesContent":["export interface IAvdResourcePaths {\n avdHome?: string\n sdkHome?: string\n imageHome?: string\n}\n\nexport enum IAvdArchType { arm = 'arm', arm64 = 'arm64'}\n\nexport interface IAvdParams {\n avdName: string\n avdArch: IAvdArchType\n avdWidth: string\n avdHeight: string\n avdSkin?: string\n avdImagePath?: string\n}\n\nexport interface ISkinInfo {\n skinName: string\n skinPath: string\n skinBackBase64: string // 背景图的base64\n}"],"sourceRoot":"../../src"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["typing/Instance.ts"],"names":[],"mappings":"","file":"Instance.js","sourcesContent":["import { IAvdResourcePaths } from \"./Avd\";\n\nexport interface INewGoldfishInstanceParams extends IAvdResourcePaths {\n projectPath: string\n sourceRoot?: string\n}\n\nexport interface IStartOptions {\n avdName: string;\n devtool?: string;\n disableNSH?: boolean;\n}"],"sourceRoot":"../../src"}
|