面試Tip之Android優化工具Systrace

我是程式設計師七貓發表於2018-07-04

——查閱過無數的systrace資料後,我覺得這個工具介紹篇,可能不會讓大家特別滿意,但是當且算一個學習階段的紀錄吧,希望大家一起學習進步

Systrace

Systrace是分析Android裝置的效能的主要工具

作用

用於收集可幫助您檢查原生系統程式的詳細系統級資料,例如CPU排程、磁碟活動、應用執行緒等,並解決掉幀引起的介面卡頓

本質

它是 atrace 的主機端封裝容器,是用於控制使用者空間跟蹤和設定 ftrace 的裝置端可執行檔案,也是 Linux 核心中的主要跟蹤機制。 systrace 使用 atrace 來啟用跟蹤,然後讀取 ftrace 緩衝區並將其全部封裝到一個獨立的 HTML 檢視器中

官網

https://source.android.google.cn/devices/tech/debug/systrace https://developer.android.google.cn/studio/command-line/systrace

extra: 什麼是atrace?什麼是ftrace?

ftrace 是一種除錯工具,用於瞭解 Linux 核心中的情況;而 atrace (frameworks/native/cmds/atrace) 使用 ftrace 來捕獲核心事件; 官網簡單的介紹地址:https://source.android.google.cn/devices/tech/debug/ftrace

抓取方法

抓取資訊方式有以下三種

1.systrace.py 2.AndroidStudio Systrace工具 3.自定義trace

1.systrace.py

使用python命令以及systrace.py工具 systrace.py工具位置在 sdk/platform-tools/systrace;

python systrace.py [options] [categories]
複製程式碼

示例: 呼叫systrace來記錄10秒鐘內的裝置程式,包括圖形程式,並生成mynewtrace.html報告 具體命令如下

python systrace.py --time=10 -o mynewtrace.html gfx
複製程式碼

引數資訊

options參數列
options description
-o < FILE > 輸出的目標檔案
-t N, –time=N 執行時間,預設5s
-b N, –buf-size=N buffer大小(單位kB),用於限制trace總大小,預設無上限
-k < KFUNCS >,–ktrace=< KFUNCS > 追蹤kernel函式,用逗號分隔
-a < APP_NAME >,–app=< APP_NAME > 追蹤應用包名,用逗號分隔
–from-file=< FROM_FILE > 從檔案中建立互動的systrace
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > 指定裝置
-l, –list-categories 列舉可用的tags
-h , --help 顯示幫助資訊
-l,--list-categories 列出可用於連線裝置的跟蹤categories類別
-o file 將HTML跟蹤報告寫入指定的檔案。 如果您不指定此選項,systrace會將您的報告儲存到systrace.py所在的同一目錄中,並將其命名為trace.html。
-t N ,--time=N 跟蹤裝置活動N秒。 如果不指定此選項,systrace將提示您通過按命令列中的Enter鍵結束跟蹤。
-b N ,--buf-size=N 使用N千位元組的跟蹤緩衝區大小。 通過此選項,可以限制跟蹤期間收集的資料的總大小。
-k functions,--ktrace=functions 跟蹤中指定的特定核心函式的活動,以逗號分隔的列表
-a app-name,--app=app-name 跟蹤指定應用,為逗號分隔列表。
--from-file=file-path 從檔案(例如包含原始跟蹤資料的TXT檔案)建立互動式HTML報告,而不是執行實時跟蹤。
-e device-serial,--serial=device-serial 跟蹤指定的裝置序列號標識的特定連線裝置
catagories參數列
category description
gfx Graphics
input Input
view View System
webview WebView
wm Window Manager
am Activity Manager
sm Sync Manager
audio Audio
video Video
camera Camera
hal Hardware Modules
app Application
res Resource Loading
dalvik Dalvik VM
rs RenderScript
bionic Bionic C Library
power Power Management
sched CPU Scheduling
irq IRQ Events
freq CPU Frequency
idle CPU Idle
disk Disk I/O
mmc eMMC commands
load CPU Load
sync Synchronization
workq Kernel Workqueues
memreclaim Kernel Memory Reclaim
regulators Voltage and Current Regulators

2.AndroidStudio Systrace工具

開啟AndroidStudio,連線好裝置,開啟DDMS , 點選 Tools——>Android——>Android device monitor

Image1.png

點選systrace按鈕,彈出資訊配置框,確認後,會記錄Trace duration 5秒鐘內的裝置程式,並生成一個名為trace.html報告 1529479249.png

此處資訊對應上面的命令參數列,請自行參照

注意:Enable Application Trace from :若是需要自定義trace資訊,必須選擇對應的應用程式,否則不會被捕獲到

3.自定義trace

使用者可以自己新增自定義的trace塊,來捕獲指定trace的資訊 Android 4.3 (API level 18) 以及更高版本可以使用

Android

Trace.beginSection();
Trace.endSection();
複製程式碼

程式碼示例

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
...
@Override
	public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
		Trace.beginSection("MyAdapter.onCreateViewHolder");
		MyViewHolder myViewHolder;
		try {
			myViewHolder = MyViewHolder.newInstance(parent);
		} finally {
			// In 'try...catch' statements, always call endSection()
			// in a 'finally' block to ensure it is invoked even when an exception
			// is thrown.
			Trace.endSection();
		}
	return myViewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
	Trace.beginSection("MyAdapter.onBindViewHolder");
		try {
			try {
				Trace.beginSection("MyAdapter.queryDatabase");
				RowItem rowItem = queryDatabase(position);
				mDataset.add(rowItem);
			} finally {
				Trace.endSection();
			}
			holder.bind(mDataset.get(position));
		} finally {
			Trace.endSection();
		}
	}
...
}
複製程式碼

native

#include <android/trace.h>
ATrace_beginSection();
ATrace_endSection();
複製程式碼

建立一個便利的物件/巨集結構來跟蹤程式碼塊

#define ATRACE_NAME(name) ScopedTrace ___tracer(name)

// ATRACE_CALL is an ATRACE_NAME that uses the current function name.
#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)

class ScopedTrace {
	public:inline ScopedTrace(const char *name) {
		ATrace_beginSection(name);
	}

	inline ~ScopedTrace() {
		ATrace_endSection();
	}
};

void myExpensiveFunction() {
	ATRACE_CALL();
... // trace-worthy work here
}

複製程式碼

快捷鍵

檢視Systrace生成的trace.html,瀏覽器開啟介面如下:

Image3.png (圖源來自官網)

分析trace.html圖形資訊之前,先了解下快捷鍵 點選瀏覽器介面上右上角“?”,可以檢視到各個快捷鍵提示

快捷鍵 作用
w 放大,[+shift]速度更快
s 縮小,[+shift]速度更快
a 左移,[+shift]速度更快
d 右移,[+shift]速度更快
f 放大當前選定區域
m 標記當前選定區域
v 高亮VSync
g 切換是否顯示60hz的網格線
0 恢復trace到初始態,這裡是數字0而非字母o
h 切換是否顯示詳情
/ 搜尋關鍵字
enter 顯示搜尋結果,可通過← →定位搜尋結果
` 顯示/隱藏指令碼控制檯
? 顯示幫助功能

分析trace.html

Image5.pngImage6.png

(圖源來自官網)

顏色塊 每塊顏色佔據的長度即為該系統或者自定義trace等執行所佔據的時間長度

Alerts 含有三角狀的圓圈圖示,對應出現警告的位置,點選可以在右邊欄Alerts檢視具體警告內容; 警告會告訴你可能丟幀或者卡頓等的原因

Frame 含有F字母的圓圈圖示,對應每一幀開始的位置,不同顏色有不同意義; 綠色表示正常,當顏色為橙色或者紅色時,意味著這一幀超過16.6ms(即發現丟幀);

Kernel (上圖為四核CPU)顯示每個CPU各自執行的系統方法或自定義trace塊,以及佔據的時間長度

SurfaceFlinger surfaceFilnger,程式id為118,顯示系統方法以及佔據的時間長度

com.android.janktown 應用程式,程式id為13409,顯示應用程式內各個執行緒等資訊 每個執行緒有顏色表示各自不同的狀態

  • 灰色:正在休眠。
  • 藍色:可執行(它可以執行,但是排程程式尚未選擇讓它執行)。
  • 綠色:正在執行(排程程式認為它正在執行)。
  • 紅色:不可中斷休眠(通常在核心中處於休眠鎖定狀態)。可以指示 I/O 負載,在除錯效能問題時非常有用。
  • 橙色:由於 I/O 負載而不可中斷休眠。
Image7.png

分析卡頓或掉幀

Systrace可以直觀的看到掉幀引起的介面卡頓 如下圖 frame-unselected.png

(圖源來自官網)

點選F,使用快捷鍵f放大該幀,可以選擇m高亮該選區,檢視該幀的所有系統trace塊執行時間

Image8.png (圖源來自官網)

檢視下面皮膚的Frame裡的資訊

ListView recycling takiing too mush time per frame.Ensure your Adapter#getView() binds data efficiently
複製程式碼

主要問題是在ListView回收和重新繫結中花費了太多時間。

Alerts選項卡可以檢視每個警報以及裝置觸發每個警報的次數 Image11.png

如果你在UI執行緒上看到了太多的工作,你需要找出哪些方法消耗了太多的CPU時間。 一種方法是新增跟蹤標記即自定義trace資訊到您認為會導致這些瓶頸的方法; 另一種由於不確定哪些方法可能導致UI執行緒出現瓶頸,可以使用Android Studio的內建CPU分析器,或生成跟蹤日誌並使用Traceview來進行檢視。

其他

systrace 具體落實到專案如何進行分析,又要多廢一番心思,如何才能把這工具發揮好它的功能,就看大家了,如果有什麼心得,歡迎分享和告之 ~~o(>_<)o ~~以下連線為蒐羅到的使用的例子,可以借鑑參考

Reanative-systrace

https://reactnative.cn/docs/0.36/android-ui-performance.html

http://mlazy.club/react-native-animation-performance-tool-systrace.html

android效能分析之Systrace的使用(轉) https://blog.csdn.net/lamp_zy/article/details/53375521

手把手教你使用Systrace(一)

https://zhuanlan.zhihu.com/p/27331842

手把手教你使用Systrace(二)——鎖優化

https://zhuanlan.zhihu.com/p/27535205

主要參考

http://maoao530.github.io/2017/02/06/systrace/

http://gityuan.com/2016/01/17/systrace/


本人公眾號首發且還有其他文章和漫畫

會不定期更新!

感謝您的喜歡

請多多關注和支援!

❤️

程式設計師七貓

相關文章