uni-app无直接检测模拟器API,需在APP-PLUS环境下通过plus.android读取/dev/socket/qemud等路径判断,必须用#ifdef APP-PLUS包裹并加try/catch防护。

uni-app 本身不提供直接检测模拟器的 API,uni.getSystemInfoSync() 返回的 platform 或 model 字段在模拟器里往往和真机重叠(比如都显示 Android),完全不可靠。必须借助原生层能力,在 App 环境(即 app-plus)中通过 Android 文件系统特征做判断。
只在 app-plus 环境下才有效
模拟器检测逻辑依赖 Java 的 java.io.File 类读取系统路径,仅能在 5+ App(app-plus)中运行。H5、小程序等环境无法访问这些路径,调用会直接报错或静默失败。
- 务必用
// #ifdef APP-PLUS包裹整个检测函数,避免编译进非 App 平台 - 不要在
main.js顶层或onLaunch里无条件执行——H5 小程序会 crash - 若需跨平台统一入口,先判断:
if (process.env.UNI_PLATFORM === 'app-plus')再调用
检测依据是 /dev/socket/qemud 等硬编码路径
主流 Android 模拟器(如 MuMu、夜神、Android Studio AVD、Genymotion)会在特定路径下创建 socket 文件或 so 库,这是最稳定、复现率最高的识别方式。官方示例里列出的路径仍有效,但要注意两点:
-
/dev/socket/qemud是最经典标志,AVD 和多数国产模拟器都存在;/dev/qemu_pipe是备用项 -
/system/lib/libc_malloc_debug_qemu.so在较新模拟器(如 Android 12+ AVD)中可能被移除,不能单独依赖 - 鸿蒙 Next 模拟器(DevEco)不走这套机制,目前无公开可测的通用文件特征,需结合
uni.getDeviceInfoSync()?.osName === 'harmony'+ 其他行为判断
实际调用时必须处理 plus.android.importClass 失败
部分加固或定制 ROM 可能限制 plus.android.importClass 调用,导致 java.io.File 获取失败。不加防护会抛出 TypeError: Cannot read property 'importClass' of undefined。
- 应在调用前加 try/catch,并 fallback 到简单 UA 特征(如
navigator.userAgent.includes('Emulator')),虽不准但可防崩 - 避免在
onLoad等高频生命周期里反复调用——每次都要 new File 实例,IO 开销小但累积起来影响首屏 - 返回结果建议缓存(例如挂到
globalThis.isSimulatorChecked),后续直接读布尔值
真正难的是「混合环境」:比如某设备既满足 ROOT 路径又匹配模拟器路径,或者某些云真机服务(如腾讯云 Lighthouse)也伪造了 /dev/socket/qemud。这种边界情况没有银弹,只能按业务风险等级决定是否 quit、弹窗或仅上报日志。











