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 文件,还原指针对应的函数名和行数

工具

Leetcode_139-单词拆分Leetcode_213.打家劫舍II
Loading...