Android Profile Tools 入門

本次分享會目的

通過對增加對 Android Profile Tools 的了解,提高大家工作過程中定位和解決Bug的效率。

注意事項

  • 為了不耽誤大家時間,語速可能會快一些
  • 如果講到某個工具或者技巧,你不太了解,一定要記住它可以解決什么問題。后期如果開發(fā)過程中用到可以再查詢具體使用技巧。
  • 如果對我分享的某個工具和技巧,很熟練,你的經(jīng)驗我又恰好沒有講到,歡迎打斷我然后分享自己的經(jīng)驗,這樣可以使本次分享會的作用最大化。

學習 Android 開發(fā)知識個人認為最重要的一點

盡量用谷歌查bug,查問題原因,查知識點。
使用靠譜的學習渠道——谷歌官網(wǎng)。

Profile Tools

谷歌官方提供的Profile Tools主要有兩類:Android Studio Tools 和 Command Line Tools。

Android Studio Tools

1、CPU Profiler
2、Memory Profiler
3、Network Profiler
4、Battery Historian
5、Energy Profiler
6、Profile GPU Rendering
7、Graphics API Debugger (Analyze OpenGL with Tracer is deprecated)
8、Layout Inspector (Hierarchy Viewer is deprecated)

Command Line Tools

1、systrace
2、dumpsys
3、dmtracedump
……


WX20181115-173603.png

Android Profiler

https://developer.android.com/studio/profile
https://developer.android.com/studio/profile?hl=en

官方簡介:
An app is considered to have poor performance if it responds slowly, shows choppy animations, freezes, crashes, or consumes a lot of power. To avoid these performance problems, use the profiling tools listed on this page to identify where your app is making inefficient use of resources, such as the CPU, memory, graphics, network, and device battery.
如果應用程序響應緩慢,顯示不穩(wěn)定的動畫,凍結,崩潰或消耗大量功率,則應用程序被認為性能較差。 要避免這些性能問題,請使用此頁面上列出的性能分析工具來確定應用程序在何處低效使用資源,例如CPU,內(nèi)存,圖形,網(wǎng)絡和設備電池。

Profile:扼要介紹;概述。
在 “Profile Tools” 這個場景下感覺翻譯成“配置,全面測量”比較合適。
個人的感覺Profile Tools更偏向宏觀層面的整體測試。
實際舉例:如果耗電量過多,需要先從整體判斷,有可能耗電多的點是AlarmManager的使用,還是Wakelock使用太多,通過Profile Tools先進行判斷,然后再在微觀代碼層面進行優(yōu)化。

使用注意事項:

  • While profiling an app, you should [disable Instant Run]。There is a small performance impact when using Instant Run and a slightly larger impact when updating methods. This performance impact could interfere with information provided by performance profiling tools. Additionally, the stub methods generated while using the feature can complicate stack traces.
    在分析應用程序時,應該禁用“Instant Run”。 使用Instant Run時性能影響很小,更新方法時影響稍大。 此性能影響可能會干擾性能分析工具提供的信息。 此外,使用該功能時生成的存根方法可能會使堆棧跟蹤變得復雜。
  • Android Studio 3.0 采用全新的 **Android Profiler ** 窗口取代 Android Monitor 工具。 如果使用Android Profiler需要使用比較新的Android Studio。

之前的Android Monitor :
1542164793707.jpg
打開 Android Profiler 窗口步驟:
  1. 點擊 View > Tool Windows > Android Profiler(也可以點擊工具欄中的 Android Profiler )。

    屏幕快照 2018-11-14 上午11.40.45.png

  2. Android Profiler 窗口頂部,選擇想要分析的設備 1 和應用進程 2。
    如果通過 USB 連接了某個設備但該設備未在設備列表中列出,請確保已啟用 USB 調(diào)試。

如果使用的是 Android Emulator 或已取得 root 權限的設備,Android Profiler 將列出所有正在運行的進程,即使這些進程可能無法調(diào)試。 當發(fā)布可調(diào)試應用時,將會默認選擇此進程。


WX20181114-114451.png
啟用高級分析

要顯示高級分析數(shù)據(jù),Android Studio 必須在編譯后的應用中插入監(jiān)控邏輯。 我個人的理解就是打開了高級分析,可以獲取更加詳細的監(jiān)控數(shù)據(jù)。
高級分析工具提供的功能包括:

1、Event 時間線(所有分析器窗口中均有)
2、分配對象數(shù)量(Memory Profiler 中)
3、垃圾回收 Event(Memory Profiler 中)
4、有關所有傳輸?shù)奈募脑斍椋∟etwork Profiler 中)

要啟用高級分析,請按以下步驟操作:

1、選擇 Run > Edit Configurations。
2、在左側(cè)窗格中選擇的應用模塊。
3、點擊 Profiling 標簽,然后勾選 Enable advanced profiling。
4、現(xiàn)在重新構建并運行的應用,即可獲取完整的分析功能。 但請注意,高級分析會減緩的構建速度,所以僅當想要開始分析應用時才啟用此功能。

注:對于原生代碼,不可使用高級分析功能。 如果的應用是純原生應用(不含 Java Activity 類),則不可使用高級分析功能。 如果的應用使用了 JNI,則可使用部分高級分析功能,例如 Event 時間線、GC Event、Java 分配對象和基于 Java 的網(wǎng)絡 Activity,但不能檢測基于原生的分配和網(wǎng)絡 Activity。


WX20181114-115109.png

CPU Profiler

CPU Profiler 可幫助實時檢查應用的 CPU 使用率和線程活動,并記錄函數(shù)跟蹤,以便可以優(yōu)化和調(diào)試的應用代碼。

要打開 CPU Profiler,請按以下步驟操作:

  1. 點擊 View > Tool Windows > Android Profiler(也可以點擊工具欄中的 Android Profiler)。
  2. 從 Android Profiler 工具欄中選擇想要分析的設備和應用進程。 如果通過 USB 連接了某個設備但該設備未在設備列表中列出,請確保已啟用 USB 調(diào)試
  3. 點擊 CPU 時間線中的任意位置即可打開 CPU Profiler。
為什么要分析 CPU 使用率

最大限度減少應用的 CPU 使用率具有許多優(yōu)勢,如提供更快更順暢的用戶體驗,以及延長設備電池續(xù)航時間。 它還可幫助應用在各種新舊設備上保持良好性能。 與應用交互時,可以使用 CPU Profiler 監(jiān)控 CPU 使用率和線程 Activity。 不過,如需了解應用如何執(zhí)行其代碼的詳細信息,應記錄和檢查函數(shù)跟蹤。

對于應用進程中的每個線程,可以查看一段時間內(nèi)執(zhí)行了哪些函數(shù),以及在其執(zhí)行期間每個函數(shù)消耗的 CPU 資源。 還可以使用函數(shù)跟蹤來識別調(diào)用方被調(diào)用方。 調(diào)用方指調(diào)用其他函數(shù)的函數(shù),而被調(diào)用方是指被其他函數(shù)調(diào)用的函數(shù)。 您可以使用此信息確定哪些函數(shù)負責調(diào)用常常會消耗大量特定資源的任務,并嘗試優(yōu)化應用代碼以避免不必要的工作。

翻譯:查看哪個函數(shù)消耗時間太多。

Memory Profiler

Memory Profiler 是 Android Profiler 中的一個組件,可幫助您識別導致應用卡頓、凍結甚至崩潰的內(nèi)存泄漏和流失。 它顯示一個應用內(nèi)存使用量的實時圖表,讓您可以捕獲堆轉(zhuǎn)儲、強制執(zhí)行垃圾回收以及跟蹤內(nèi)存分配。

打開 Memory Profiler 步驟:
  1. 點擊 View > Tool Windows > Android Profiler(也可以點擊工具欄中的 Android Profiler)。
  2. 從 Android Profiler 工具欄中選擇您想要分析的設備和應用進程。 如果您通過 USB 連接了某個設備但該設備未在設備列表中列出,請確保您已啟用 USB 調(diào)試。
  3. 點擊 **MEMORY **時間線中的任意位置可打開 Memory Profiler。


    image.png
為什么應分析您的應用內(nèi)存

Android 提供一個托管內(nèi)存環(huán)境—當它確定您的應用不再使用某些對象時,垃圾回收器會將未使用的內(nèi)存釋放回堆中。 雖然 Android 查找未使用內(nèi)存的方式在不斷改進,但對于所有 Android 版本,系統(tǒng)都必須在某個時間點短暫地暫停您的代碼。 大多數(shù)情況下,這些暫停難以察覺。 不過,如果您的應用分配內(nèi)存的速度比系統(tǒng)回收內(nèi)存的速度快,則當收集器釋放足夠的內(nèi)存以滿足您的分配需要時,您的應用可能會延遲。 此延遲可能會導致您的應用跳幀,并使系統(tǒng)明顯變慢。

盡管您的應用不會表現(xiàn)出變慢,但如果存在內(nèi)存泄漏,則即使應用在后臺運行也會保留該內(nèi)存。 此行為會強制執(zhí)行不必要的垃圾回收 Event,因而拖慢系統(tǒng)的內(nèi)存性能。 最后,系統(tǒng)被迫終止您的應用進程以回收內(nèi)存。 然后,當用戶返回您的應用時,它必須完全重啟。

為幫助防止這些問題,您應使用 Memory Profiler 執(zhí)行以下操作:

  • 在時間線中查找可能會導致性能問題的不理想的內(nèi)存分配模式。
  • 轉(zhuǎn)儲 Java 堆以查看在任何給定時間哪些對象耗盡了使用內(nèi)存。 長時間進行多個堆轉(zhuǎn)儲可幫助識別內(nèi)存泄漏。
  • 記錄正常用戶交互和極端用戶交互期間的內(nèi)存分配以準確識別您的代碼在何處短時間分配了過多對象,或分配了泄漏的對象。
memory-profiler-callouts_2x.png

如圖所示,Memory Profiler 的默認視圖包括以下各項:

  1. 用于強制執(zhí)行垃圾回收 Event 的按鈕。
  2. 用于捕獲堆轉(zhuǎn)儲的按鈕。
  3. 用于記錄內(nèi)存分配情況的按鈕。 此按鈕僅在連接至運行 Android 7.1 或更低版本的設備時才會顯示。
  4. 用于放大/縮小時間線的按鈕。
  5. 用于跳轉(zhuǎn)至實時內(nèi)存數(shù)據(jù)的按鈕。
  6. Event 時間線,其顯示 Activity 狀態(tài)、用戶輸入 Event 和屏幕旋轉(zhuǎn) Event。
  7. 內(nèi)存使用量時間線,其包含以下內(nèi)容:
    • 一個顯示每個內(nèi)存類別使用多少內(nèi)存的堆疊圖表,如左側(cè)的 y 軸以及頂部的彩色鍵所示。
    • 虛線表示分配的對象數(shù),如右側(cè)的 y 軸所示。
    • 用于表示每個垃圾回收 Event 的圖標。

備注:Android 8.0 以上可以看到全部信息,8.0以下默認不是所有數(shù)據(jù)可見,需要啟用高級分析才能查看以下內(nèi)容:
* Event 時間線
* 分配的對象數(shù)
* 垃圾回收 Event

如何計算內(nèi)存

您在 Memory Profiler頂部看到的數(shù)字取決于您的應用根據(jù) Android 系統(tǒng)機制所提交的所有私有內(nèi)存頁面數(shù)。 此計數(shù)不包含與系統(tǒng)或其他應用共享的頁面。

memory-profiler-counts_2x.png

內(nèi)存計數(shù)中的類別如下所示:

  • Java:從 Java 或 Kotlin 代碼分配的對象內(nèi)存。

  • Native:從 C 或 C++ 代碼分配的對象內(nèi)存。

    即使您的應用中不使用 C++,您也可能會看到此處使用的一些原生內(nèi)存,因為 Android 框架使用原生內(nèi)存代表您處理各種任務,如處理圖像資源和其他圖形時,即使您編寫的代碼采用 Java 或 Kotlin 語言。

  • Graphics:圖形緩沖區(qū)隊列向屏幕顯示像素(包括 GL 表面、GL 紋理等等)所使用的內(nèi)存。 (請注意,這是與 CPU 共享的內(nèi)存,不是 GPU 專用內(nèi)存。)

  • Stack: 您的應用中的原生堆棧和 Java 堆棧使用的內(nèi)存。 這通常與您的應用運行多少線程有關。

  • Code:您的應用用于處理代碼和資源(如 dex 字節(jié)碼、已優(yōu)化或已編譯的 dex 碼、.so 庫和字體)的內(nèi)存。

  • Other:您的應用使用的系統(tǒng)不確定如何分類的內(nèi)存。

  • Allocated:您的應用分配的 Java/Kotlin 對象數(shù)。 它沒有計入 C 或 C++ 中分配的對象。

    當連接至運行 Android 7.1 及更低版本的設備時,此分配僅在 Memory Profiler 連接至您運行的應用時才開始計數(shù)。 因此,您開始分析之前分配的任何對象都不會被計入。 不過,Android 8.0 附帶一個設備內(nèi)置分析工具,該工具可記錄所有分配,因此,在 Android 8.0 及更高版本上,此數(shù)字始終表示您的應用中待處理的 Java 對象總數(shù)。

與以前的 Android Monitor 工具中的內(nèi)存計數(shù)相比,新的 Memory Profiler 以不同的方式記錄您的內(nèi)存,因此,您的內(nèi)存使用量現(xiàn)在看上去可能會更高些。 Memory Profiler 監(jiān)控的類別更多,這會增加總的內(nèi)存使用量,但如果您僅關心 Java 堆內(nèi)存,則“Java”項的數(shù)字應與以前工具中的數(shù)值相似。

然而,Java 數(shù)字可能與您在 Android Monitor 中看到的數(shù)字并非完全相同,這是因為應用的 Java 堆是從 Zygote 啟動的,而新數(shù)字則計入了為它分配的所有物理內(nèi)存頁面。 因此,它可以準確反映您的應用實際使用了多少物理內(nèi)存。

注:目前,Memory Profiler 還會顯示應用中的一些誤報的原生內(nèi)存使用量,而這些內(nèi)存實際上是分析工具使用的。 對于大約 100000 個對象,最多會使報告的內(nèi)存使用量增加 10MB。 在這些工具的未來版本中,這些數(shù)字將從您的數(shù)據(jù)中過濾掉。

Network Profiler

為什么應分析應用的網(wǎng)絡活動

When your app makes a request to the network, the device must use the power-hungry mobile or WiFi radios to send and receive packets. The radios not only use power to transfer data, but also use extra power to turn on and to stay awake.

Using the Network Profiler, you can look for frequent, short spikes of network activity, which mean that your app requires the radios to turn on frequently, or to stay awake for long periods to handle many short requests close together. This pattern indicates that you may be able to optimize your app for improved battery performance by batching network requests, thereby reducing the number of times the radios must turn on to send or receive data. This also allows the radios to switch into low-power mode to save battery in the longer gaps between batched requests.

For more information about techniques to optimize your app's network activity, read Reducing network battery drain.

1、頻繁網(wǎng)絡請求不僅僅本身消耗電量,而且手機因為無法休眠導致消耗更多電量
2、使用Network Profiler可以找出網(wǎng)絡請求的狀態(tài),找出其中可以優(yōu)化的部分,達到優(yōu)化應用,改善電池續(xù)航。

僅支持HttpURLConnection和OkHttp

如果 Network Profiler 檢測到流量值,但無法識別任何受支持的網(wǎng)絡請求,您會收到以下錯誤消息:

"Network Profiling Data Unavailable: There is no information for the network traffic you've selected."

Network Profiler 目前只支持 HttpURLConnectionOkHttp 網(wǎng)絡連接庫。 如果您的應用使用的是其他網(wǎng)絡連接庫,則可能無法在 Network Profiler 中查看網(wǎng)絡 Activity。

Battery Historian

Batterystats是Android框架中包含的工具,用于收集設備上的電池數(shù)據(jù)。 您可以使用adb將收集的電池數(shù)據(jù)轉(zhuǎn)儲到開發(fā)機器,并使用Battery Historian創(chuàng)建可以分析的報告。 Battery Historian將報告從Batterystats轉(zhuǎn)換為可在瀏覽器中查看的HTML可視化文件。

好處有:
1、電池消耗的詳情
2、識別應用中可能會延遲甚至刪除的任務,以延長電池壽命。

從Batterystats提取數(shù)據(jù)的步驟:
1、將移動設備連接到計算機。
2、通過終端窗口,關閉正在運行的adb服務
adb kill-server
3、重新啟動adb并檢查已連接的設備。
adb devices
4、重置Batterystats數(shù)據(jù)采集
adb shell dumpsys batterystats --reset

設備會始終在后臺收集batterystats和其他調(diào)試信息。重置會刪除舊的Batterystats收集數(shù)據(jù)。如果不重置,輸出的文件將會十分巨大。

5、斷開設備與計算機的連接,以便設備僅使用電池的電量。
6、執(zhí)行需要測試的操作:使用目標APP等
7、重新連接手機。
8、確保手機已經(jīng)連接
adb devices
9、轉(zhuǎn)儲所有電池數(shù)據(jù)。可能需要一些時間:
adb shell dumpsys batterystats [path/]batterystats.txt
使用可選路徑參數(shù)在指定的目錄中創(chuàng)建batterystats.txt文件。如果未指定路徑,則會在主目錄中創(chuàng)建該文件。
10、從原始數(shù)據(jù)創(chuàng)建報告:
Android 7.0 或者更高版本:
adb bugreport > [path/]bugreport.zip
Android 6.0 或者更低版本:
adb bugreport > [path/]bugreport.txt

Bugreport可能需要幾分鐘才能完成。在完成之前,請勿斷開設備或取消該過程。

11、啟動Battery Historian 并登陸到相應界面:


Bugreport

12、提交Bugreport文件,并點擊Submit。完成數(shù)據(jù)分析。

WX20181115-162719.png

GPU Rendering

Profile GPU Rendering 工具以滾動直方圖的形式直觀地顯示渲染界面窗口幀所花費的時間(以每幀 16 毫秒的速度作為對比基準)。

在性能較低的 GPU 上,可用的填充率(GPU 填充幀緩沖區(qū)的速度)可能很低。 隨著繪制幀所需的像素數(shù)增加,GPU 可能需要花較長時間來處理新命令,并要求系統(tǒng)的其余任務等待,直到系統(tǒng)可以跟上需求。 此分析工具可幫助您確定 GPU 何時因嘗試繪制像素而負擔過重,或何時因大量的過度繪制而被拖累。

注:此分析工具不適用于使用 NDK 的應用。 推薦使用 GPU 制造商提供的分析工具。

啟用分析器

開始前,請確保您使用的是運行 Android 4.1(API 級別 16)或更高版本的設備,并啟用開發(fā)者選項。 要在使用應用時開始分析設備 GPU 渲染,請執(zhí)行以下操作:

  1. 在您的設備上,轉(zhuǎn)到 Settings 并點按 Developer Options。
  2. Monitoring 部分,選擇 Profile GPU Rendering
  3. 在 Profile GPU Rendering 對話框中,選擇 On screen as bars 以在設備屏幕上疊加圖表。
  4. 打開您要分析的應用。
QQ20181115-0.jpg
注意事項:

1、對于每個可見應用,此工具將顯示一個圖表。
2、沿水平軸的每個豎條都代表一個幀,每個豎條的高度表示渲染該幀所花的時間(單位:毫秒)。
3、水平綠線表示 16 毫秒。 要實現(xiàn)每秒 60 幀,代表每個幀的豎條需要保持在此線以下。 當豎條超出此線時,可能會使動畫出現(xiàn)暫停。
此工具通過加寬對應的豎條并降低透明度來突出顯示超出 16 毫秒閾值的幀。
4、每個豎條都有與渲染管道中某個階段對應的彩色區(qū)段。 區(qū)段數(shù)因設備的 API 級別而異。

下表介紹了使用運行 Android 6.0 及更高版本的設備時分析器輸出中某個豎條的每個區(qū)段。


![WX20181115-151406.png](https://upload-images.jianshu.io/upload_images/11156469-2551c3bc943512d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4.0(API 級別 14)和 5.0(API 級別 21)之間的 Android 版本具有藍色、紫色、紅色和橙色區(qū)段。 低于 4.0 的 Android 版本只有藍色、紅色和橙色區(qū)段。 下表顯示的是 Android 4.0 和 5.0 中的豎條區(qū)段。


WX20181115-151406.png

Energy Profiler

The Energy Profiler helps you to find where your app uses more energy than necessary.

The Energy Profiler monitors the use of the CPU, network radio, and GPS sensor, and it displays a visualization of how much energy each of these components uses. The Energy Profiler also shows you occurrences of system events (wake locks, alarms, jobs, and location requests) that can affect energy consumption.

The Energy Profiler does not directly measure energy consumption. Rather, it uses a model that estimates the energy consumption for each resource on the device.

1、Energy Profiler可幫助您找到應用程序使用的能量超出必要的程度。

2、Energy Profiler監(jiān)控CPU,network radio和GPS傳感器的使用情況,并顯示每個組件使用多少能量的可視化。 Energy Profiler還會顯示可能影響能耗的系統(tǒng)事件(wake locks, alarms, jobs和位置請求)。

3、Energy Profiler不直接測量能耗。 相反,它使用一種模型來估算設備上每種資源的能耗。

WakeLock:A wake lock is a mechanism to indicate that your application needs to have the device stay on.
喚醒鎖是一種機制,用于指示您的應用程序需要讓設備保持打開狀態(tài)。
AlarmManager:This class provides access to the system alarm services.
系統(tǒng)時鐘,通過廣播方式發(fā)送提醒。
JobScheduler :This is an API for scheduling various types of jobs against the framework that will be executed in your application's own process.
工作調(diào)度器:通過系統(tǒng)后臺服務,執(zhí)行自己的任務。相比AlarmManager更加省電。

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

相關閱讀更多精彩內(nèi)容

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