欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

開源自研內(nèi)存分析利器Android?Bitmap?Monitor圖片定位詳解

 更新時(shí)間:2023年03月27日 09:45:07   作者:張拭心  
這篇文章主要為大家介紹了Android?Bitmap?Monitor開源自研內(nèi)存分析利器,助你定位不合理的圖片使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

在日常工作中,我們往往只關(guān)注 Java 內(nèi)存使用情況,這主要是因?yàn)?Java 內(nèi)存分析相關(guān)的工具比較多。與之不同的是,圖片內(nèi)存分析的工具比較少,當(dāng)分析圖片內(nèi)存問題時(shí)我們需要花費(fèi)很大的精力。

我們知道,在 Android 應(yīng)用使用的內(nèi)存中,圖片總是占據(jù)不少比例。拿小米 12 來說,3200 x 1440 的分辨率,一張全屏的圖片至少要占用 17MB(3200 x 1440 x 4 )。如果緩存里多幾張,基本就要達(dá)到上百 MB。加載的圖片稍有不當(dāng),就可能導(dǎo)致應(yīng)用的內(nèi)存溢出崩潰大大增加。

因此,我們需要這樣的工具:可以快速發(fā)現(xiàn)應(yīng)用內(nèi)加載的圖片是否合理,比如大小是否合適、是否存在泄漏、緩存是否及時(shí)清理、是否加載了當(dāng)前并不需要的圖片等等。

AndroidBitmapMonitor 正是為此而生!它是一個(gè)開源的 Android 圖片內(nèi)存分析工具,可以幫助開發(fā)者快速發(fā)現(xiàn)應(yīng)用的圖片使用是否合理,支持在線下和線上使用。

AndroidBitmapMonitor 提供了這些功能:

  • 獲取內(nèi)存中的 Bitmap 數(shù)量及占用內(nèi)存
  • 查看 Bitmap 創(chuàng)建堆棧及線程
  • 導(dǎo)出 Bitmap 圖片,幫助直接定位問題所屬業(yè)務(wù)
  • 動(dòng)態(tài)開關(guān),可以在任意時(shí)間開始和結(jié)束

功能介紹

  • 支持 Android 4.4 - 13 (API level 19 - 33)
  • 支持 armeabi-v7a 和 arm64-v8a
  • 支持線下實(shí)時(shí)查看圖片內(nèi)存情況 和 線上數(shù)據(jù)統(tǒng)計(jì)

可以提供的功能:

  • 獲取內(nèi)存中的圖片數(shù)量及占用內(nèi)存
  • 獲取 Bitmap 創(chuàng)建堆棧及線程
  • 全版本 Bitmap Preview,在堆棧無法看出問題時(shí),可以用來定位圖片所屬業(yè)務(wù)

動(dòng)圖:

核心功能截圖:

懸浮窗中可以實(shí)時(shí)查看到圖片內(nèi)存

內(nèi)存中的圖片信息

某張圖片的具體信息

使用文檔

主要有四步:

  • 添加 gradle 依賴
  • 初始化配置
  • 在需要的時(shí)候調(diào)用 start 和 stop
  • 獲取數(shù)據(jù)

1. 在 build.gradle 中增加依賴

Android Bitmap Monitor 發(fā)布在 mavenCentral 上,因此首先需要確保您的項(xiàng)目有使用 mavenCentral 作為倉(cāng)庫(kù)。

您可以在根目錄的 build.gradle 或者 setting.gradle 中添加以下代碼:

allprojects {
    repositories {
        //...
        //添加 mavenCentral 依賴
        mavenCentral()
    }
}

接著在具體業(yè)務(wù)的 build.gradle 文件中添加依賴:

android {
    packagingOptions {
        pickFirst 'lib/*/libshadowhook.so'
    }
}
dependencies {
    implementation 'io.github.shixinzhang:android-bitmap-monitor:1.0.2'
}

請(qǐng)注意:為了避免和其他庫(kù)沖突,上面的 packagingOptions 中 pickFirst 'lib/*/libshadowhook.so' 是必要的。

添加完依賴并執(zhí)行 gradle sync 后,下一步就是在代碼里進(jìn)行初始化和啟動(dòng)。

2. 初始化

初始化需要調(diào)用的 API 是 BitmapMonitor.init

        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)    //檢查圖片是否被回收的間隔,單位:秒 (建議不要太頻繁,默認(rèn) 5秒)
                .getStackThreshold(threshold)           //獲取堆棧的閾值,當(dāng)一張圖片占據(jù)的內(nèi)存超過這個(gè)數(shù)值后就會(huì)去抓棧
                .restoreImageThreshold(restoreImageThreshold)   //還原圖片的閾值,當(dāng)一張圖占據(jù)的內(nèi)存超過這個(gè)數(shù)值后,就會(huì)還原出一張?jiān)紙D片
                .restoreImageDirectory(dir)             //保存還原后圖片的目錄
                .showFloatWindow(true)                  //是否展示懸浮窗,可實(shí)時(shí)查看內(nèi)存大小(建議只在 debug 環(huán)境打開)
                .isDebug(true)
                .context(this)
                .build();
        BitmapMonitor.init(config);

當(dāng) showFloatWindow 為 true 時(shí),首次啟動(dòng) app 需要授予懸浮窗權(quán)限。

3. 開啟和停止監(jiān)控

初始化完成后,可以在任意時(shí)刻調(diào)用 start/stop 開啟和停止監(jiān)控:

        //開啟監(jiān)控,方式1
        BitmapMonitor.start();
        //開啟方式2,提供頁(yè)面獲取接口,建議使用
        BitmapMonitor.start(new BitmapMonitor.CurrentSceneProvider() {
            @Override
            public String getCurrentScene() {
                //返回當(dāng)前頂部頁(yè)面名稱
                if (sCurrentActivity != null) {
                    return sCurrentActivity.getClass().getSimpleName();
                }
                return null;
            }
        });
        //停止監(jiān)控
        BitmapMonitor.stop();

上面的代碼中,開啟方式 2 的參數(shù)用來獲取圖片創(chuàng)建時(shí)的頁(yè)面名稱,這個(gè)接口可以幫助知道大圖是在哪個(gè)頁(yè)面創(chuàng)建的。如果不想提供這個(gè)接口可以使用開啟方式 1。

那我們?cè)撛谑裁词褂瞄_啟監(jiān)控呢?

一般有「全局開啟」和「分業(yè)務(wù)開啟」兩種使用方式:

  • 全局開啟:一啟動(dòng)就 start,用于了解整個(gè) APP 使用過程中的圖片內(nèi)存數(shù)據(jù)
  • 分業(yè)務(wù)開啟:在進(jìn)入某個(gè)業(yè)務(wù)前 start,退出后 stop,用于了解特定業(yè)務(wù)的圖片內(nèi)存數(shù)據(jù)

4. 獲取數(shù)據(jù)

在初始化完成并開啟監(jiān)控后,我們就可以攔截到每張圖片的創(chuàng)建過程。

Android Bitmap Monitor 提供了兩種獲取內(nèi)存中圖片數(shù)據(jù)的 API:

  • 定時(shí)回調(diào) addListener
  • 主動(dòng)獲取數(shù)據(jù) dumpBitmapInfo

定時(shí)回調(diào) 是指注冊(cè)一個(gè) listener,這個(gè)接口的回調(diào)會(huì)按照一定時(shí)間間隔被調(diào)用,可以用來做實(shí)時(shí)監(jiān)控

        BitmapMonitor.addListener(new BitmapMonitor.BitmapInfoListener() {
            @Override
            public void onBitmapInfoChanged(final BitmapMonitorData data) {
                Log.d("bitmapmonitor", "onBitmapInfoChanged: " + data);
            }
        });

間隔時(shí)間是初始化時(shí)傳遞的參數(shù) checkRecycleInterval,返回的數(shù)據(jù)結(jié)構(gòu)如下所示:

public class BitmapMonitorData {
    //歷史創(chuàng)建的總圖片數(shù)
    public long createBitmapCount;
    //歷史創(chuàng)建的總圖片內(nèi)存大小,單位 byte
    public long createBitmapMemorySize;
    //當(dāng)前內(nèi)存中還未回收的圖片數(shù)
    public long remainBitmapCount;
    //當(dāng)前內(nèi)存中還未回收的圖片內(nèi)存大小,單位 byte
    public long remainBitmapMemorySize;
    //泄漏(未釋放)的 bitmap 數(shù)據(jù)
    public BitmapRecord[] remainBitmapRecords;
    //...
}

主動(dòng)獲取數(shù)據(jù) 是指主動(dòng)調(diào)用 BitmapMonitor.dumpBitmapInfo() 獲取內(nèi)存中的所有數(shù)據(jù),可以用在內(nèi)存升高時(shí)上報(bào)數(shù)據(jù)

        //獲取所有數(shù)據(jù)
        BitmapMonitorData bitmapAllData = BitmapMonitor.dumpBitmapInfo();
        Log.d("bitmapmonitor", "bitmapAllData: " + bitmapAllData);
        //僅獲取數(shù)量和內(nèi)存大小,不獲取具體圖片信息
        BitmapMonitorData bitmapCountData = BitmapMonitor.dumpBitmapCount();
        Log.d("bitmapmonitor", "bitmapCountData: " + bitmapCountData);

dumpBitmapInfo 會(huì)返回內(nèi)存中所有圖片的信息,如果只想獲取到圖片的總數(shù)和內(nèi)存總量,可以調(diào)用 dumpBitmapCount,速度更快更輕量。

總結(jié)

這篇文章介紹了最新開源的圖片內(nèi)存分析工具 Android Bitmap Monitor 的功能與核心 API,可以看到,它提供了很多圖片的信息,我們可以用它干什么呢?

目前想到這些使用場(chǎng)景:

  • 大圖報(bào)警: 一旦線上出現(xiàn)過大的圖片加載,可以上報(bào)一條日志,通知開發(fā)人員檢查
  • 圖片泄漏監(jiān)控:在頁(yè)面退出后圖片內(nèi)存沒有下降,可以看看是什么圖片泄漏了,哪里代碼導(dǎo)致的
  • 重復(fù)加載圖片:相同的圖片多次 decode,沒有利用好內(nèi)存緩存

通過這個(gè)庫(kù)我們可以對(duì) APP 的圖片使用情況有更深的了解,也可以讓知識(shí)面更廣一點(diǎn),以后面試聊到內(nèi)存優(yōu)化時(shí)可以不用擔(dān)心只會(huì)講 Java 內(nèi)存了哈哈!還在等什么,快來使用吧!

如果對(duì)你有幫助,歡迎點(diǎn)一個(gè) star,感謝: github.com/shixinzhang…

以上就是Android Bitmap Monitor自研內(nèi)存分析利器的詳細(xì)內(nèi)容,更多關(guān)于Android Bitmap Monitor內(nèi)存分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論