Camera内存相关知识点梳理

和你一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、Camera 内存包含哪些内容
二、VSS/RSS/PSS/USS 内存介绍
三、内存查看常用命令
四、内存泄漏相关知识点
五、参考文献

一、Camera 内存包含哪些内容

1.1 Camera 内存介绍

从Camera 角度理解Total RAM分为:Free(剩余内存)、Others(非Camera 模块)、Camera APP、cameraserver、camerahalserver、以及Linux Kernel。
另外,整个手机不只有Linux,还有其他作业系统同时运行,所以也会切走一块Reserved,比如:modem。

1.2 Camera 总内存包含哪些

Camera 总内存包含: Camera app、cameraserver、camerahalserver 这三个进程的内存。

1.3 Camera 内存拆解

Camera 内存拆解主要包含 ION内存,Non-ion内存两个。

1.3.1 Non-ion

1.CPU 可存取,没有特别要求,通常会是这一类(比如:堆 HEAP、栈 Stack、全局变量 Global Variable等等)
2.因为各种技术成熟(虚拟地址空间 Virtual Address space ,CPU L1/L2/L3 缓存,Zram Swap... ...)此类对系统负担较轻

1.3.2 ION
  1. 可以给硬体存取(GPU /ISP ...),可跨进程,跨Kernel进行内容分享(3A tunning data from userspace to kernel driver)
  2. 可以存放Camera Frame Buffers

二、VSS/RSS/PSS/USS 内存介绍

内存占用规律 VSS >= RSS >= PSS >= USS

2.1 VSS

Virtual Set Size 虚拟耗用内存(包含共享库占用的内存,以及分配单未使用的内存)
很少被用于判断一个进程的真实内存使用量

2.2 RSS

Resident Set Size 实际使用物理内存(包含共享库占用的内存)
不能准确反映单进程内存占用情况

2.3 PSS

Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)

2.4 USS

Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
当进程中存在可疑内存泄漏时,USS 是最佳观察数据

三、内存查看常用命令

3.1 Camera 内存查看常用基础命令
adb 命令备注
adb shell cat /proc/meminfo系统角度的内存使用情况
adb shell dumpsys meminfo系统角度dump 所有进程的内存情况
adb shell dumpsys meminfo 【pid】指定进程的meminfo
adb shell cat sys/kernel/debug/ion/ion_mm_heap需要root ,Kernel 5.1 之前
adb shell cat /proc/dma_heap/all_heaps需要root ,Kernel 5.1 之后
adb shell cat /proc/"查询进程的【pid】"/smaps需要root ,non-ion
adb shell showmap "查询进程的【pid】"需要root ,non-ion
adb shell pmap "查询进程的【pid】"需要root ,non-ion
3.2 Camera 内存基础命令说明
// 查看系统总内存
adb shell cat /proc/meminfo
// dumpsys camera 相关的meminfo 
adb shell dumpsys meminfo com.android.camera
adb shell dumpsys meminfo cameraserver
adb shell dumpsys meminfo camerahalserver
// 查看系统ION 内存(root版本+kernel 5.1 之前) MTK ion_view_v2.2.py 可以解析
adb shell cat sys/kernel/debug/ion/ion_mm_heap
// 查看系统ION 内存(root版本+kernel 5.1之后)MTK dma_buf_view_v1.0.py 可以解析
adb shell cat /proc/dma_heap/all_heaps
//查看 Camera 相关non-ion 内存占用 mtk parse_smap.awk 脚本可以解析
adb shell cat /proc/"pidof camera app/cameraserver/camerahalserver"/smaps
// 通常我们调试时候需要实时监测内存,这个时候使用while do循环比较好,跟grep 配合会更好
adb shell "while true;do  “添加响应的adb指令” ;done"
// dumpsys hal 内存
adb shell "while true;do dumpsys meminfo camerahalserver;done"
// dumpsys hal 总内存
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'TOTAL PSS';done"
// dumpsys hal  Native HEAP(non-ion)
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'Native Heap:';done"
// dumpsys hal  ion内存 grep Graphics:或者 EGL mtrack
adb shell "while true;do dumpsys meminfo camerahalserver|grep 'Graphics:';done"

四、内存泄漏相关知识点

内存泄漏特点:
持续增长/存在明显波动增长,并且在退出Camera 后不释放。

补充说明:

  • 持续增长/存在明显波动增长,退出Camera后释放,并非泄漏,但可能不合理。
  • 持续增长/存在明显波动增长至少需要 > 50MB 才有机会去分析,因为Camera波动几MB,甚至几十MB都是正常的。
4.1 如何确定内存泄漏进程以及泄漏类型
  • 1.通过 dumpsys meminfo 找到是哪个进程有泄漏(如:camera app,camerahalserver)

  • 2.通过dumpsys meminfo [pid] 找到是 ion 内存泄漏还是non-ion 泄漏
    如果是ion 泄漏,需要dump ion_mm_heap, 查看与 orphaned 孤儿进程相关的段落,比如 total orphaned ,orphaned buffer list:
    根据经验一般这个 total orphaned 达到GB等级,极有可能内存泄漏。
    如果是non-ion,需要dump smaps,查收是malloc 泄漏还是mmap泄漏。针对性的开malloc debug+coredump,或者mmap debug+coredump

4.2 内存泄漏Debug 手法
4.2.1 检测coredump 是否开启(eng,userdebug 版本默认开启)

查看命令如下:

// enable 开启,disable 关闭
C:\Users\Administrator>adb shell "getprop|grep 'vendor.aeev.core'"
[persist.vendor.aeev.core.direct]: [enable]
[persist.vendor.aeev.core.dump]: [enable]
// 如需关闭,请设置disable
C:\Users\Administrator>adb shell setprop persist.vendor.aeev.core.direct disable

C:\Users\Administrator>adb shell setprop persist.vendor.aeev.core.dump disable

C:\Users\Administrator>adb shell "getprop|grep 'vendor.aeev.core'"
[persist.vendor.aeev.core.direct]: [disable]
[persist.vendor.aeev.core.dump]: [disable]

C:\Users\Administrator>

或者在init.aee.customer.rc 以及在init.aee.system.rc 中设置属性enable

4.2.2 malloc 内存debug 方法
  1. eng或者userdebug 版本参考命令
// 打开backtrace 触发NE的层数 8层
C:\Users\Administrator>adb shell "echo libc.debug.malloc.options="backtrace=8 guard=8 leak_track">>/data/local.prop"

C:\Users\Administrator>adb shell "echo libc.debug.malloc.program=camerahalserver>>/data/local.prop"

C:\Users\Administrator>adb reboot
// 重启后确认malloc debug 开关是否生效
C:\Users\Administrator>adb shell "getprop | grep malloc"
[libc.debug.malloc.options]: [backtrace=8 guard=8 leak_track]
[libc.debug.malloc.program]: [camerahalserver]

backtrace =8 表示 触发NE后backtrace 有8层,不能太多,否则预览容易黑屏或者卡顿,8层自测camera预览已经比较卡了。

或者通过setprop 进行设置,重启后失效

C:\Users\Administrator>adb shell "setprop libc.debug.malloc.options 'backtrace=8 guard=8 leak_track'"

C:\Users\Administrator>adb shell "setprop libc.debug.malloc.program camerahalserver"

C:\Users\Administrator>adb shell "getprop | grep malloc"
[libc.debug.malloc.options]: [backtrace=8 guard=8 leak_track]
[libc.debug.malloc.program]: [camerahalserver]

C:\Users\Administrator>adb shell pkill camera*
4.2.3 mmap debug 内存方法

需要先使用adb shell echo $LD_PRELOAD 查看是已经加载libudf.so ? 如果没有,需要修改代码
这个需要参考MTK 文档。

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,比如:文章底部留言,12小时内必删,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

点个在看,为大佬点赞!

### Android 开发知识点总结 #### 一、操作系统基础 Android 应用开发需要掌握 Android 操作系统的基础知识,这涵盖了不同版本的特性、操作系统的内部结构及其组成部分和平台架构等内容[^1]。 #### 二、开发环境搭建 为了能够顺利开展项目工作,开发者需熟悉如何配置集成开发环境(IDE),比如安装并使用 Android Studio 来创建新工程以及管理依赖库等资源文件。 #### 三、UI设计与布局 理解 XML 布局方式来构建用户界面;了解常用控件如 Button、TextView 的属性设置方法;学会通过样式表定义统一的主题风格;掌握 Fragment 技术实现复杂页面逻辑拆分。 #### 四、数据存储机制 熟练运用 SharedPreferences 进行轻量级本地缓存处理;懂得 SQLite 数据库的操作模式完成关系型数据库任务;探索 ContentProvider 实现跨应用程序间的数据共享功能。 #### 五、网络通信能力 深入研究 HTTP 协议下的 GET/POST 请求发送接收过程;利用 OkHttp 或 Retrofit 等第三方框架简化 RESTful API 调用流程;考虑安全因素采用 HTTPS 加密传输敏感信息。 #### 六、多媒体支持服务 学习 MediaRecorder 和 MediaPlayer 类用于录制播放音频视频素材;尝试 CameraX 新一代相机接口获取更佳拍照体验;探究 ExoPlayer 自定义媒体管道满足特殊需求场景。 #### 七、异步任务处理方案 对于耗时较长的任务应当放在后台线程执行以免阻塞主线程影响用户体验。可以借助 `AsyncTask` 完成简单的异步加载作业[^3],但对于更加复杂的并发控制则推荐 ThreadPoolExecutor 结合 Future 接口或者 RxJava 反应式编程模型来进行高效调度安排。 #### 八、生命周期管理策略 Activity 生命周期是 Android 编程的核心概念之一,在屏幕旋转情况下即使设置了 android:configChanges 属性也可能会触发部分生命周期回调函数[^4]。因此建议采取保存实例状态的方式确保组件在配置更改前后保持一致的行为表现。 #### 九、性能优化实践指南 针对内存泄漏问题排查工具 LeakCanary 使用教程;关于减少 View 绘制次数提高渲染效率的小贴士;有关 ProGuard 混淆压缩减小编译产物体积的经验分享等等均属于此范畴内的重要议题[^2]。 ```java // 示例代码:简单异步任务 new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... voids) { // 执行耗时操作 return "result"; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // 更新 UI } }.execute(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值