UNPKG

@aiot-toolkit/emulator

Version:

vela emulator tool.

116 lines (112 loc) 4.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fileNamePattern = exports.defaultDirRelativePath = void 0; exports.getEmulatorDefaultConfigDir = getEmulatorDefaultConfigDir; exports.getPlatform = getPlatform; exports.getRunningAvdConfig = getRunningAvdConfig; exports.getRunningAvdConfigByName = getRunningAvdConfigByName; exports.getRunningAvdConfigFiles = getRunningAvdConfigFiles; exports.getRunningVvdDebugPort = getRunningVvdDebugPort; exports.getRunningVvds = getRunningVvds; var _os = _interopRequireDefault(require("os")); var _fs = _interopRequireDefault(require("fs")); var _ini = _interopRequireDefault(require("ini")); var _path = _interopRequireDefault(require("path")); var _adb = require("@miwt/adb"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const defaultDirRelativePath = exports.defaultDirRelativePath = 'avd/running'; const fileNamePattern = exports.fileNamePattern = /pid_\d+\.ini/; function getPlatform() { const platform = _os.default.platform(); return platform === 'darwin' ? 'darwin' : platform === 'win32' ? 'win32' : 'linux'; } /** * Returns the Emulator registration directory. */ function computeRegistrationDirectoryContainer() { const platform = getPlatform(); switch (platform) { case 'darwin': return resolvePath(_path.default.join(_os.default.homedir(), 'Library', 'Caches', 'TemporaryItems')); case 'win32': return resolvePath(_path.default.join(process.env.LOCALAPPDATA, 'Temp')); default: return resolveLinuxPath(); } } /** * @returns 获取模拟器配置文件目录 */ function getEmulatorDefaultConfigDir() { const dir = computeRegistrationDirectoryContainer(); if (!dir) { throw new Error('Unable to determine Emulator registration directory'); } return _path.default.join(dir, defaultDirRelativePath); } function resolveLinuxPath() { const linuxPatterns = [process.env.XDG_RUNTIME_DIR, `/run/user/${process.env.UID}`, _path.default.join(_os.default.homedir(), '.android')]; for (const pattern of linuxPatterns) { if (!pattern) continue; const dir = resolvePath(pattern); if (dir && _fs.default.existsSync(dir) && _fs.default.lstatSync(dir).isDirectory()) { return dir; } } return resolvePath(_path.default.join(_os.default.tmpdir(), `android-${_os.default.userInfo().username}`)); } function resolvePath(filePath) { if (!filePath) { return null; } // Replace environment variables in the filePath filePath = filePath.replace(/{(\w+)}/g, (match, key) => { return process.env[key] || match; }); return _path.default.resolve(filePath); } function getRunningAvdConfigFiles() { try { const dir = getEmulatorDefaultConfigDir(); const files = _fs.default.readdirSync(dir); return files.filter(t => fileNamePattern.test(t)).map(t => _path.default.join(dir, t)); } catch (error) { return []; } } function getRunningAvdConfig() { const file = getRunningAvdConfigFiles(); const result = []; file.forEach(f => { result.push({ ..._ini.default.parse(_fs.default.readFileSync(f, 'utf-8')), path: f }); }); return result; } async function getRunningVvds() { const config = getRunningAvdConfig(); // running 文件中的数据可能会因为上次模拟器未正常退出而残留,所以需要过滤一下 const adbDevices = await (0, _adb.getAdbDevices)(); return config.filter(c => adbDevices.some(e => e.sn === `emulator-${c['port.serial']}` && e.status === 'device')); } function getRunningAvdConfigByName(name) { const iniFiles = getRunningAvdConfigFiles(); for (const iniFile of iniFiles) { const iniConfig = _ini.default.parse(_fs.default.readFileSync(iniFile, 'utf-8')); if (iniConfig['avd.name'] === name) { return { ...iniConfig, path: iniFile }; } } } function getRunningVvdDebugPort(name) { const e = getRunningAvdConfigByName(name); const regex = /hostfwd=tcp:(.*?):(\d+)-10\.0\.2\.15:101/; return e?.cmdline?.match(regex)?.[2]; }