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