Android Bitmap Monitor 是一个开源的 Android 图片内存分析工具,旨在帮助开发者快速发现应用内图片使用是否合理,支持线下实时查看和线上数据统计,适用于 Android 4.4 - 13 (API level 19 - 33)。
- 工具背景与意义
图片内存分析工具较少,开发者分析图片内存问题需耗费大量精力。
Android 应用中图片内存占用比例高,不当加载易致内存溢出崩溃。
Android Bitmap Monitor 可快速发现图片使用不合理之处,如大小不合适、存在泄漏、缓存未及时清理、加载了不需要的图片等。
- 功能介绍
基础功能
获取内存中的 Bitmap 数量及占用内存。
查看 Bitmap 创建堆栈及线程。
导出 Bitmap 图片,定位问题所属业务。
动态开关,可随时开始和结束监控。
支持范围
支持 Android 4.4 - 13 (API level 19 - 33)。
支持 armeabi-v7a 和 arm64-v8a 架构。
支持线下实时查看图片内存情况和线上数据统计。
详细功能
获取内存中的图片数量及占用内存。
获取 Bitmap 创建堆栈及线程。
全版本 Bitmap Preview,在堆栈无法看出问题时定位图片所属业务。
悬浮窗中可以实时查看到图片内存内存中的图片信息某张图片的具体信息allprojects { repositories { //... //添加 mavenCentral 依赖 mavenCentral() }}- 在具体业务的 build.gradle 文件中添加依赖:android { packagingOptions { pickFirst 'lib/*/libshadowhook.so' }}dependencies { implementation 'io.github.shixinzhang:android-bitmap-monitor:1.0.2'}- 注意:为避免和其他库冲突,`packagingOptions` 中 `pickFirst 'lib/*/libshadowhook.so'` 是必要的。long checkInterval = 10;long threshold = 100 * 1024;long restoreImageThreshold = 100 * 1024;;String dir = this.getExternalFilesDir("bitmap_monitor").getAbsolutePath();BitmapMonitor.Config config = new BitmapMonitor.Config.Builder() .checkRecycleInterval(checkInterval) //检查图片是否被回收的间隔,单位:秒 (建议不要太频繁,默认 5秒) .getStackThreshold(threshold) //获取堆栈的阈值,当一张图片占据的内存超过这个数值后就会去抓栈 .restoreImageThreshold(restoreImageThreshold) //还原图片的阈值,当一张图占据的内存超过这个数值后,就会还原出一张原始图片 .restoreImageDirectory(dir) //保存还原后图片的目录 .showFloatWindow(true) //是否展示悬浮窗,可实时查看内存大小(建议只在 debug 环境打开) .isDebug(true) .context(this) .build();BitmapMonitor.init(config);- 当 `showFloatWindow` 为 `true` 时,首次启动 app 需要授予悬浮窗权限。//开启监控,方式1BitmapMonitor.start();//开启方式2,提供页面获取接口,建议使用BitmapMonitor.start(new BitmapMonitor.CurrentSceneProvider() { @Override public String getCurrentScene() { //返回当前顶部页面名称 if (sCurrentActivity != null) { return sCurrentActivity.getClass().getSimpleName(); } return null; }});//停止监控BitmapMonitor.stop();- 开启方式 2 的参数用于获取图片创建时的页面名称,帮助知道大图在哪个页面创建。若不想提供接口可使用开启方式 1。- 使用方式有「全局开启」和「分业务开启」两种: - 全局开启:一启动就 `start`,用于了解整个 APP 使用过程中的图片内存数据。 - 分业务开启:在进入某个业务前 `start`,退出后 `stop`,用于了解特定业务的图片内存数据。BitmapMonitor.addListener(new BitmapMonitor.BitmapInfoListener() { @Override public void onBitmapInfoChanged(final BitmapMonitorData data) { Log.d("bitmapmonitor", "onBitmapInfoChanged: " + data); } });- 间隔时间是初始化时传递的参数 `checkRecycleInterval`,返回的数据结构 `BitmapMonitorData` 包含历史创建的总图片数、总图片内存大小、当前内存中还未回收的图片数、内存大小、泄漏(未释放)的 bitmap 数据等。- 主动获取数据 `dumpBitmapInfo`:主动调用获取内存中的所有数据,可用于内存升高时上报数据://获取所有数据BitmapMonitorData bitmapAllData = BitmapMonitor.dumpBitmapInfo();Log.d("bitmapmonitor", "bitmapAllData: " + bitmapAllData);//仅获取数量和内存大小,不获取具体图片信息BitmapMonitorData bitmapCountData = BitmapMonitor.dumpBitmapCount();Log.d("bitmapmonitor", "bitmapCountData: " + bitmapCountData);- `dumpBitmapInfo` 会返回内存中所有图片的信息,若只想获取图片的总数和内存总量,可调用 `dumpBitmapCount`,速度更快更轻量。- 使用场景
大图报警:线上出现过大的图片加载时,上报日志通知开发人员检查。
图片泄漏监控:页面退出后图片内存未下降,查看泄漏图片及导致代码。
重复加载图片:相同图片多次 decode,未利用好内存缓存。