Android效能優化你瞭解多少

codeGoogle發表於2017-08-15

還在為專案中的記憶體洩露發愁呢?還在為卡頓現象找不到原因嗎?今天介紹一個強大的除錯工具——BlockCannery。學完這個相信你能收穫不少。

BlockCannery- 輕鬆找出Android App介面卡頓元凶

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

Android效能優化 (1)—— 記憶體溢位和記憶體洩漏的介紹

BlockCanary 是一個 Android 平臺的一個,應用只需要實現一個抽象類,提供一些該元件需要的上下文環境,就可以在平時使用應用的時候檢測主執行緒上的各種卡慢問題,並通過元件提供的各種資訊分析出原因並進行修復。

BlockCanary已有幾個不同的版本,其改進如下:

  • 1.5.0  新增可以在除錯模式下停止監視的上下文。
  • 1.4.1 修復錯誤
  • 1.4.0 錯誤修復,在上下文中新增onBlock攔截器。
  • 1.3.1 啟用標籤和圖示的配置。
  • 1.3.0 新增白名單和關注包功能。

先看效果圖吧:

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()方法里加入:

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

監視應用程式的標籤和圖示可以通過在xhdpi drawable目錄和strings.xml中放置一個可以繪製的塊金絲雀圖來配置:

/**
 * 實現各種上下文,包括應用標示符,使用者 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
微信公眾號:終端研發部

技術+職場
技術+職場

相關文章