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

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

一、Android開發者選項

  Andorid開發工具衆多,首先就是手機自帶的開發者選項了,至於手機怎麼啓動開發者選項,那麼請自行百度或者google了,接着簡單熟悉下各個選項:


  1、Take bug report(進行漏洞報告): 點擊這個選項會獲取當前設備的log信息文件,打包並準備發送我們想要發送的人。這會花費1、2分鐘,然後會看到一個準備好的提示信息,然後可以點擊發送。
  2、Desktop backup password(桌面備份密碼):可以使用adb備份和存儲app和他們的關聯數據到你的電腦。這個選項強制需要一個密碼備份和存儲。
  3、Stay awake(保持喚醒):選中這個複選框會強制屏幕喚醒,只要連接上usb線或者充電的時候都會不進入休眠,當需要調試的時候不用老是去解鎖了,相當方便。
  4、Select runtime(選擇運行時):你可以選擇Dalvik或者ART。ART仍然是實驗性的,直到Android L才最終release。
  5、Enable Bluetooth HCI snoop log(藍牙HCI搜索日誌):有時,開發者需要獲取和分析藍牙的HCI包,使能這個會在設備storage(路徑爲:/sdcard/btsnoop_hco.log)中保存包的信息。接着你可以使用類似wireshark等軟件分析。
  6、Process stats(程序狀態):你需要知道的所有運行在手機上的程序的任何信息。包括了ram使用量,運行時間等。
  7、USB debugging(USB調試):USB調試時使用,使用DDMS和ADB命令的時候也需要這個使能,不勾選這個就不能調試我們的應用了。
  8、Revoke USB debugging authorizations(撤回USB除錯授權):當第一次USB線連接電腦的時候,需要認證並且建立密鑰,這個操作刪除這個認證,強制重新來一遍。
  9、Power menu bug reports(電源菜單中包括漏洞報告):在電源菜單中包括用於進行漏洞報告的選項。
  10、Allow mock locations(允許虛擬位置):允許手動寫入位置信息,對於需要模擬位置的應用來說十分方便,可以幹一些壞事,你懂得。
  11、Select debug app(選擇待調試的應用程序):這個設置讓你選擇一個待調試的應用。
  12、Wait for debugger(等待調試程序):等待調試程序
  13、Show touches(顯示觸摸位置):顯示觸摸的位置,一般是一個小圈圈。
  14、Pointer location(顯示指針位置):顯示出當前位置的座標。


  15、Show surface updates(顯示屏幕更新):屏幕更新時會閃爍。
  16、Show layout bounds(顯示佈局邊界):顯示剪切邊界、邊緣。


  17、Force RTL layout direction(強制RTL佈局):界面佈局從右至左。
  18、Window animation scale(窗口動畫比例):窗口動畫的比例,數字越小,速度越快。
  19、Transition animation scale(過渡動畫比例):過渡動畫的比例,同上。
  20、Simulate secondary displays(模擬二級顯示):允許開發者模擬不同尺寸的表現。
  21、Force GPU rendering(強制GPU渲染):強制應用使用硬件2D渲染除非應用本身不需要。
  22、Show GPU view updates(顯示GPU視圖更新):任何用硬件GPU來繪製視圖的會有紅色的覆蓋層。
  23、Show hardware layer updates(顯示硬件層更新):這個設置會告訴你什麼時候硬件層在更新。
  24、Debug GPU overdraw(調試GPU過度渲染):過度渲染髮生在任何時候當應用請求系統繪製一些視圖在其他視圖之上的時候。


  25、Force 4x MSAA(啓動4x MSAA):這個設置強制多重採樣抗鋸齒。MSAA就是尋找出物體邊緣部分的像素,然後再把畫縮放到當前的顯示器上。會降低性能提升視覺的美感。
  26、Strict mode enabled(嚴格模式):應用程序在主線程上執行長時間操作屏幕會閃爍。
  27、Show CPU usage(顯示CPU使用情況):在屏幕右上角顯示當前CPU的信息。


  28、Profile GPU rendering(GPU顯示配置文件):這個設置可以在屏幕上顯示也可以寫入到文件中。



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

二、應用具體耗時工具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);
    }
}

1、view形式

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



  進入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真實時間和調用次數的比例。

2、代碼形式

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


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

三、佈局複雜度工具Hierarchy View

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

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

四、應用啓動時間

  一般我們都會比較關注一個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。

五、Memory、CPU、Network

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

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

六、 靜態代碼檢查工具Lint

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

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

七、程序穩定性: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

發佈了201 篇原創文章 · 獲贊 501 · 訪問量 121萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章