Android性能優化你瞭解多少

還在爲項目中的內存泄露發愁呢?還在爲卡頓現象找不到緣由嗎?今天介紹一個強大的調試工具——BlockCannery。學完這個相信你能收穫很多。java

BlockCannery- 輕鬆找出Android App界面卡頓元兇

沒有了解過性能優化的童鞋們建議先閱讀:android

Android性能優化 (1)—— 內存溢出和內存泄漏的介紹git

BlockCanary 是一個 Android 平臺的一個,應用只須要實現一個抽象類,提供一些該組件須要的上下文環境,就能夠在平時使用應用的時候檢測主線程上的各類卡慢問題,並經過組件提供的各類信息分析出緣由並進行修復。github

BlockCanary已有幾個不一樣的版本,其改進以下:性能優化

  • 1.5.0  添加能夠在調試模式下中止監視的上下文。
  • 1.4.1 修復錯誤
  • 1.4.0 錯誤修復,在上下文中添加onBlock攔截器。
  • 1.3.1 啓用標籤和圖標的配置。
  • 1.3.0 添加白名單和關注包功能。

先看效果圖吧:bash

Markdown
Markdown

Markdown
Markdown

代碼指向了DemoFragment.java的第109行微信

Markdown
Markdown

用法:

  • 第一步:

在androidmenifest.xml中配置:網絡

//compile 'com.github.markzhai:blockcanary-android:1.5.0'
debugCompile'com.github.markzhai:blockcanary-android:1.5.0'
releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0'複製代碼
  • 第二步:

實現本身的application
並在onCreate()方法里加入:app

BlockCanary.install(this, new AppBlockCanaryContext()).start();複製代碼
  • 第三步

監視應用程序的標籤和圖標能夠經過在xhdpi drawable目錄和strings.xml中放置一個能夠繪製的塊金絲雀圖來配置:ide

/**
 * 實現各類上下文,包括應用標示符,用戶 uid,網絡類型,卡慢判斷闕值,Log 保存位置等
 */

public class AppBlockCanaryContext  extends BlockCanaryContext {

    /**
     * Implement in your project.
     *
     * @return Qualifier which can specify this installation, like version + flavor.
     */
    public String provideQualifier() {
        return "unknown";
    }

    /**
     * Implement in your project.
     *
     * @return user id
     */
    public String provideUid() {
        return "uid";
    }
  ......
}複製代碼

第四步運行demo便可

這裏我已經寫了相關的例子:

用例demo鏈接:
github.com/androidstar…

相關介紹

  • 非侵入式,簡單的兩行就打開監控,不須要處處打點,破壞代碼優雅性。

  • 精準,輸出的信息能夠幫助定位到問題所在(精確到行),不須要像Logcat同樣,慢慢去找。
    目前包括了核心監控輸出文件,以及UI顯示卡頓信息功能。僅支持Android端。

若是咱們熟悉Message/Looper/Handler系列的同鞋們必定知道Looper.java中這麼一段:

public static void prepareMainLooper() {
    prepare(false);
    synchronized (Looper.class) {
        if (sMainLooper != null) {
            throw new IllegalStateException("The main Looper has already been prepared.");
        }
        sMainLooper = myLooper();
    }
}

/** Returns the application's main looper, which lives in the main thread of the application. */ public static Looper getMainLooper() { synchronized (Looper.class) { return sMainLooper; } }複製代碼

即整個應用的主線程,只有這一個looper,無論有多少handler,最後都會回到這裏:

Markdown
Markdown

cpuBusy判斷:

Markdown
Markdown

到這裏你們是否是很清楚了。原理是參考的簡書做者爲 www.jianshu.com/p/cd7fc7740…。在這裏深表感謝。

BlockCanary參數的解讀

  • cpuCore:手機cpu個數。

  • processName:應用包名。

  • freeMemory: 手機剩餘內存,單位KB。

  • totalMemory: 手機內訓總和,單位KB。

  • timecost: 該Message(事件)執行時間,單位 ms。

  • threadtimecost: 該Message(事件)執行線程時間(線程實際運行時間,不包含別的線程佔用cpu時間),單位 ms。

  • cpubusy: true表示cpu負載太重,false表示cpu負載不重。cpu負載太重致使該Message(事件) 超時,錯誤不在本事件處理上。

BlockCanary卡頓檢測流程

BlockCanary啓動一個線程負責保存UI線程當前堆棧信息,將堆棧信息以及CPU信息保存分別保存在 mThreadStackEntries和mCpuInfoEntries中,每條信息都以時間撮爲key保存。

BlockCanary註冊了logging來獲取事件開始結束時間。若是檢測到事件處理時間超過閾值(默認值1s),則從mThreadStackEntries中查找T1~T2這段時間內的堆棧信息,而且從mCpuInfoEntries中查找T1~T2這段時間內的CPU及內存信息。而且將信息格式化後保存到本地文件,而且通知用戶

工做原理流程圖:

Markdown
Markdown

據知:目前阿里內多個Android項目接入並使用BlockCanary來優化Android應用的性能

BlockCannery很方面使用,另外你們也可使用 LeakCanary檢測內存泄漏及解決辦法。

另外你們若是對Android內存泄露和溢出不太熟悉的童鞋們能夠進行閱讀:
Android性能優化 (1)—— 內存溢出和內存泄漏的介紹

博客地址:
blog.csdn.net/androidstar…

相信本身,沒有作不到的,只有想不到的

若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部

技術+職場
技術+職場
相關文章
相關標籤/搜索