android性能優化相關的開發工具備不少不少種,這裏對以下六個工具作個簡單的使用介紹,主要有Android開發者選項,分析具體耗時的Trace view,佈局複雜度工具Hierarchy View,應用啓動時間,Memory、CPU、Network分析,靜態代碼檢查工具Lint以及程序穩定性monkey。下面就開始學習下這些工具吧。html
Andorid開發工具衆多,首先就是手機自帶的開發者選項了,至於手機怎麼啓動開發者選項,那麼請自行百度或者google了,接着簡單熟悉下各個選項:
java
一、Take bug report(進行漏洞報告): 點擊這個選項會獲取當前設備的log信息文件,打包並準備發送咱們想要發送的人。這會花費一、2分鐘,而後會看到一個準備好的提示信息,而後能夠點擊發送。
二、Desktop backup password(桌面備份密碼):可使用adb備份和存儲app和他們的關聯數據到你的電腦。這個選項強制須要一個密碼備份和存儲。
三、Stay awake(保持喚醒):選中這個複選框會強制屏幕喚醒,只要鏈接上usb線或者充電的時候都會不進入休眠,當須要調試的時候不用總是去解鎖了,至關方便。
四、Select runtime(選擇運行時):你能夠選擇Dalvik或者ART。ART仍然是實驗性的,直到Android L才最終release。
五、Enable Bluetooth HCI snoop log(藍牙HCI搜索日誌):有時,開發者須要獲取和分析藍牙的HCI包,使能這個會在設備storage(路徑爲:/sdcard/btsnoop_hco.log)中保存包的信息。接着你可使用相似wireshark等軟件分析。
六、Process stats(程序狀態):你須要知道的全部運行在手機上的程序的任何信息。包括了ram使用量,運行時間等。
七、USB debugging(USB調試):USB調試時使用,使用DDMS和ADB命令的時候也須要這個使能,不勾選這個就不能調試咱們的應用了。
八、Revoke USB debugging authorizations(撤回USB除錯受權):當第一次USB線鏈接電腦的時候,須要認證而且創建密鑰,這個操做刪除這個認證,強制從新來一遍。
九、Power menu bug reports(電源菜單中包括漏洞報告):在電源菜單中包括用於進行漏洞報告的選項。
十、Allow mock locations(容許虛擬位置):容許手動寫入位置信息,對於須要模擬位置的應用來講十分方便,能夠幹一些壞事,你懂得。
十一、Select debug app(選擇待調試的應用程序):這個設置讓你選擇一個待調試的應用。
十二、Wait for debugger(等待調試程序):等待調試程序
1三、Show touches(顯示觸摸位置):顯示觸摸的位置,通常是一個小圈圈。
1四、Pointer location(顯示指針位置):顯示出當前位置的座標。
linux
1五、Show surface updates(顯示屏幕更新):屏幕更新時會閃爍。
1六、Show layout bounds(顯示佈局邊界):顯示剪切邊界、邊緣。
android
1七、Force RTL layout direction(強制RTL佈局):界面佈局從右至左。
1八、Window animation scale(窗口動畫比例):窗口動畫的比例,數字越小,速度越快。
1九、Transition animation scale(過渡動畫比例):過渡動畫的比例,同上。
20、Simulate secondary displays(模擬二級顯示):容許開發者模擬不一樣尺寸的表現。
2一、Force GPU rendering(強制GPU渲染):強制應用使用硬件2D渲染除非應用自己不須要。
2二、Show GPU view updates(顯示GPU視圖更新):任何用硬件GPU來繪製視圖的會有紅色的覆蓋層。
2三、Show hardware layer updates(顯示硬件層更新):這個設置會告訴你何時硬件層在更新。
2四、Debug GPU overdraw(調試GPU過分渲染):過分渲染髮生在任什麼時候候當應用請求系統繪製一些視圖在其餘視圖之上的時候。
web
2五、Force 4x MSAA(啓動4x MSAA):這個設置強制多重採樣抗鋸齒。MSAA就是尋找出物體邊緣部分的像素,而後再把畫縮放到當前的顯示器上。會下降性能提高視覺的美感。
2六、Strict mode enabled(嚴格模式):應用程序在主線程上執行長時間操做屏幕會閃爍。
2七、Show CPU usage(顯示CPU使用狀況):在屏幕右上角顯示當前CPU的信息。
sql
2八、Profile GPU rendering(GPU顯示配置文件):這個設置能夠在屏幕上顯示也能夠寫入到文件中。
shell
Trace view用於查找程序運行時具體耗時在哪,它顯示兩個面板,一個是Timeline面板,描述每個線程和方法啓動和結束的時間。另外一個是Profile面板,提供一個全部方法內部發生了什麼的概要。
先新建工程PerformanceTool,而後新建佈局main_activity_layout.xml,一個按鈕用來加載一個網頁;另外一個頁面就是一個webview。安全
package com.jared.performancetool;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.jared.performancetool.databinding.MainBinding;
public class MainActivity extends AppCompatActivity {
MainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
initView();
}
private void initView() {
binding.btnLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
WebViewActivity.launch(MainActivity.this);
}
});
}
}
接着是WebviewActivity.java:性能優化
package com.jared.performancetool;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.jared.performancetool.databinding.WebViewBinding;
/** * Created by jared on 2017/1/10. */
public class WebViewActivity extends AppCompatActivity {
WebViewBinding binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_webview_layout);
initView();
}
private void initView() {
binding.webView.loadUrl("http://www.hoolay.cn/ihoolay");
}
public static void launch(Context context) {
Intent intent = new Intent(context, WebViewActivity.class);
context.startActivity(intent);
}
}
traceview有兩種使用方法,一種是直接經過DDMS工具來start和stop trace,使用方法以下:
接着運行程序,成功運行後,點擊菜單欄的Tools -> Android -> Android Device Monitor :
markdown
另外一種是經過注入代碼來實現:
在WebviewActivity的onCreate代碼中加入兩行代碼以下:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_webview_layout);
Debug.startMethodTracing("perform");
initView();
Debug.stopMethodTracing();
}
別忘了加上SD卡的讀寫權限,而後運行app,點擊加載網頁按鈕,就會在/sdcard目錄下生產perform.trace文件,經過adb pull能夠把文件導出來。
➜ ~ adb pull /sdcard/perform.trace Downloads/
這裏導出到了Downloads目錄下,而後經過AndroidMonitor的file->open file選擇這個文件打開:
而後就能夠查看分析了。經過代碼的好處就是比較精確的獲得咱們想要測試的,不過代價就是要寫代碼編譯,導出來,步驟相對來講比較繁瑣。而直接使用工具的話只是一個大概的範圍,可是方便快捷。能夠視狀況使用其中之一。
以前文章《Android性能優化之佈局》已經講過了Hierarchy View的簡單使用。這裏仍是繼續講解下怎麼使用。Hierarchy View主要是檢測佈局複雜度,各視圖的佈局耗時狀況的一個工具,它須要在模擬器上進行,真機好像也有方法解決,不過很懶沒去折騰,主要仍是學習工具爲主嘛。
點擊菜單Tools -> Android -> Android Device Monitor:
通常咱們都會比較關注一個app啓動的時間,若是啓動太慢了,用戶可能就不想玩了,這裏有個方法能夠測試應用啓動的時間:
命令行以下:
adb shell am start -W packagename/activity
這裏舉個例子,好比說是上述項目中的PerformaceTool app,那麼首先打開終端,鏈接上usb線,而後終端輸入:
➜ ~ adb shell am start -W com.jared.performancetool/.MainActivity
等待會兒,app會啓動,而且輸出以下所示信息:
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.jared.performancetool/.MainActivity }
Status: ok
Activity: com.jared.performancetool/.MainActivity
ThisTime: 158
TotalTime: 158
WaitTime: 172
Complete
如上所示能夠看出用時158ms。
不少時候咱們須要瞭解app的內存使用狀況,CPU佔用怎樣,網絡速度如何。爲了提升性能,咱們老是想把內存減小到最小,CPU佔用率近可能小,網絡狀況適宜。固然這些能夠用命令行實現,畢竟androd基於linux操做系統的,可是那樣顯得很麻煩又不是很直觀,很慶幸Android Studio自帶了功能。
Android Studio的Android Monitor裏面有logcat和Monitors,選中monitors就有對於Memory,CPU和Network的展現。以下圖所示:
Lint主要是提供一套靜態代碼分析的工具,它能夠幫助咱們檢查項目中存在的問題,讓咱們更有規範性的開發App。運行菜單的analyze->Inspect Code。
經過monkey對程序在提交測試前作自測,能夠檢測出明顯的致使程序不穩定的問題,執行monkey只須要一行命令,提交測試前跑一次能夠避免應用剛提交就被打回的問題。
➜ ~ adb shell monkey -p com.jared.performancetool -v 500
-p表示包名,-v表示反饋級別 500就是500個僞隨機事件
若在壓力測試中程序崩潰或者接收到任何失控異常,就會自動中止。
參考:
https://developer.android.com/studio/profile/traceview.html#traceviewLayout
http://www.jianshu.com/p/07b551ee260b