最近公司要求對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 =

