Android開發學習之路--性能優化之經常使用工具

  android性能優化相關的開發工具備不少不少種,這裏對以下六個工具作個簡單的使用介紹,主要有Android開發者選項,分析具體耗時的Trace view,佈局複雜度工具Hierarchy View,應用啓動時間,Memory、CPU、Network分析,靜態代碼檢查工具Lint以及程序穩定性monkey。下面就開始學習下這些工具吧。html

1、Android開發者選項

  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



  2九、Enable OpenGL traces(啓動OpenGL跟蹤):這個設置是觀察OpenGL的錯誤,並把log保存到文件中。
  30、Don’t keep activities(不保留活動):用戶離開後當即清理每一個活動。
  3一、Background process limit(限制後臺進程):容許當先後臺運行多少個進程的一個選擇。
  3二、Show all ANRs(顯示所有ANR):當應用有bug的時候回顯示應用無響應對話框。

2、應用具體耗時工具Trace view

  Trace view用於查找程序運行時具體耗時在哪,它顯示兩個面板,一個是Timeline面板,描述每個線程和方法啓動和結束的時間。另外一個是Profile面板,提供一個全部方法內部發生了什麼的概要。
  先新建工程PerformanceTool,而後新建佈局main_activity_layout.xml,一個按鈕用來加載一個網頁;另外一個頁面就是一個webview。安全

  而後編寫代碼,首先是MainActivity.java:
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);
    }
}

一、view形式

  traceview有兩種使用方法,一種是直接經過DDMS工具來start和stop trace,使用方法以下:
  接着運行程序,成功運行後,點擊菜單欄的Tools -> Android -> Android Device Monitor :
markdown



  進入Monitor以後,點擊DDMS:


  這個時候在monitor的左邊面板會出現


  點擊對應要trace的包名,而後點擊Stop左邊的有個小紅點的按鈕。


  點擊ok以後便開始執行trace了,這個時候再點擊那個app裏面的加載網頁的按鈕,加載完後,再次點擊那個STOP左邊那個變成小黑點的按鈕。
  接着便trace完成了,就能夠查看以下兩個面板了。


  上圖就是Timeline面板,左邊就是每行都是顯示一個線程,右邊對應它的時間線。能夠看出來主要就是main線程在作事情。


  上圖就是Profile面板,首先是左邊的name,好比序號爲86,這裏展開有Parents和Children,其中Parents就是調用該方法的方法,這裏initView在onCreate中被調用,Children就是該方法內部調用的方法,這裏調用了loadUrl。與項目中的真實的代碼徹底相符。
  接着看下右邊一排的Incl Cpu Time、Excl Cpu Time、Incl Real Time、Excl Real Time、Call+Recur Calls/Total、Cpu Time/Call、Real Time/Call。
  Incl Cpu Time:某方法佔用CPU的時間,包含內部調用其餘方法佔用CPU的時間。
  Excl Cpu Time:某方法佔用CPU的時間,不包含內部調用其餘方法所佔用的CPU時間。
  Incl Real Time:某方法運行的真實的時間(單位ms),包含內部調用其餘方法所佔用的真實時間。
  Excl Real Time:某方法運行的真實的時間(單位ms),不包含內部調用其餘方法所佔用的真實時間。
  Call+Recur Calls/Total:某方法被調用的次數以及遞歸調用佔總調用次數的百分比。
  Cpu Time/Call:某方法佔用CPU的時間和次數的比例。
  Cpu Time/Call:某方法佔用CPI真實時間和調用次數的比例。

二、代碼形式

  另外一種是經過注入代碼來實現:
  在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選擇這個文件打開:


  而後就能夠查看分析了。經過代碼的好處就是比較精確的獲得咱們想要測試的,不過代價就是要寫代碼編譯,導出來,步驟相對來講比較繁瑣。而直接使用工具的話只是一個大概的範圍,可是方便快捷。能夠視狀況使用其中之一。

3、佈局複雜度工具Hierarchy View

  以前文章《Android性能優化之佈局》已經講過了Hierarchy View的簡單使用。這裏仍是繼續講解下怎麼使用。Hierarchy View主要是檢測佈局複雜度,各視圖的佈局耗時狀況的一個工具,它須要在模擬器上進行,真機好像也有方法解決,不過很懶沒去折騰,主要仍是學習工具爲主嘛。
  點擊菜單Tools -> Android -> Android Device Monitor:

  而後進入到Android Device Monitor,選中Hierarchy View
  選中後會出現層級樹。
  而後咱們點擊那個加載網頁的button,能夠看到對應的加載耗時,分別有Measure,Layout和Draw的耗時。   咱們能夠根據其耗時來優化咱們界面。

4、應用啓動時間

  通常咱們都會比較關注一個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。

5、Memory、CPU、Network

  不少時候咱們須要瞭解app的內存使用狀況,CPU佔用怎樣,網絡速度如何。爲了提升性能,咱們老是想把內存減小到最小,CPU佔用率近可能小,網絡狀況適宜。固然這些能夠用命令行實現,畢竟androd基於linux操做系統的,可是那樣顯得很麻煩又不是很直觀,很慶幸Android Studio自帶了功能。
  Android Studio的Android Monitor裏面有logcat和Monitors,選中monitors就有對於Memory,CPU和Network的展現。以下圖所示:

  這裏展現了Memory的使用量,CPU的佔用量,以及網絡的速度。上圖就是點擊了加載網頁時候的一個分佈狀況。它能夠幫咱們查看並優化咱們的程序,從而顯得很是的直觀。

6、 靜態代碼檢查工具Lint

  Lint主要是提供一套靜態代碼分析的工具,它能夠幫助咱們檢查項目中存在的問題,讓咱們更有規範性的開發App。運行菜單的analyze->Inspect Code。

  稍息片刻系統就會分析完成,以下所示:
  Lint分不少子項。Internationalization國際化問題,硬編碼的文字都是須要添加進@string資源,Security安全性問題,Usability可用性問題,未使用到資源、資源缺乏的問題等等,具體能夠根據分析後的結果來一步步改善。

7、程序穩定性:monkey

  經過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

相關文章
相關標籤/搜索