urlname
type
Post
password
SyncToConfluence
category
Android
date
Feb 24, 2023 17:13
slug
e713107c314d
icon
Button
catalog
summary
tags
Android
性能优化
cover
Status
BusyTime
Status 1
status
Published
内存优化的三部曲
Java Heap优化
Native优化
虚拟内存优化
引入
Native 内存,其大小理论上是手机设备的所有内存,没有上限
对于一个 App 的 Native 内存消耗来说,并不是越少越好
组成
- 使用
malloc、calloc、realloc、mmap等函数申请的内存
Bitmap的占用
优化思路
找原因
- 从 导致异常 的原因出发:
- 在 so 库中申请了非常大的内存
- so 库有内存的泄漏,导致 Native 内存一直增长,最后变得非常的大
定位问题
- 通过
Native Hook技术,hook 住 so 库中申请内存和释放内存的函数 - 在此基础上,我们就可以统计出一个 so 库一共申请了多少内存,释放了多少内存。并且当 so 库申请了超大的内存时,还能获取 Native 的堆栈,便于定位异常函数。
- **获取 Native 的堆栈 **用于定位问题
- 主要应对 so 库申请了超大内存的的情况
- 根据 16 进制的地址堆栈还原出 so 名以及具体的函数和位置
解决方案:
- 对于能够修改的 so 库,我们将泄漏的内存及时调用 free 进行释放,减少大内存的申请
- 对于无法修改的第三方 so 库,可以更换稳定版本
Native Hook 技术原理
两种技术方案
- PLT Hook:通过修改
GOT外部函数跳转表进行hook。
- Inline Hook:通过修改目标函数的汇编代码来进行
hook。
Native 堆栈获取原理
两种主要方式
- 通过 FP 栈帧寄存器获取 Native 堆栈;
- 通过栈信息
CFI (Call Frame Information)获取Native堆栈。
Native 堆栈还原函数详细信息
三个操作步骤
- 确认 so 名
- 计算的偏移地址
- 根据带符号表
(ELF 文件中的一张表,存放了函数,方法,变量等名称符号信息)的 so 文件,还原指针对应的函数名和行数
工具
- Malloc Debug
Google官方提供,需要Root
- MemoryLeakDetector
- 字节开源的内存泄露监控工具
- Author:CoderWdd
- URL:https://www.wuinsights.top//article/e713107c314d
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts