@aiot-toolkit/emulator 2.0.3-beta.1 → 2.0.3-beta.10
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 +133 -8
- package/lib/emulatorutil/EmulatorLog.js +22 -18
- package/lib/emulatorutil/constants.d.ts +18 -5
- package/lib/emulatorutil/constants.js +94 -53
- package/lib/emulatorutil/index.d.ts +3 -2
- package/lib/emulatorutil/index.js +38 -8
- package/lib/emulatorutil/running.d.ts +24 -0
- package/lib/emulatorutil/running.js +108 -0
- package/lib/emulatorutil/skinLayoutParser.d.ts +14 -0
- package/lib/emulatorutil/skinLayoutParser.js +111 -0
- package/lib/index.d.ts +5 -5
- package/lib/index.js +76 -26
- package/lib/instance/common.d.ts +38 -39
- package/lib/instance/common.js +141 -223
- package/lib/instance/dev.d.ts +7 -42
- package/lib/instance/dev.js +54 -235
- package/lib/instance/index.d.ts +6 -5
- package/lib/instance/index.js +51 -35
- package/lib/instance/miwear.d.ts +14 -75
- package/lib/instance/miwear.js +93 -370
- package/lib/instance/pre.d.ts +11 -3
- package/lib/instance/pre.js +55 -93
- package/lib/instance/pre5.d.ts +11 -0
- package/lib/instance/pre5.js +38 -0
- package/lib/static/avdConfigIni.json +5 -5
- package/lib/typing/Instance.d.ts +30 -15
- package/lib/typing/Instance.js +13 -6
- package/lib/typing/Vvd.d.ts +105 -0
- package/lib/typing/Vvd.js +31 -0
- package/lib/utils/file.d.ts +0 -0
- package/lib/utils/file.js +1 -0
- package/lib/utils/index.js +86 -100
- package/lib/vvd/index.d.ts +107 -0
- package/lib/vvd/index.js +698 -0
- package/lib/vvd/logcat.d.ts +16 -0
- package/lib/vvd/logcat.js +67 -0
- package/package.json +9 -8
- package/lib/avd/index.d.ts +0 -28
- package/lib/avd/index.js +0 -173
- package/lib/emulatorutil/EmulatorCmd.d.ts +0 -9
- package/lib/emulatorutil/EmulatorCmd.js +0 -226
- package/lib/instance/preDev.d.ts +0 -53
- package/lib/instance/preDev.js +0 -249
- package/lib/typing/Avd.d.ts +0 -23
- package/lib/typing/Avd.js +0 -8
package/lib/utils/index.js
CHANGED
|
@@ -1,144 +1,130 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.delayRun = delayRun;
|
|
7
|
+
exports.getEvenPort = getEvenPort;
|
|
15
8
|
exports.getSystemArch = getSystemArch;
|
|
16
|
-
exports.killProcessByPid = killProcessByPid;
|
|
17
9
|
exports.killProcessByCmd = killProcessByCmd;
|
|
10
|
+
exports.killProcessByPid = killProcessByPid;
|
|
18
11
|
exports.sleep = sleep;
|
|
19
12
|
exports.tryRun = tryRun;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const portfinder_1 = __importDefault(require("portfinder"));
|
|
13
|
+
var _ColorConsole = _interopRequireDefault(require("@aiot-toolkit/shared-utils/lib/ColorConsole"));
|
|
14
|
+
var _child_process = require("child_process");
|
|
15
|
+
var _findProcess = _interopRequireDefault(require("find-process"));
|
|
16
|
+
var _os = _interopRequireDefault(require("os"));
|
|
17
|
+
var _semver = _interopRequireDefault(require("semver"));
|
|
18
|
+
var _portfinder = _interopRequireDefault(require("portfinder"));
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
28
20
|
const cpuArch = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
arm64: 'aarch64',
|
|
22
|
+
aarch64: 'aarch64',
|
|
23
|
+
x64: 'x86_64',
|
|
24
|
+
x86_64: 'x86_64'
|
|
33
25
|
};
|
|
26
|
+
|
|
34
27
|
/** 获取mac电脑的CPU架构
|
|
35
28
|
* node 15.0.0之后,m1芯片的mac的os.arch()才是arm64,在这之前都是x86
|
|
36
29
|
* 所以15.0.0之前无法通过os.arch()区分,也无法通过execSync('uname -m')区分
|
|
37
30
|
*/
|
|
38
31
|
function getSystemArch() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
osArch = 'x64';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (osArch !== 'arm64' && osArch !== 'x64') {
|
|
52
|
-
return ColorConsole_1.default.throw(`unsupport system`);
|
|
32
|
+
const platform = _os.default.platform();
|
|
33
|
+
let osArch = _os.default.arch();
|
|
34
|
+
const nodeVersion = process.version;
|
|
35
|
+
if (_semver.default.lt(nodeVersion, '15.0.0') && platform === 'darwin') {
|
|
36
|
+
try {
|
|
37
|
+
(0, _child_process.execSync)('sysctl -n sysctl.proc_translated');
|
|
38
|
+
osArch = 'arm64';
|
|
39
|
+
} catch {
|
|
40
|
+
osArch = 'x64';
|
|
53
41
|
}
|
|
54
|
-
|
|
42
|
+
}
|
|
43
|
+
if (osArch !== 'arm64' && osArch !== 'x64') {
|
|
44
|
+
return _ColorConsole.default.throw(`unsupport system`);
|
|
45
|
+
}
|
|
46
|
+
return cpuArch[osArch];
|
|
55
47
|
}
|
|
48
|
+
|
|
56
49
|
/** 根据PID杀死进程 */
|
|
57
50
|
function killProcessByPid(pid) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
51
|
+
try {
|
|
52
|
+
const cmd = _os.default.platform() === 'win32' ? `taskkill /pid ${pid} /T /F` : `kill -9 ${pid}`;
|
|
53
|
+
(0, _child_process.execSync)(cmd);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
console.error(`kill process ${pid} get error: ${e}`);
|
|
56
|
+
}
|
|
65
57
|
}
|
|
58
|
+
|
|
66
59
|
/**
|
|
67
60
|
* 根据命令杀死进程
|
|
68
61
|
*/
|
|
69
|
-
function killProcessByCmd(cmd) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
list.forEach((item) => __awaiter(this, void 0, void 0, function* () {
|
|
76
|
-
killProcessByPid(item.pid.toString());
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
catch (e) {
|
|
80
|
-
console.error(`kill process ${cmd} get error: ${e}`);
|
|
81
|
-
}
|
|
62
|
+
async function killProcessByCmd(cmd) {
|
|
63
|
+
if (!cmd) return;
|
|
64
|
+
try {
|
|
65
|
+
const list = await (0, _findProcess.default)('name', cmd);
|
|
66
|
+
list.forEach(async item => {
|
|
67
|
+
killProcessByPid(item.pid.toString());
|
|
82
68
|
});
|
|
69
|
+
} catch (e) {
|
|
70
|
+
console.error(`kill process ${cmd} get error: ${e}`);
|
|
71
|
+
}
|
|
83
72
|
}
|
|
73
|
+
|
|
84
74
|
/** 延迟函数 */
|
|
85
|
-
function sleep(time) {
|
|
86
|
-
|
|
87
|
-
return new Promise((resolve) => setTimeout(resolve, time));
|
|
88
|
-
});
|
|
75
|
+
async function sleep(time) {
|
|
76
|
+
return new Promise(resolve => setTimeout(resolve, time));
|
|
89
77
|
}
|
|
78
|
+
|
|
90
79
|
/**
|
|
91
80
|
* 重复执行某个任务直到成功,或者超过最大次数
|
|
92
81
|
* @param task 任务,需要返回 bool 值表示是否执行成功
|
|
93
82
|
* @param {Number=} maxCount 最大重试次数
|
|
94
83
|
* @param {number=} duration 每次重试的间隔
|
|
95
84
|
*/
|
|
96
|
-
function tryRun(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
});
|
|
85
|
+
async function tryRun(task) {
|
|
86
|
+
let maxCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
|
|
87
|
+
let duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
|
|
88
|
+
let currentCount = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
|
|
89
|
+
if (currentCount > maxCount) return false;
|
|
90
|
+
return Boolean(await task()) || (await delayRun(() => tryRun(task, maxCount, duration, currentCount + 1), duration));
|
|
103
91
|
}
|
|
92
|
+
|
|
104
93
|
/**
|
|
105
94
|
* 延迟执行某个任务
|
|
106
95
|
* @param task
|
|
107
96
|
* @param duration
|
|
108
97
|
* @returns
|
|
109
98
|
*/
|
|
110
|
-
function delayRun(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
});
|
|
99
|
+
async function delayRun(task) {
|
|
100
|
+
let duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
101
|
+
return new Promise(resolve => {
|
|
102
|
+
setTimeout(async () => {
|
|
103
|
+
return resolve(task());
|
|
104
|
+
}, duration);
|
|
105
|
+
});
|
|
118
106
|
}
|
|
107
|
+
|
|
119
108
|
/**
|
|
120
109
|
* 为avdPort寻找一个不被占用的端口
|
|
121
110
|
* 端口号必须是偶数且在5555和5585之间
|
|
122
111
|
* @returns {number}
|
|
123
112
|
*/
|
|
124
|
-
function getEvenPort() {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
port: startPort + 2,
|
|
138
|
-
stopPort
|
|
139
|
-
});
|
|
140
|
-
index++;
|
|
141
|
-
}
|
|
142
|
-
return port;
|
|
113
|
+
async function getEvenPort() {
|
|
114
|
+
const startPort = 5556;
|
|
115
|
+
const stopPort = 5584;
|
|
116
|
+
let index = 1;
|
|
117
|
+
let port = await _portfinder.default.getPortPromise({
|
|
118
|
+
port: startPort,
|
|
119
|
+
stopPort
|
|
120
|
+
});
|
|
121
|
+
while (port % 2 !== 0) {
|
|
122
|
+
if (index > 13) return false;
|
|
123
|
+
port = await _portfinder.default.getPortPromise({
|
|
124
|
+
port: startPort + 2,
|
|
125
|
+
stopPort
|
|
143
126
|
});
|
|
144
|
-
|
|
127
|
+
index++;
|
|
128
|
+
}
|
|
129
|
+
return port;
|
|
130
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { IVvdParams, IVvdResourcePaths, SDKChildren, SDKDownloadOpt, SkinInfo, VelaImageType } from '../typing/Vvd';
|
|
2
|
+
import { IStartOptions, IStartWithSerialPort } from '../typing/Instance';
|
|
3
|
+
import { findInstance } from '../instance';
|
|
4
|
+
import type { DownloadFileOptions } from 'ipull';
|
|
5
|
+
export declare class VvdManager {
|
|
6
|
+
private vvdHome;
|
|
7
|
+
private sdkHome;
|
|
8
|
+
constructor(vvdResourcePaths: IVvdResourcePaths);
|
|
9
|
+
/**
|
|
10
|
+
* 创建Vela端的 VVD ,统一保存在 .vela/vvd 目录下
|
|
11
|
+
* 1. 创建.vela/advancedFeatures.ini文件
|
|
12
|
+
* 2. 创建.vela/vvd/${avdName}.ini文件
|
|
13
|
+
* 3. 创建.vela/vvd/${avdName}.vvd/config.ini文件
|
|
14
|
+
* @param vvdParams VVD参数,宽高、绑定的镜像路径等
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
createVvd(vvdParams: IVvdParams): boolean;
|
|
18
|
+
getVvdDir(vvdName: string): string;
|
|
19
|
+
/** 根据AVD名字获取模拟器的详细信息 */
|
|
20
|
+
getVvdInfo(vvdName: string): IVvdParams;
|
|
21
|
+
/** 根据名字删除AVD */
|
|
22
|
+
deleteVvd(vvdName: string): boolean;
|
|
23
|
+
/** 获取已经创建的模拟器列表 */
|
|
24
|
+
getVvdList(): IVvdParams[];
|
|
25
|
+
/** 获取 SDK 子目录 */
|
|
26
|
+
getSDKChild(name: SDKChildren): string;
|
|
27
|
+
getSkinInfo(skinName: string, skinPath: string): {
|
|
28
|
+
name: string;
|
|
29
|
+
path: string;
|
|
30
|
+
info: SkinInfo;
|
|
31
|
+
backgroundImage: string;
|
|
32
|
+
maskImage: string | undefined;
|
|
33
|
+
defaultLayout: import("../typing/Vvd").EmulatorLayout;
|
|
34
|
+
} | undefined;
|
|
35
|
+
/** 获取模拟器皮肤列表 */
|
|
36
|
+
getVelaSkinList(): Promise<{
|
|
37
|
+
name: string;
|
|
38
|
+
path: string;
|
|
39
|
+
info: SkinInfo;
|
|
40
|
+
backgroundImage: string;
|
|
41
|
+
maskImage: string | undefined;
|
|
42
|
+
defaultLayout: import("../typing/Vvd").EmulatorLayout;
|
|
43
|
+
}[]>;
|
|
44
|
+
/** 自定义模拟器的镜像目录 */
|
|
45
|
+
customImageDir(vvdName: string, target: string): void;
|
|
46
|
+
/** 重置自定义的镜像目录 */
|
|
47
|
+
resetImageDir(vvdName: string): void;
|
|
48
|
+
getEmulatorBinPath(sdkHome: string): string;
|
|
49
|
+
getVvdStartCmd(options: IStartOptions | IStartWithSerialPort): Promise<string>;
|
|
50
|
+
startVvd(options: IStartOptions | IStartWithSerialPort): Promise<{
|
|
51
|
+
coldBoot: boolean;
|
|
52
|
+
emulatorInstance: ReturnType<typeof findInstance>;
|
|
53
|
+
}>;
|
|
54
|
+
stopVvd(name: string, timeout?: number): Promise<void>;
|
|
55
|
+
/** 获取模拟器平台的名称,darwin-aarch64 linux-aarch64 windows-x86_64等 */
|
|
56
|
+
getEmulatorPlatform(): string;
|
|
57
|
+
/** 获取本地镜像的构建时间 */
|
|
58
|
+
getLocalImageBuildTime(imagePath: string): Promise<Date | undefined>;
|
|
59
|
+
getSDKVersionPath(): string;
|
|
60
|
+
/** 获取本地 SDK 的版本信息 */
|
|
61
|
+
getSDKVersion(): Promise<Record<SDKChildren, string>>;
|
|
62
|
+
/** 获取本地已经下载的镜像 */
|
|
63
|
+
getLocalSystemImage(): Promise<{
|
|
64
|
+
value: string;
|
|
65
|
+
time: Date | undefined;
|
|
66
|
+
}[]>;
|
|
67
|
+
getLocalSystemPath(imageId: VelaImageType): string;
|
|
68
|
+
hasLocaleImage(imageId: VelaImageType): boolean;
|
|
69
|
+
/** 判断本地的某个 vela 镜像是否需要更新 */
|
|
70
|
+
isLocalImageNeedUpdate(imageId: VelaImageType): Promise<boolean>;
|
|
71
|
+
getNotInstalledSDKPart(): Promise<SDKChildren[]>;
|
|
72
|
+
/** 检查 SDK 有哪些部分需要更新 */
|
|
73
|
+
hasSDKChildrenUpdate(): Promise<SDKChildren[]>;
|
|
74
|
+
/**
|
|
75
|
+
* 下载 SDK,默认只下载需要更新的部分
|
|
76
|
+
* @param opt.force 强制下载所有部分
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* async function main() {
|
|
80
|
+
* const sdkHome = path.resolve(os.homedir(), '.export_dev1')
|
|
81
|
+
* const velaAvdCls = new VelaAvdCls({ sdkHome })
|
|
82
|
+
*
|
|
83
|
+
* const downloder = await velaAvdCls.downloadSDK({
|
|
84
|
+
* force: true,
|
|
85
|
+
* cliProgress: false,
|
|
86
|
+
* parallelDownloads: 6
|
|
87
|
+
* })
|
|
88
|
+
*
|
|
89
|
+
* downloder.on('progress', (progress) => {
|
|
90
|
+
* console.log(
|
|
91
|
+
* `progress: ${progress.formattedSpeed} ${progress.formattedPercentage} ${progress.formatTotal} ${progress.formatTimeLeft}`
|
|
92
|
+
* )
|
|
93
|
+
* })
|
|
94
|
+
*
|
|
95
|
+
* await downloder.downlodPromise
|
|
96
|
+
*
|
|
97
|
+
* console.log('download success')
|
|
98
|
+
* }
|
|
99
|
+
*/
|
|
100
|
+
downloadSDK(opt: SDKDownloadOpt): Promise<import("ipull").DownloadEngineMultiDownload<import("ipull").BaseDownloadEngine> & {
|
|
101
|
+
downlodPromise: Promise<void>;
|
|
102
|
+
}>;
|
|
103
|
+
/** 下载vela系统镜像 */
|
|
104
|
+
downloadImage(imageId: VelaImageType, opt?: Partial<DownloadFileOptions>): Promise<import("ipull").DownloadEngineNodejs<import("ipull/dist/download/download-engine/streams/download-engine-write-stream/download-engine-write-stream-nodejs").default> & {
|
|
105
|
+
downlodPromise: Promise<void>;
|
|
106
|
+
}>;
|
|
107
|
+
}
|