Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 性能優化工具

Android 性能優化工具

編輯:關於Android編程

1. Allocation Tracker

Allocation Tracker是android studio自帶的一個功能,我們可以在MemoryMonitor中打開使用:
這裡寫圖片描述
如上圖,點擊紅框按鈕,start allocation tracking 然後操作app,開始allocation tracking,當認為需要結束的時候,再次點擊按鈕,稍等片刻,即可以在android studio中dump出在 這段時間內新申請對象的信息
Size就是內存大小,Count就是分配了多少次內存

2. 內存監測工具 DDMS —> Heap+ MAT 解決內存洩漏

Dump Java Heap

這裡寫圖片描述
如上圖Android monitors——memory——第三個按鈕,打印當前堆棧的對象,Analyzer Task 可以檢測內存洩露的activity,並指出洩露的代碼位置。
這裡寫圖片描述

名稱 意義 Total Count 內存中該類的對象個數 Heap Count 堆內存中該類的對象個數 Sizeof 物理大小 Shallow size 該對象本身占有內存大小,不包含其引用的對象 Retained Size/Dominating size 是該對象自己的shallow size,加上從該對象能直接或間接訪問到對象的shallow size之和。換句話說,釋放該對象後,節省的內存大小

“Update Heap”——“Cause GC”

這裡寫圖片描述
此時在Heap視圖中就會看到當前選中的進程的內存使用量的詳細情況,說明:
a) 點擊“Cause GC”按鈕相當於向虛擬機請求了一次gc操作;
b) 當內存使用信息第一次顯示以後,無須再不斷的點擊“Cause GC”,Heap視圖界面會定時刷新,在對應用的不斷的操作過程中就可以看到內存使用的變化;
這裡寫圖片描述

“dump hprof file”

這裡寫圖片描述

生成hprof文件,需要用命令 sdk/tools/hprof-conv src.hprof des.hprof 轉換一下,才能用mat打開。或者使用工具轉換格式,如下圖:
這裡寫圖片描述

其中Histogram可以看到所有實例的分配情況, Dominator Tree列出了堆的最大對象。 Leak Suspects主要是列出懷疑的內存洩露處(感覺沒什麼用,找到的地方都不是洩漏點,應該是我打開方式不對)。
這裡寫圖片描述

Histogram界面

Merge Shortest Paths to GC Roots 可以查看一個對象到RC Roots是否存在引用鏈相連接, 在JAVA中是通過可達性(Reachability Analysis)來判斷對象是否存活,這個算法的基本思想是通過一系列的稱謂”GC Roots”的對象作為起始點,從這些節點開始向下搜索,搜索所走得路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連則該對象被判定為可以被回收的對象,反之不能被回收,我們可以選擇 exclude all phantom/weak/soft etc.references(排查虛引用/弱引用/軟引用等)因為被虛引用/弱引用/軟引用的對象可以直接被GC給回收.
group by package 然後找到應用的包,就能看到當前的內存情況。(把APP退出之後,如果還能看到應用的內存消耗,基本都是內存洩漏點)

這裡寫圖片描述

這裡寫圖片描述
List object - With outgoing References 顯示選中對象持有那些對象
List object - With incoming References 顯示選中對象被那些外部對象所持有
Show object by class - With outgoing References 顯示選中對象持有哪些對象, 這些對象按類合並在一起排序
Show object by class - With incoming References 顯示選中對象被哪些外部對象持有, 這些對象按類合並在一起排序

OQL(類似sql查詢的功能)

select * from instanceof android.app.Activity

activity洩漏的解決方法
使用弱引用 + 靜態內部類 解決activity洩漏的問題
這裡寫圖片描述

DDMS —— update threads

這裡寫圖片描述
利用DDMS 來分析主線程和其他工作線程是否出現阻塞,並找出 阻塞的原因。

在應用程序中進行讓UI 出現卡頓的操作,在右邊的視圖中查看 main 線程,如果線程的狀態顯示 monitor,這表示 main 線程因為 請求同步鎖而處於阻塞狀態。點擊Refresh 按鈕查看線程是因為什麼原因而阻塞。
   DDMS 中Threads 的狀態的說明
   running – executing application code – 正在執行應用程序,准確的來說正在處理消息。
   sleeping – called Thread.sleep() – 執行了Thread.sleep() 方法,線程讓出了CPU,正在休眠。
   monitor – waiting to acquire a monitor lock – 在正等待獲取一個監聽鎖,線程被阻塞。
   wait – in Object.wait() – 在Object.wait() 方法中,線程被阻塞。
   native – executing native code – 執行了原生代碼,這個對於 帶有消息隊列的線程是正常的狀態,表示消息隊列沒有任何消息,線程在native 代碼中進行無限循環,直到消息隊列中出現新的消息,消息隊列才會返回Java 代碼處理消息。
   vmwait – waiting on a VM resource – 正在等待一個虛擬機資源
   zombie – thread is in the process of dying – 該線程已死
   init – thread is initializing (you shouldn’t see this) – 線程正在初始化 (你不會看到這個)
   starting – thread is about to start (you shouldn’t see this either) – 線程正在啟動中 (這個你也不會看到)

utime
– cumulative time spent executing user code, in “jiffies” (usually 10ms). Only available under Linux.
– 執行用戶代碼的累計時間, 單位為”jiffies(表示系統啟動以來的tick數)” (通常是 10ms). 僅在Linux系統中適用.
stime
– cumulative time spent executing system code, in “jiffies” (usually 10ms).
– 執行系統代碼的累計時間, 單位為”jiffies(表示系統啟動以來的tick數)”.
這裡寫圖片描述

DDMS——Systrace

1.android device monitor 生產文件
這裡寫圖片描述
2. 命令行生成文件
cdandroid?sdk/platform?tools/systrace python systrace.py –time=10 -o mynewtrace.html sched gfx view wm

參數名 意義 -h, –help 幫助信息 -o 保存的文件名 -t N,–time=N 多少秒內的數據,默認為5秒,以當前時間點往後倒N個時間 -b N,–buf-size=N 單位為千字節,限制數據大小 -k –ktrace= 追蹤特殊的方法 -l,–list-categories 設置追蹤的標簽 -a ,–app= 包名 –from-file= 創建報告的來源trace文件 -e ,–serial= 設備號

其中標簽可選項如下:

標簽名 意義 gfx Graphics input Input view View webview Webview vm Window Manager am Activity Manager audio Audio video Video camera Camera hal Hardware Modules res Resource Loading dalvik Dalvik VM rs RenderScript sched Cpu Scheduling freq Cpu Frequency membus Memory Bus Utilization idle Cpu Idle disk Disk input and output load Cpu Load sync Synchronization Manager workq Kernel Workqueues

以上標簽並不支持所有機型,還有要想在輸出中看到任務的名稱,需要加上sched.

生成trace的HTML文件之後用chrome打開,地址欄中輸入chrome://tracing 然後load進trace文件
Alert 是可能有問題的地方,如下圖所示
這裡寫圖片描述

這裡寫圖片描述
紅色或黃色幀為是可能有性能問題的地方,這裡能看到每個方法執行的順序和時間。
這裡寫圖片描述

點擊哪一塊,就可以看到個方法的信息。

Systrace也只能提供一個概覽,給出性能問題的提示(Alert),他的深度是有限的。所以要找到我們app中到底是什麼讓我們的CPU繁忙,我們還要借助另一個工具——Traceview。

public void ProcessPeople(){
Trace.beginSection(“ProcessPeople”);
try{
Trace.beginSection(“Processing Jane”);
try{
// code for Jane task…
}finally{
Trace.endSection();// ends “Processing Jane”
}

    Trace.beginSection("Processing John");
    try{
        // code for John task...
    }finally{
        Trace.endSection();// ends "Processing John"
    }
}finally{
    Trace.endSection();// ends "ProcessPeople"
}

}

DDMS —— TraceView查看每個方法所消耗的cpu時間

// start tracing to “/sdcard/calc.trace”
Debug.startMethodTracing(“calc”);
// …
// stop tracing
Debug.stopMethodTracing();

adb pull /sdcard/calc.trace /tmp
這裡寫圖片描述

Hotspot的查找是一個細致的工作,需要開發者對目標程序的代碼,以及Traceview工具都比較熟悉才行。

名稱 意義 Name 方法的詳細信息,包括包名和參數信息 Incl Cpu Time Cpu執行該方法該方法及其子方法所花費的時間 Incl Cpu Time % Cpu執行該方法該方法及其子方法所花費占Cpu總執行時間的百分比 Excl Cpu Time Cpu執行該方法所話費的時間 Excl Cpu Time % Cpu執行該方法所話費的時間占Cpu總時間的百分比 Incl Real Time 該方法及其子方法執行所花費的實際時間,從執行該方法到結束一共花費的時間(可能包含io或者其他阻塞的時間?) Incl Real Time % 上述時間占總的運行時間的百分比 Excl Real Time % 該方法自身的實際允許時間 Excl Real Time 上述時間占總的允許時間的百分比 Calls+Recur 調用次數+遞歸次數,只在方法中顯示,在子展開後的父類和子類方法這一欄被下面的數據代替 Calls/Total 調用次數和總次數的占比 Cpu Time/Call Cpu執行時間和調用次數的百分比,代表該函數消耗cpu的平均時間 Real Time/Call 實際時間於調用次數的百分比,該表該函數平均執行時間

這裡寫圖片描述

DDMS——HierarchyViewer 開啟

Configuring Devices

Enable Developer Options on your mobile device.
Depending on the type of device you have, do one of the following:
If you have a locked device running Android 4.0 or lower, follow the instructions for installing and configuring ViewServer.
If you have an unlocked device running Android 4.0 or lower, no further configuration is needed.
If you have a device running Android 4.1 or higher, you must set an environment variable on your development machine. For more information, see Setting the ANDROID_HVPROTO variable
Setting the ANDROID_HVPROTO variable

Windows

Click My Computer > Property > Advanced > Environment Variables.
Click New.
In variables name put: ANDROID_HVPROTO
In variable value put: ddm
Click OK<./li>

publicclassMyActivityextendsActivity {
publicvoidonCreate(BundlesavedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set content view,etc.
    ViewServer.get(this).addWindow(this);
}
publicvoidonDestroy() {
    super.onDestroy();
    ViewServer.get(this).removeWindow(this);
}

publicvoidonResume() {
    super.onResume();
    ViewServer.get(this).setFocusedWindow(this);
}
}

這裡寫圖片描述
點擊Profile Node,你會發現所有的子View上面都有了3個圈圈,
(取色范圍為紅、黃、綠色),這三個圈圈分別代表measure 、layout、draw的速度,並且你也可以看到實際的運行的速度,如果你發現某個View上的圈是紅色,那麼說明這個View相對其他的View,該操作運行最慢,注意只是相對別的View,並不是說就一定很慢。
紅色的指示能給你一個判斷的依據,具體慢不慢還是需要你自己去判斷的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved