自研的内存分析利器开源了!Android Bitmap Monitor 助你定位不合理的图片使用
大家好,我是 shixin。
在日常工作中,我们往往只关注 Java 内存使用情况,这主要是因为 Java 内存分析相关的工具比较多。与之不同的是,图片内存分析的工具比较少,当分析图片内存问题时我们需要花费很大的精力。
我们知道,在 Android 应用使用的内存中,图片总是占据不少比例。拿小米 12 来说,3200 x 1440 的分辨率,一张全屏的图片至少要占用 17MB(3200 x 1440 x 4 )。如果缓存里多几张,基本就要达到上百 MB。加载的图片稍有不当,就可能导致应用的内存溢出崩溃大大增加。
因此,我们需要这样的工具:可以快速发现应用内加载的图片是否合理,比如大小是否合适、是否存在泄漏、缓存是否及时清理、是否加载了当前并不需要的图片等等。
AndroidBitmapMonitor 正是为此而生!它是一个开源的 Android 图片内存分析工具,可以帮助开发者快速发现应用的图片使用是否合理,支持在线下和线上使用。
AndroidBitmapMonitor 提供了这些功能:
获取内存中的 Bitmap 数量及占用内存
查看 Bitmap 创建堆栈及线程
导出 Bitmap 图片,帮助直接定位问题所属业务
动态开关,可以在任意时间开始和结束
功能介绍
支持 Android 4.4 - 13 (API level 19 - 33)
支持 armeabi-v7a 和 arm64-v8a
支持线下实时查看图片内存情况 和 线上数据统计
可以提供的功能:
获取内存中的图片数量及占用内存
获取 Bitmap 创建堆栈及线程
全版本 Bitmap Preview,在堆栈无法看出问题时,可以用来定位图片所属业务
动图:
核心功能截图:
悬浮窗中可以实时查看到图片内存
内存中的图片信息
某张图片的具体信息
使用文档
主要有四步:
添加 gradle 依赖
初始化配置
在需要的时候调用 start 和 stop
获取数据
1. 在 build.gradle 中增加依赖
Android Bitmap Monitor 发布在 mavenCentral 上,因此首先需要确保您的项目有使用 mavenCentral 作为仓库。
您可以在根目录的 build.gradle 或者 setting.gradle 中添加以下代码:
接着在具体业务的 build.gradle 文件中添加依赖:
请注意:为了避免和其他库冲突,上面的 packagingOptions 中
pickFirst 'lib/*/libshadowhook.so'
是必要的。
添加完依赖并执行 gradle sync 后,下一步就是在代码里进行初始化和启动。
2. 初始化
初始化需要调用的 API 是 BitmapMonitor.init
:
当 showFloatWindow 为 true 时,首次启动 app 需要授予悬浮窗权限。
3. 开启和停止监控
初始化完成后,可以在任意时刻调用 start/stop 开启和停止监控:
上面的代码中,开启方式 2 的参数用来获取图片创建时的页面名称,这个接口可以帮助知道大图是在哪个页面创建的。如果不想提供这个接口可以使用开启方式 1。
那我们该在什么使用开启监控呢?
一般有「全局开启」和「分业务开启」两种使用方式:
全局开启:一启动就 start,用于了解整个 APP 使用过程中的图片内存数据
分业务开启:在进入某个业务前 start,退出后 stop,用于了解特定业务的图片内存数据
4. 获取数据
在初始化完成并开启监控后,我们就可以拦截到每张图片的创建过程。
Android Bitmap Monitor 提供了两种获取内存中图片数据的 API:
定时回调 addListener
主动获取数据 dumpBitmapInfo
定时回调 是指注册一个 listener,这个接口的回调会按照一定时间间隔被调用,可以用来做实时监控:
间隔时间是初始化时传递的参数 checkRecycleInterval,返回的数据结构如下所示:
主动获取数据 是指主动调用 BitmapMonitor.dumpBitmapInfo()
获取内存中的所有数据,可以用在内存升高时上报数据:
dumpBitmapInfo
会返回内存中所有图片的信息,如果只想获取到图片的总数和内存总量,可以调用 dumpBitmapCount
,速度更快更轻量。
总结
这篇文章介绍了最新开源的图片内存分析工具 Android Bitmap Monitor 的功能与核心 API,可以看到,它提供了很多图片的信息,我们可以用它干什么呢?
目前想到这些使用场景:
大图报警: 一旦线上出现过大的图片加载,可以上报一条日志,通知开发人员检查
图片泄漏监控:在页面退出后图片内存没有下降,可以看看是什么图片泄漏了,哪里代码导致的
重复加载图片:相同的图片多次 decode,没有利用好内存缓存
通过这个库我们可以对 APP 的图片使用情况有更深的了解,也可以让知识面更广一点,以后面试聊到内存优化时可以不用担心只会讲 Java 内存了哈哈!还在等什么,快来使用吧!
如果对你有帮助,欢迎点一个 star,感谢:https://github.com/shixinzhang/AndroidBitmapMonitor
评论