| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import { existsSync, readFileSync } from 'fs';
- import path from 'path';
- import { fileURLToPath } from 'url';
- const __filename = fileURLToPath(import.meta.url);
- const __dirname = path.dirname(__filename);
- // 读取配置文件
- export function loadConfig() {
- try {
- const configPath = path.join(__dirname, '..', 'adb-path-config.js');
- if (existsSync(configPath)) {
- const configContent = readFileSync(configPath, 'utf-8');
- // 解析 CommonJS 格式的配置文件
- // 移除 module.exports = 和分号,转换为纯 JSON
- let jsonContent = configContent
- .replace(/module\.exports\s*=\s*/g, '') // 移除 module.exports =
- .replace(/;[\s]*$/, '') // 移除末尾分号
- .replace(/\/\/.*$/gm, '') // 移除单行注释
- .replace(/,(\s*[}\]])/g, '$1') // 移除尾随逗号
- .trim();
-
- // 将单引号字符串转换为双引号字符串(JSON 要求)
- // 匹配单引号字符串,包括转义的单引号
- jsonContent = jsonContent.replace(/'((?:[^'\\]|\\.)*)'/g, (match, content) => {
- // 转义双引号和反斜杠,然后用双引号包裹
- // 注意:反斜杠需要先转义,因为后续的替换可能会影响它们
- const escaped = content
- .replace(/\\/g, '\\\\') // 转义反斜杠(先处理)
- .replace(/"/g, '\\"'); // 转义双引号
- return `"${escaped}"`;
- });
-
- return JSON.parse(jsonContent);
- }
- } catch (error) {
- // 加载配置文件失败,忽略错误
- }
- return null;
- }
- // 查找 ADB 可执行文件路径
- function getAdbPath() {
- // 首先尝试使用项目根目录下的 adb-tools/adb.exe(最高优先级)
- const projectRoot = path.join(__dirname, '..');
- const localAdbPath = path.join(projectRoot, 'adb-tools', 'adb.exe');
- if (existsSync(localAdbPath)) {
- return localAdbPath;
- }
- // 如果项目目录下没有,尝试从配置文件读取(向后兼容)
- const config = loadConfig();
- if (config && config['adb-path']) {
- const configAdbPath = path.join(config['adb-path'], 'adb.exe');
- if (existsSync(configAdbPath)) {
- return configAdbPath;
- }
- // 如果配置的路径不存在,尝试直接使用配置的路径(可能已经是完整路径)
- if (existsSync(config['adb-path'])) {
- return config['adb-path'];
- }
- }
- // 如果配置文件没有或路径不存在,使用常见 ADB 安装位置(按优先级排序)
- const possiblePaths = [
- path.join(process.env.LOCALAPPDATA || '', 'Android', 'Sdk', 'platform-tools', 'adb.exe'),
- path.join(process.env.USERPROFILE || '', 'AppData', 'Local', 'Android', 'Sdk', 'platform-tools', 'adb.exe'),
- path.join(process.env.ProgramFiles || '', 'Android', 'android-sdk', 'platform-tools', 'adb.exe'),
- path.join(process.env['ProgramFiles(x86)'] || '', 'Android', 'android-sdk', 'platform-tools', 'adb.exe'),
- ];
- // 检查常见位置
- for (const adbPath of possiblePaths) {
- if (existsSync(adbPath)) {
- return adbPath;
- }
- }
- // 如果都找不到,尝试使用 PATH 中的 adb
- return 'adb';
- }
- // 缓存 ADB 路径
- let adbPathCache = null;
- export function getCachedAdbPath() {
- if (!adbPathCache) {
- adbPathCache = getAdbPath();
- }
- return adbPathCache;
- }
|