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

adb shell 查詢App啟動時間

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

  • 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

adb shell 啟動一個Activity(不記錄啟動時間)

示例圖中,對應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 關閉一個APP進程

二、進程內存占用

本小節記錄以下四個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

adb shell查看進程內存占用

以上截圖中 TOTAL 字段,為對應進程占用的系統總內存;其他字段不再做詳細介紹。

2.2、顯示全部系統進程

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

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

adb shell 顯示全部系統進程

2.3、篩選進程

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

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

adb shell 篩選包含特定關鍵詞的進程

2.4、查看系統內存詳情

Android系統中,如果需要查看整個系統的內存詳情,可以使用以下命令。

// Android系統中,查看整個系統的內存詳情
adb shell cat /proc/meminfo 

adb shell 查看系統的內存詳情

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

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 篩選某一進程的CPU占用

adb shell dumpsys cpuinfo 命令可以展示出每一個進程的CPU占用信息,同時打印總的CPU占用信息。

adb shell 總的CPU占用、各個進程的CPU占用

3.2、CPU各核心詳情

Android系統中,如果需要查看CPU各個核心的詳細信息,可以使用以下命令。

// Android系統中,查看CPU各個核心的詳細信息
adb shell cat /proc/cpuinfo

adb shell 查看CPU各個核心的詳細信息

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

// 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

adb shell 查看應用電量消耗

adb shell dumpsys batterystats導出的電量數據

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

五、參考:

使用 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 =

歡迎關注我的公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM