Android 啟動(dòng)優(yōu)化工具使用介紹

一、TraceView

TraceView 是 Android SDK 自帶的工具,用來(lái)分析函數(shù)調(diào)用過(guò)程,可以對(duì)Android的應(yīng)用程序以及Framework層的代碼進(jìn)行性能分析。它是一個(gè)圖形化的工具,最終會(huì)產(chǎn)生一個(gè)圖表,用于對(duì)性能分析進(jìn)行說(shuō)明,可以分析到應(yīng)用具體每一個(gè)方法的執(zhí)行時(shí)間,使用非常直觀簡(jiǎn)單,分析性能問(wèn)題很簡(jiǎn)便。

  • 圖形的形式展示執(zhí)行時(shí)間、調(diào)用棧等。
  • 信息全面,包含所有線程
TraceView 使用方法

使用代碼的方式生成 trace 文件。

//開(kāi)始 trace 文件,保存到 sdcard/Android/data/packagename/files
Debug.startMethodTracing("PerformanceApp")
//結(jié)束
Debug.stopMethodTracing()

當(dāng)你調(diào)用開(kāi)始代碼的時(shí)候,系統(tǒng)會(huì)生產(chǎn) trace 文件,并且產(chǎn)生追蹤數(shù)據(jù),當(dāng)你調(diào)用結(jié)束代碼時(shí),會(huì)將追蹤數(shù)據(jù)寫(xiě)入到 trace 文件中。

如,在Application 中記錄三方庫(kù)運(yùn)行情況分析,如下代碼所示:

class PerformanceApp : Application() {

    override fun onCreate() {
        super.onCreate()
        Debug.startMethodTracing("PerformanceApp")
        sApplication = this
        //騰訊Bugly
        initBugly()
        //友盟
        initUmeng()
        //Fresco 圖片加載
        initFresco()
        //高德地圖
        initMap()
        Debug.stopMethodTracing()
    }
}

點(diǎn)擊 AndroidStudio 右下角 Device File Explorer 即可打開(kāi)文件位置,如下圖所示。

trace 文件路徑圖

接下來(lái),我們打開(kāi) PerformanceApp.trace 文件,如下圖:

  1. 選擇時(shí)間范圍: 用于確定您要在跟蹤窗格中檢查所記錄時(shí)間范圍的哪一部分。 當(dāng)您首次記錄函數(shù)跟蹤時(shí),CPU Profiler 將在 CPU 時(shí)間線中自動(dòng)選擇您的記錄的完整長(zhǎng)度。 如果您想僅檢查所記錄時(shí)間范圍一小部分的函數(shù)跟蹤數(shù)據(jù),您可以點(diǎn)擊并拖動(dòng)突出顯示的區(qū)域邊緣以修改其長(zhǎng)度。

  2. Call Chart:調(diào)用圖表

Call Chart 是 Traceview 默認(rèn)使用的展示方式。它按照應(yīng)用程序的函數(shù)執(zhí)行順序來(lái)展示,適合用于分析整個(gè)流程的調(diào)用。舉一個(gè)最簡(jiǎn)單的例子,A 函數(shù)調(diào)用 B 函數(shù),B 函數(shù)調(diào)用 C 函數(shù),循環(huán)三次,就得到了 Call Chart

橙色:系統(tǒng) api 調(diào)用顏色是橙色
綠色:應(yīng)用自身的一些函數(shù)的調(diào)用是綠色
藍(lán)色:第三方 api 調(diào)用是藍(lán)色

  1. Flame Chart:火焰圖

收集相同的調(diào)用順序的完全相同的函數(shù)。

  1. Top Down 樹(shù)

函數(shù)的調(diào)用列表。調(diào)用了A函數(shù),整體時(shí)間是Total,A函數(shù)執(zhí)行了一行代碼,然后調(diào)用了B函數(shù),Self 就是執(zhí)行一行代碼的時(shí)間,Children 就是B函數(shù)的時(shí)間。Total=Self+Children。

  1. Bottom Up 樹(shù)
  2. 下拉菜單中選擇如何測(cè)量每個(gè)函數(shù)調(diào)用的時(shí)間信息:

Wall clock time:壁鐘時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間(如:一段代碼發(fā)生在 A 線程上,這個(gè)線程真正執(zhí)行了多長(zhǎng)時(shí)間,比如這段代碼執(zhí)行了 100ms,那么 WallClockTime 就是 100ms。)
Thread time:CPU 執(zhí)行的時(shí)間。線程時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間減去線程沒(méi)有消耗 CPU 資源的任意時(shí)間部分。 對(duì)于任何給定函數(shù),其線程時(shí)間始終少于或等于其壁鐘時(shí)間。 使用線程時(shí)間可以讓您更好地了解線程的實(shí)際 CPU 使用率中有多少是給定函數(shù)消耗的。

使用 Call Chart 標(biāo)簽檢查跟蹤

Call Chart 標(biāo)簽提供函數(shù)跟蹤的圖形表示形式,其中,水平軸表示函數(shù)調(diào)用(或調(diào)用方)的時(shí)間段和時(shí)間,并沿垂直軸顯示其被調(diào)用者。 對(duì)系統(tǒng) API 的函數(shù)調(diào)用顯示為橙色,對(duì)應(yīng)用自有函數(shù)的調(diào)用顯示為綠色,對(duì)第三方 API(包括 Java 語(yǔ)言 API)的函數(shù)調(diào)用顯示為藍(lán)色。 下面的圖 1 展示了一個(gè)調(diào)用圖表示例,并描繪了給定函數(shù)的 self time、children time 以及總時(shí)間的概念。 您可以在如何使用 Top Down 和 Bottom Up 檢查跟蹤部分詳細(xì)了解這些概念。

![圖 1. 一個(gè)調(diào)用圖表示例,描繪了函數(shù) D 的 self、children 及總時(shí)間]
(https://upload-images.jianshu.io/upload_images/2079881-90eeb40ac0f1f84d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

使用 Flame Chart 標(biāo)簽檢查跟蹤

Flame Chart 標(biāo)簽提供一個(gè)倒置的調(diào)用圖表,其匯總相同的調(diào)用堆棧。 即,收集共享相同調(diào)用方順序的完全相同的函數(shù),并在火焰圖中用一個(gè)較長(zhǎng)的橫條表示它們(而不是將它們顯示為多個(gè)較短的橫條,如調(diào)用圖表中所示)。 這樣更方便您查看哪些函數(shù)消耗最多時(shí)間。 不過(guò),這也意味著水平軸不再代表時(shí)間線,相反,它表示每個(gè)函數(shù)相對(duì)的執(zhí)行時(shí)間。
為幫助說(shuō)明此概念,請(qǐng)考慮以下圖 2 中的調(diào)用圖表。 請(qǐng)注意,函數(shù) D 多次調(diào)用 B(B1、B2 和 B3),其中一些對(duì) B 的調(diào)用也調(diào)用了 C(C1 和 C3)。

圖 2. 包含多個(gè)共享通用調(diào)用方順序的函數(shù)調(diào)用的調(diào)用圖表

由于 B1、B2 和 B3 共享相同的調(diào)用方順序 (A → D → B),因此,可將它們匯總在一起,如下所示。 同樣,將 C1 和 C3 匯總在一起,因?yàn)樗鼈円补蚕硐嗤恼{(diào)用方順序 (A → D → B → C)—請(qǐng)注意,未包含 C2,因?yàn)樗哂胁煌恼{(diào)用方順序 (A → D → C)。

圖 3. 匯總共享相同調(diào)用堆棧的相同函數(shù)

匯總的函數(shù)調(diào)用用于創(chuàng)建火焰圖,如圖 4 所示。請(qǐng)注意,對(duì)于火焰圖中任何給定的函數(shù)調(diào)用,消耗最多 CPU 時(shí)間的被調(diào)用方首先顯示。

圖 4 顯示的調(diào)用圖表的火焰圖表示形式
TraceView 缺點(diǎn)

TraceView 性能開(kāi)銷(xiāo)過(guò)大,有時(shí)無(wú)法反映真實(shí)的情況。比如一個(gè)函數(shù)本身的耗時(shí)是 1 秒,開(kāi)啟 Traceview 后可能會(huì)變成 5 秒,而且這些函數(shù)的耗時(shí)變化并不是成比例放大。

在 Android 5.0 之后,新增了startMethodTracingSampling
方法,可以使用基于樣本的方式進(jìn)行分析,以減少分析對(duì)運(yùn)行時(shí)的性能影響。新增了 sample 類(lèi)型后,就需要我們?cè)陂_(kāi)銷(xiāo)和信息豐富度之間做好權(quán)衡。

  1. 官方文檔:https://developer.android.com/studio/profile/cpu-profiler#method_traces

本文參考:http://www.itdecent.cn/p/41fcf5b4b5eb

二、Systrace

https://www.wanandroid.com/blog/show/2184

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容