uni-app 不提供获取 App 运行内存占用的 API,因底层未暴露原生内存接口;Android 可通过自定义原生插件临时监控,iOS 不可行;推荐使用 onMemoryWarning、performance.now() 等跨端性能指标替代。

uni-app 里拿不到 App 运行内存占用
直接说结论:uni-app 的跨端运行时(包括 App.vue、onLaunch、onShow 等生命周期)**不提供获取当前进程内存占用的 API**,无论是 Android 还是 iOS 平台,uni.getSystemInfoSync() 或 uni.getSystemInfo() 返回的对象里都没有 memoryUsage、usedMemory 这类字段。
这是由底层引擎决定的:HBuilderX 打包的 App 使用的是 weex 渲染层 + 原生容器封装,而原生侧(Android 的 ActivityManager、iOS 的 task_info)未向 JS 层暴露内存查询能力,也未在 uni-app SDK 中做桥接封装。
常见错误现象:
- 搜到某些“
uni.getAppBaseInfo()”或“uni.getMemoryInfo()”,实际调用报错undefined is not a function - 误以为
plus.runtime.getInfo()(5+ API)能返回内存数据 —— 它只返回版本、渠道等静态信息,不包含运行时资源状态
Android 端可用原生扩展临时监控内存(需自定义基座)
如果你真有强需求(比如灰度阶段排查 OOM),且能接受重打包、仅限 Android,可基于 uni-app 的原生插件机制,在自定义基座中注入 Java 代码读取 ActivityManager.MemoryInfo。
实操建议:
- 在
nativeplugins/android/src/main/java/...下新增一个MemoryPlugin.java,调用getMemoryInfo().availMem和.totalMem - 通过
uni.requireNativePlugin('memory')在 JS 层调用,返回{ used: number, total: number } - 注意:iOS 无法实现同等逻辑(
task_info需要 entitlements 权限,App Store 不允许) - 该方案不适用于云打包,必须本地用 HBuilderX “制作自定义调试基座”并安装
示例 JS 调用:
const memory = uni.requireNativePlugin('memory')
memory.getUsedMemory(res => {
console.log('已用内存 MB:', Math.round(res.used / 1024 / 1024))
})
更可行的性能监控替代方案
与其执着于内存数字,不如关注可落地、跨端一致的性能信号。这些指标在 uni-app 中可通过标准 API 获取,且对用户体验影响更直接:
-
uni.getSystemInfoSync().platform+.SDKVersion:区分低端机(如 Android 5.x、iOS 10)做降级策略 -
performance.now()结合页面onLoad/onReady时间戳,计算首屏渲染耗时 - 监听
uni.onMemoryWarning—— 这是 uni-app 唯一提供的内存相关回调,触发时说明系统已开始回收后台资源,应立即释放缓存图片、暂停非关键定时器 - 使用
console.time()+console.timeEnd()包裹长任务(如复杂列表渲染、JSON 解析),定位 JS 执行瓶颈
为什么别在生产环境硬加内存监控
即使你绕过限制实现了内存读取,也要警惕几个现实问题:
- Android 上
availMem是系统剩余内存,不是本 App 占用 —— 容易误判;iOS 根本没公开接口,所有“JS 获取内存”的 npm 包都是假的或依赖越狱 - 频繁轮询(比如 setInterval 每秒查一次)本身就会增加 CPU 和内存开销,反而加剧问题
- 不同厂商 ROM 对内存统计口径差异极大(华为 EMUI、小米 MIUI 的
getMemoryInfo行为不一致),数据不可比 - 真正导致卡顿/崩溃的,90% 是 JS 主线程阻塞、图片未压缩、watch 太多响应式数据,而不是“内存用了 300MB”这个数字
如果线上真遇到疑似内存泄漏,优先用 Chrome DevTools 连接 Android WebView(通过 adb reverse tcp:9222 tcp:9222),用 Memory 面板拍快照比对 —— 这才是可靠路径











