如何编写脚本实现通过npm start自动启动Android模拟器,无需手动选择AVD?
可行方案:通过npm脚本自动启动Android模拟器
完全可行,你可以通过以下几种方式实现无需手动选择AVD的自动启动,适配不同场景需求:
方案1:指定固定AVD名称(团队统一环境首选)
如果团队约定使用同名模拟器(比如统一命名为Pixel_6_API_34),直接在package.json的scripts中写死命令即可:
{ "scripts": { "start": "emulator -avd Pixel_6_API_34 && npm run launch-app" } }
这种方式最简单直接,但要求所有克隆项目的成员都创建同名AVD,否则会启动失败。
方案2:自动选取第一个可用AVD(兼容个人自定义环境)
通过脚本自动抓取emulator -list-avds输出的第一个AVD并启动,支持跨平台:
Linux/macOS 用Shell脚本实现
在项目根目录创建start-emulator.sh文件:
#!/bin/bash # 获取第一个可用AVD名称 AVD_NAME=$(emulator -list-avds | head -n 1) if [ -z "$AVD_NAME" ]; then echo "未找到可用Android模拟器,请先通过AVD Manager创建一个" exit 1 fi # 后台启动模拟器 emulator -avd $AVD_NAME & # 等待模拟器完全启动(替代固定sleep,更可靠) until adb shell getprop sys.boot_completed | grep -q 1; do sleep 3 done # 启动你的应用 npm run launch-app
然后在package.json中配置脚本:
{ "scripts": { "start": "chmod +x start-emulator.sh && ./start-emulator.sh" } }
跨平台用Node.js脚本实现
创建start-emulator.js文件:
const { execSync, spawn } = require('child_process'); try { // 获取AVD列表并过滤空行 const avdList = execSync('emulator -list-avds', { encoding: 'utf8' }) .trim() .split('\n') .filter(item => item); if (avdList.length === 0) { console.error('未找到可用Android模拟器,请先创建一个AVD'); process.exit(1); } const targetAvd = avdList[0]; console.log(`正在启动模拟器:${targetAvd}`); // 启动模拟器 spawn('emulator', ['-avd', targetAvd], { stdio: 'inherit' }); // 等待模拟器就绪后启动应用 const waitForEmulator = setInterval(() => { try { const bootStatus = execSync('adb shell getprop sys.boot_completed', { encoding: 'utf8' }).trim(); if (bootStatus === '1') { clearInterval(waitForEmulator); spawn('npm', ['run', 'launch-app'], { stdio: 'inherit' }); } } catch (err) { // 模拟器未就绪时adb会报错,忽略即可 } }, 3000); } catch (err) { console.error('启动模拟器出错:', err.message); process.exit(1); }
在package.json中配置:
{ "scripts": { "start": "node start-emulator.js" } }
注意事项
- 确保所有克隆项目的用户已配置Android环境变量,
emulator和adb命令可在终端直接执行 - 建议在项目README中补充说明:需提前创建至少一个Android模拟器,或提供自动创建AVD的辅助脚本(可基于
sdkmanager和avdmanager命令实现)
内容的提问来源于stack exchange,提问作者Asitha Navaratne
相关产品推荐
相关产品推荐

