1. 程式人生 > 其它 >Android App效能優化——記憶體、CPU、耗電量、啟動時間指標獲取

Android App效能優化——記憶體、CPU、耗電量、啟動時間指標獲取

最近公司要求對App進行效能優化。考慮到既然是優化效能,那首先要獲取App的相關效能指標,比如: 記憶體佔用CPU利用率App啟動時間App耗電量等情況,獲取以上各指標後,才能針對性分析確定是否存在優化的可能。

  • 檢視App啟動時間(冷啟動、熱啟動)
  • 檢視程序記憶體佔用
  • 檢視程序CPU使用率
  • 檢視App耗電量

一、App啟動時間

本小節記錄以下三個adb shell 命令:

  • adb shell am start -W [包名]
    啟動APP,查詢App的啟動時間
  • adb shell am start -n [包名]/[包名.Activity]
    啟動一個Activity(不記錄啟動時間)
  • adb shell am force-stop [包名]
    關閉一個APP程序

1.1、App啟動時間

查詢App的啟動時間,可以用以下命令:

// 啟動APP,查詢App的啟動時間
// adb shell am start -W [包名]
adb shell am start -W com.xiaxl.demo

查詢結果中,對應的時間引數詳細解析如下:

  • ThisTime:對應activity啟動耗時;
  • TotalTime:應用自身啟動耗時 = ThisTime + 應用application等資源啟動時間
  • WaitTime:系統啟動應用耗時 = TotalTime + 系統資源啟動時間

1.2、啟動一個Activity(不記錄啟動時間)

單純啟動一個Activity,不記錄啟動時間

,可以使用以下命令。

// 啟動一個Activity(不記錄啟動時間)
// adb shell am start -n [包名]/[包名.Activity]
adb shell am start -n com.xiaxl.demo/com.volley.demo.DmTestActivity

示例圖中,對應Activity在AndroidManifest.xml中的宣告方式如下:

<activity
    android:name="com.volley.demo.DmTestActivity"
    android:exported="true"></activity>

1.3、關閉一個App程序

關閉一個App程序用如下命令。

// 關閉一個APP程序用如下命令。
// adb shell am force-stop [包名]
adb shell am force-stop com.xiaxl.demo

二、程序記憶體佔用

本小節記錄以下四個adb shell 命令:

  • adb shell dumpsys meminfo [程序名]
    Android系統中,檢視某一程序的記憶體佔用情況
  • adb shell ps
    Android系統中,顯示全部系統程序
  • adb shell ps | grep [keyword]
    Android系統中,篩選包含特定關鍵詞的程序
  • adb shell cat /proc/meminfo
    Android系統中,檢視整個系統的記憶體詳情

2.1、檢視程序記憶體佔用

Android系統中,檢視某一程序的記憶體佔用情況可以使用以下命令。

// 檢視Android系統中,某一程序的記憶體佔用情況
// adb shell dumpsys meminfo [程序名]
adb shell dumpsys meminfo com.xiaxl.demo

以上截圖中 TOTAL 欄位,為對應程序佔用的系統總記憶體;其他欄位不再做詳細介紹。

2.2、顯示全部系統程序

Android系統中,若不瞭解對應程序的程序名稱,可用如下命令顯示全部系統程序

// Android系統中,顯示全部系統程序
adb shell ps

2.3、篩選程序

Android系統中,亦可根據特定關鍵詞,篩選包含特定關鍵詞的程序

// Android系統中,篩選包含特定關鍵詞的程序
adb shell ps | grep [keyword]

2.4、檢視系統記憶體詳情

Android系統中,如果需要檢視整個系統的記憶體詳情,可以使用以下命令。

// Android系統中,檢視整個系統的記憶體詳情
adb shell cat /proc/meminfo 

相關引數的詳細解釋如下所示:

MemTotal:         688576 kB     總記憶體
MemFree:          153736 kB     空閒記憶體
MemAvailable:     339884 kB     可用記憶體
Buffers:              16 kB     給檔案的緩衝大小
Cached:           267672 kB     高速緩衝儲存器
SwapCached:           36 kB     被高速緩衝儲存用的交換空間的大小
Active:           222900 kB     活躍使用中的高速緩衝儲存器頁面檔案大小
Inactive:         123700 kB     不經常使用中的告訴緩衝儲存器檔案大小
Active(anon):      31800 kB     活躍的匿名記憶體(程序中堆上分配的記憶體,是用malloc分配的記憶體)
Inactive(anon):    57272 kB     不活躍的匿名記憶體
Active(file):     191100 kB     活躍的file記憶體
Inactive(file):    66428 kB    不活躍的file記憶體     
Unevictable:           0 kB    不能被釋放的記憶體頁
Mlocked:               0 kB    mlock()系統呼叫鎖定的記憶體大小
SwapTotal:       2097148 kB    交換空間總大小
SwapFree:        2096884 kB    空閒交換空間
Dirty:                 0 kB    等待被寫回到磁碟的大小
Writeback:             0 kB    正在被寫回的大小
AnonPages:         78876 kB       未對映頁的大小
Mapped:            28556 kB    裝置和檔案對映大小
Shmem:             10160 kB    已經被分配的共享記憶體大小
Slab:             102916 kB    核心資料結構快取大小
SReclaimable:      49616 kB    可收回slab的大小
SUnreclaim:        53300 kB    不可回收的slab的大小
KernelStack:        4416 kB      kernel消耗的記憶體
PageTables:         6028 kB      管理記憶體分頁的索引表的大小
NFS_Unstable:          0 kB      不穩定頁表的大小
Bounce:                0 kB      在低端記憶體中分配一個臨時buffer作為跳轉,把位於高階記憶體的快取資料複製到此處消耗的記憶體
WritebackTmp:          0 kB      USE用於臨時寫回緩衝區的記憶體
CommitLimit:     2441436 kB      系統實際可分配記憶體總量
Committed_AS:     308028 kB      當前已分配的記憶體總量
VmallocTotal:   34359738367 kB   虛擬記憶體大小
VmallocUsed:      179588 kB    已經被使用的虛擬記憶體大小
VmallocChunk:   34359310332 kB   malloc 可分配的最大的邏輯連續的記憶體大小
HardwareCorrupted:     0 kB      刪除掉的記憶體頁的總大小(當系統檢測到記憶體的硬體故障時)
AnonHugePages:      6144 kB      匿名 HugePages 數量
CmaTotal:              0 kB    總的連續可用記憶體
CmaFree:               0 kB      空閒的連續記憶體
HugePages_Total:       0      預留HugePages的總個數 
HugePages_Free:        0     池中尚未分配的 HugePages 數量
HugePages_Rsvd:        0        表示池中已經被應用程式分配但尚未使用的 HugePages 數量
HugePages_Surp:        0      這個值得意思是當開始配置了20個大頁,現在修改配置為16,那麼這個引數就會顯示為4,一般不修改配置,這個值都是0
Hugepagesize:       2048 kB     每個大頁的大小
DirectMap4k:      108416 kB   對映TLB為4kB的記憶體數量
DirectMap2M:      940032 kB   對映TLB為2M的記憶體數量
DirectMap1G:           0 kB     對映TLB為1G的記憶體數量

三、程序CPU佔用

本小節記錄以下兩個adb shell 命令:

  • adb shell dumpsys cpuinfo | grep [程序名]
    Android系統中,檢視某一程序的CPU佔用情況情況
  • adb shell cat /proc/cpuinfo
    Android系統中,檢視CPU各核心詳情

3.1、程序CPU佔用

Android系統中,篩選檢視某一程序的CPU佔用情況可以使用以下命令。

// 檢視Android系統中,篩選某一程序的CPU佔用情況
adb shell dumpsys cpuinfo | grep [程序名]

// 檢視Android系統,CPU佔用情況(各程序CPU佔用,總的CPU佔用)
adb shell dumpsys cpuinfo

adb shell dumpsys cpuinfo | grep [程序名] 命令可以篩選特定程序的CPU佔用資訊。

adb shell dumpsys cpuinfo 命令可以展示出每一個程序的CPU佔用資訊,同時列印總的CPU佔用資訊。

3.2、CPU各核心詳情

Android系統中,如果需要檢視CPU各個核心的詳細資訊,可以使用以下命令。

// Android系統中,檢視CPU各個核心的詳細資訊
adb shell cat /proc/cpuinfo

相關引數的詳細解釋如下所示:

// CPU 架構, 64bit
Processor	: AArch64 Processor rev 14 (aarch64)
// 系統中邏輯處理核的編號,0~7表示8核CPU。
processor	: 0
// 在系統核心啟動時粗略測算的CPU速度(Million Instructions Per Second)
BogoMIPS	: 38.40
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
// ARM 架構
CPU implementer	: 0x51
// 8核
CPU architecture: 8
CPU variant	: 0xd
CPU part	: 0x805
CPU revision	: 14

// 品牌
Hardware	: Qualcomm Technologies, Inc LITO

四、App耗電量

App耗電量相關資料獲取 與 分析可以採用以下兩種方式:

  • adb shell dumpsys batterystats
    採用該命令,獲取對應包名應用耗電量資料;
  • Battery-Historian分析工具
    採用該分析工具,可以實現對應包名應用耗電量分析;

4.1、adb shell dumpsys batterystats

Android系統中,檢視對應包名應用電量消耗資料,可以採用如下方式。

a、重置電量資料(連線資料線操作)

首先要重置電量資料(重置電量資料,所有App的電量消耗資料將清零);
然後開啟全量日誌資料(開啟全量電量相關日誌記錄)。

// 重置電量資料
adb shell dumpsys batterystats --reset
// 開啟全量日誌記錄
adb shell dumpsys batterystats --enable full-wake-history

b、APP相關場景測試(斷開資料線)

重置電量資料後,需要拔掉資料線,進行相關APP場景測試

c、匯出(重新連線資料線)

重新連線資料線 通過以下命令可在命令列檢視對應應用的電量消耗,亦可將電量消耗資訊匯出到檔案中

// 檢視 應用電量消耗
adb shell dumpsys batterystats [應用包名] | more
// 匯出 應用電量訊息,這裡使⽤命令more分篇檢視電量相關資料
adb shell dumpsys batterystats [應用包名] >1.txt

4.2、Battery-Historian分析工具

Battery Historain是谷歌開發的分析工具,其可以用來分析對應包名應用的耗電情況。

因本小節重點還是如何獲取對應包名應用耗電相關資料,對於Battery Historain的安裝與簡單使用可參考我的文章
Mac 中 Battery Historain 安裝與使用:
https://xiaxl.blog.csdn.net/article/details/117758299

對應包名應用耗電相關資料獲取步驟如下:

a、重置電量資料(連線資料線操作)

首先要重置電量資料(重置電量資料,所有App的電量消耗資料將清零);
然後開啟全量日誌資料(開啟全量電量相關日誌記錄)。

// 重置電量資料
adb shell dumpsys batterystats --reset
// 開啟全量日誌記錄
adb shell dumpsys batterystats --enable full-wake-history

b、APP相關場景測試(斷開資料線)

重置電量資料後,需要拔掉資料線,進行相關APP場景測試

c、匯出(重新連線資料線)

重新連線資料線 通過以下命令匯出對應應用的電量消耗資料

// Android 7.0(包含) 以上裝置執行如下命令:
adb bugreport > bugreport.zip
// Android 6.0(包含) 以下裝置執行如下命令:
adb bugreport > bugreport.txt

d、battery-historian 工具分析電量消耗

上一步匯出的bugreport檔案,上傳到battery-historian 工具進行分析。

注:
國內安裝Battery Historain太繁瑣,主要是各種依賴包國內都下載不下來。
昨天我安裝Battery Historain 一下午沒搞定,後來搞到半夜一點鐘 終於安裝完成(中途曾幾度想放棄安裝,總之安裝太繁瑣)。
後來發現,已經有人搭建了一個Battery Historain線上環境,相關網址為: https://bathist.ef.lc/

將匯出的bugreport檔案上傳到 https://bathist.ef.lc/ ,便可以開始應用耗電分析了。

五、參考:

使用 Battery Historian 分析耗電情況:
https://developer.android.google.cn/topic/performance/power/battery-historian?hl=zh-cn

Battery Historian GitHub地址如下:
https://github.com/google/battery-historian?spm=a2c6h.12873639.0.0.10ed5c987lIJt6

Android 除錯橋 (adb)
https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn

android developer dumpsys:
https://developer.android.google.cn/studio/command-line/dumpsys?hl=zh-cn

= THE END =