IOS系統APP耗電量檢測分析和優化

耗電量不僅是衡量應用性能表現的一個重要指標,同時也是用戶體驗的重要組成部分。要做好⼀款APP,不僅僅是實現功能那麼簡單,我們需要考慮很多性能指標,讓用戶用的更爽。在開發過程中,要充分考慮到各項性能指標,比如定位精度,更高的精度,往往意味著更高的能耗,因此要平衡好精度和功耗,避免我們的APP過多的電量消耗。

耗電量基本概念


1 What Is Energy?


IOS系統APP耗電量檢測分析和優化

  • Idle狀態說明 app 處於休眠狀態,幾乎不使用電量。
  • Active狀態說明 app 處於前臺工作狀態,用電量⽐較高,我們可以看到圖中的第二個Active的耗電量遠高於第一個,這主要是因為 app 實際所做的工作類型不同導致的。
  • Overhead 指的是調起硬件來支持 app 功能所消耗的電量。注意:如果你的 app 就算只做了一點事, Overhead所帶來的電量消耗都是一點不會減少的!
  • 圖中橫線以下所包區域是固定開銷(Fixed Cost),橫線以上區域是動態開銷(Dvnamic cost)。

2 耗電大戶


IOS系統APP耗電量檢測分析和優化


1)網絡

網絡通信時,蜂窩數據和Wi-Fi等元器件開始工作就會消耗電能。分批傳輸、減少傳輸、壓縮數據、恰當地處理錯誤,你的app省電效果就會很顯著。

2)定位

app為了記錄用戶的活動或者提供基於位置的服務會進行定位。定位精度越高,定位時間越長,消耗電量也就越多。所以app應該儘量降低定位精度、縮短定位時間。不需要位置信息之後立即停止定位。

3)CPU

CPU是電能消耗大戶,高CPU使⽤量會迅速消耗掉用戶的電池電量。app做的每件事幾乎都需要用CPU,所以使⽤CPU要精打細算,真正有需要時通過分批、定時、有序地執行任務。

4)GPU

app內容每次更新到屏幕上都需要消耗電能處理像素信息。動畫和視頻格外耗電。不經意的或者不必要的內容更新同樣會消耗電能,所以UI不可見時,應該避免更新其內容。

5)傳感器和藍⽛

長時間用不上加速度計、陀螺儀、磁力計等設備的動作數據時,應該停止更新數據,不然也會浪費電能。應按需獲取,用完即停。藍⽛活 動頻度太高會消耗電能,應該儘量分批、減少數據輪詢等操作。

耗電量檢測方案


1 Energy Impact


IOS系統APP耗電量檢測分析和優化


1.1 Average energy Imapct

指針所指向的半圓環分為三部分,代表的是 app 的總體上的平均消耗電量評級,low(綠色區域)、high (黃色區域)、very high(紅色區域)通過這張圖我們可以大致瞭解app 電量的使用情況。理想的狀態是 app 處於 low、high 狀態。但是通常情況下,如果我們進行過優化,app 會處於 high、甚至very high 狀態。我們需要更深入地知道究竟哪一部分的功能導致耗電量大漲 。


1.2 Average Componet Utilization

餅狀圖展示的是Overhead、CPU、NetWork、Location、GPU各部分耗電量的佔比,通過這個佔比,我們可以分析各部分耗電量是否較高。


1.3 Energy Impact

在柱狀圖中每根柱子代表了每秒鐘的耗電情況。每根柱子都由不同顏色的矩形塊堆疊而成。依次是 Overhead(紅色)、CPU(藍色)、網絡(深黃)、定位(淡黃)、GPU(綠色)、後臺(深灰)、前臺(淡灰)、Suspend(白色) 。


1.4 總結

在使用Energy Impact的過程中,首先可以觀察 Average energy Imapct 瞭解app的整體耗電量情況,處在什麼位置,對整體有個大概的瞭解,然後通過 Average Componet Utilization 來觀察app整體耗電量中,具體哪一部分佔比較高,最後使用Energy Impact進行實時分析,分析頁面各部分消耗是否是必要的,比如某個頁面只在進入的時候需要獲取經緯度,後面不需要實時獲取經緯度,那麼在進入頁面獲取經緯度以後,就要將定位關閉,以減少電量消耗。


優點:實時性高、數據分析可以通過圖形直觀展示、可以獲取`Overhead(紅色)、CPU(藍色)、網絡(深黃)、定位(淡黃)、GPU(綠色)、後臺(深灰)、前臺(淡灰)、Suspend(白色)等數據和各部分數據佔比。

缺點:顆粒度較大,想做詳細的分析,需要藉助其它工具。比如針對CPU的消耗情況,可以通過 Time Profiler來進行分析,分析具體哪部分代碼消耗較多,使用Network Profiler來分析網絡的消耗情況,使用Location Profiler來分析定位的情況,詳細獲取各部分數據,找到電量的消耗點。


2 Energy Log


2.1 Energy Log使用


IOS系統APP耗電量檢測分析和優化


設置路徑:開發者 -> Logging -> Energy -> Start Recording -> Stop Recording。

首先找到開發者,點擊進入,找到Logging選項,如下圖:


IOS系統APP耗電量檢測分析和優化


然後點擊進入Logging選項、進入新頁面,打開Energy開關,同時點擊Start Recording,此時開始記錄電量消耗情況,,這時你可以選擇想要測試的app,在測試完畢後,點擊Stop Recording,關閉電量記錄功能,如下圖:


IOS系統APP耗電量檢測分析和優化


最後,將手機連接到電腦,導出設備中的電量記錄數據,在Energy Log中,可以看到詳細的電量消耗數據,如下圖:


IOS系統APP耗電量檢測分析和優化


2.2 Energy Log組成


IOS系統APP耗電量檢測分析和優化


  • Energy Usaqe Loq代表能耗消耗級別,有 0 到 20 的級別,表示應用在任何給定時間使用了多少電量,值越大表示越耗電。可以用來分析app的總體能耗。
  • CPU Activity Log 代表cpu能源消耗,包括:Foreground app Activity 、Graphics Activity、Media Activity、Other Activity。
  • Network Activity Log 代表網絡能源消耗,包括:Cellular in 、Cellular out、Wi-Fi In、Wi-Fi Out。
  • Display Brightness Log代表屏幕消耗。
  • Sleep/Wake log代表儀器捕獲有關設備當前狀態的信息。
  • Bluetooth On/Off Loq代表藍牙開關狀態。
  • Wi-Fi On/Off Log代表Wi-Fi開關狀態。
  • GPS On/Off Log代表GPS開關狀態。


2.3 總結

在使用Energy Log過程中,可以通過橫向比較各個維度的數據,來分析各部分的能源消耗,分析能耗的使用情況,更合理的使用⼿機電量。

優點:Energy Log可以測試自⼰app和別人app的電量消耗,有各個上面維度的詳細數據,比如:某個時刻的cpu使用情況、定位使用情況,可以關聯CPU、定位、總能耗消耗等數據,通過這些數據,分析使用是否合理。

缺點:Energy Log只能看整體能耗的水平,同時由於log不是實時的,要具體確定某個頁面或者某個路徑的能耗情況,需要⾃⼰測試的時候記錄一下,只能大概對照,而且不能輸出精準數據。


3 Sysdiagnose


Sysdiagnose是用來診斷系統問題的工具,它包括了過去幾天⾥,系統整體的詳細功耗情況、各個App在各個硬件上的耗電情況,溫度、 電流等一系列詳細的數據。這些數據最終會存儲在數據庫中,數據庫中包含多張數據表,比如在iOS12的系統中,有多達406張表。


3.1 配置

蘋果在《電池診斷日誌的導出指南》中詳細說明了導出日誌的步驟。這⾥簡要說明一下大概的步驟。


  • 首先在你的測試機上,安裝電量分析的profile,安裝完成後,iOS 才會記錄最詳細的功耗數據,並開放讀取(推薦下載後用Airdrop 發送到手機上安裝);
  • 第二步,連接上 iTunes 並同步,這時 iTunes 就會自動把手機上的功耗的歷史記錄拷貝到電腦上;
  • 第三步,斷開設備,運⾏你的 App,這時設備已經在記錄功耗信息,記得留意你運行 App 時的時間,因為稍後要和數據庫中的時間戳進行匹配;
  • 第四步,再次連接上 iTunes 並同步,這時 iTunes 就會自動把手機上的詳細功耗記錄拷貝到電腦上。


3.2 獲取數據

到 iTunes 的同步文件夾( ~/Library/Logs/CrashReporter/MobileDevice/你的手機名/)下,找到以Powerlog_開頭,後綴是.PLSQL或者.PLSQL.gz的幾個文件,這些就是記錄了所有功耗信息的數據庫文件了,可以使用DB Browser for SQLite來打數據庫。


3.3 分析數據

數據庫中有多張表格,這些表格的具體用途,蘋果沒有詳細說明,下⾯是一些開發者總結的部分表格信息。


表名

內容

PLBatteryAgentEventBackwardBattery

整機的電量信息,包含電流、電壓、溫度等信息。(每20秒記錄一條數據)

PLBatteryAgentEventBackwardBattery_UI

剩餘電量百分比。(每20秒記錄一條數據)

PLIOReportAgentEventBackwardEnergyModel

整機不同硬件上的詳細功耗數據。分別記錄了 CPU、GPU、DRAM 等硬件的耗電量。

PLAccountingOperatorAggregateRootNodeEnergy

各個 App 的詳細耗電數據。記錄各個 App 在各個硬件上的耗電量。(每小時更新一次數據)

PLAccountingOperatorEventNoneNodes

各個硬件對應的 Node ID,以及各個 App 的對應的 Node ID。

PLAccountingOperatorEventNoneAllApps

手機中安裝的所有 App 的信息

PLApplicationAgentEventForwardApplication

App運行狀態記錄。記錄各個 App在某個時間段以什麼狀態運行。

PLAppTimeServiceAggregateAppRunTime

App的運行時長統計。(每小時更新一次數據。

PLBatteryAgentEventForwardLightningConnectorStatus Lighting

接口連接狀態。


PLBatteryAgentEventNoneBatteryConfig

電池的配置信息。包括電池容量、循環計數、電池壽命、電池溫度等信 息。

PLBatteryAgentEventNoneBatteryShutdown

電池導致的意外關機記錄。

PLCameraAgentEventForwardCamera

相機使用記錄。記錄了相機類型和使⽤用相機的 App

PLConfigAgentEventNoneConfig

本機的一些配置信息和一些系統設置。

PLDisplayAgentAggregateUserTouch

屏幕點擊計數。每15分鐘記錄一條數據。

PLDisplayAgentEventForwardDisplay

屏幕亮度信息。包括流明、尼特、亮度滑竿值等信息。

PLProcessNetworkAgentEventPointConnection

網絡連接記錄。記錄了發起網絡連接的 App、地址、端口等信息。

PLXPCAgentEventPointCacheDelete

清除緩存的記錄。包括申請的空間大小、清除緩存的耗時、清除的緩存大小、服務名稱、緊急程度等信息。


我們可以根據上面的表格,來分析耗電情況,比如:


  • PLBatteryAgentEventBackwardBattery_UI 可以分析剩餘電量曲線
  • PLBatteryAgentEventBackwardBattery 可以分析整體耗電量和溫度變化
  • PLAccountingOperatorAggregateRootNodeEnergy 和 PLAccountingOperatorEventNoneNodes 兩張表,可以得到某個 Bundle ID對應的 App 在各個硬件上的耗電情況。

3.4 總結

Sysdiagnose是一個可以詳細獲取各個維度數據的工具,具體到某個app、某段時間、某個硬件的具體能源消耗,可以使用這個工具,進行app的不同場景的能耗數據對比、競品app的能耗數據分析和對比,十分精確。

優點:可以精確獲取各個維度的能耗消耗數據,包括:isp、apsocbase、dispaly、WiFi Data、GPU、CPU、restofsoc、GPS、DRAM等詳細數據。通過這些數據,可以分析某個app的某段時間,各個維度的能耗數據,這個數據十分精確。

缺點:數據不能實時獲取,部分數據需要等待一個小時才能獲取,數據量較大,沒有官方文檔指導,需要自己分析各個表中的數據含義。

4 MetricsKit

WWDC19 Session 417, Improving Battery Life and Performance,蘋果推出的三項性能監控工具分別是:

  • XCTest Metrics (開發和測試階段)
  • MetricsKit (內測階段和線上階段)
  • Xcode Metrics Organizer (線上階段)
IOS系統APP耗電量檢測分析和優化


蘋果推出的性能指標監測工具可以分為兩大類,分別是耗電量統計和性能監測。


IOS系統APP耗電量檢測分析和優化


4.1 Battery Metrics


IOS系統APP耗電量檢測分析和優化

耗電量的指標可以分為幾種,Metrics 可以分別進行統計,可以統計的幾個耗電量大戶分別是:


  • Processing,包括:CPU time, GPU time, etc.這些指標可以來度量和理解 App 的複雜度,它們可以用來比對各個功能的算法效率, 發現無效的渲染等。
  • Location,包括:Cumulative usage time, bakcground time, etc.可以用來了解定位的使用情況。
  • Display 指:Average Pixel Luminance (簡稱 APL,平均像素亮度,即每個像素的平均亮度),在 X/XS ⼿手機上,OLED 屏幕顯示的 UI 的顏色直接影響到能耗。
  • Networking 包括:Upload and download bytes, connectivity, etc。儘可能優化網絡使用,因為它是一項高能耗的任務。
  • Accessories (藍牙)
  • Multimedia
  • Camera

4.2 Performance Metrics


IOS系統APP耗電量檢測分析和優化

性能指標包括以下幾項:


  • Hangs
  • Disk
  • Application Launch
  • Memory
  • Custom Intervals


蘋果著重介紹了前四個。


1)Hang Metrics

Hang Metrics 就是我們常說的卡頓監測 ANR,它可以用來:

  • 查找哪些地方的任務可以移到後臺線程
  • 利用各種 dispatches 和 queues 來減少卡頓的概率

2)Disk Metrics

這個指標記錄的是磁盤邏輯寫入,它用來度量磁盤使⽤情況,可以用來:

  • 定位多餘的磁盤寫入檢
  • 查合併策略

3)Application Launch Metrics

可以⽤來度量 App 啟動或恢復所消耗的時間。

  • 瞭解啟動時的耗時因素,例如數據庫加載對啟動耗時的影響有多大
  • 查看啟動和恢復這兩種路徑下的不同耗時

4)Memory Metrics

內存的管理很重要,它也可以影響到應用的啟動速度,以及在後臺時,被終止的可能性。Memory Metrics 用於查看平均內存佔用,以及峰值內存佔⽤。它可以用來檢測內存的使用情況,例如:

  • 定位難以復現的內存洩漏
  • 減少應⽤掛起後的平均內存佔用(有助於推遲應用被終止的時間)

優化建議


1 網絡

只要app執⾏網絡操作,就會產⽣大量的能耗,網絡硬件為了響應下一次任務,往往會持續活躍一段時間,下面是多次網絡的能耗圖。


IOS系統APP耗電量檢測分析和優化

1.1 縮減網絡請求

1)減少、壓縮網絡數據。可以降低上傳或下載的多媒體內容質量和尺寸等。

2)使用緩存,不要重複下載相同的數據。

3)使⽤斷點續傳,否則網絡不穩定時可能多次傳輸相同的內容。

4)網絡不可用時不要嘗試執行網絡請求,儘量只在Wi-Fi情況下聯網。

5)讓用戶可以取消長時間運行或者速度很慢的網絡操作,設置合適的超時時間。

6)網絡請求失敗後用SCNetworkReachability的通知監測網絡狀態,網絡可用後再重試。


1.2 延遲聯網

1)分批傳輸。比如,下載視頻流時,不要傳輸很小的數據包,直接下載整個文件或者一大塊一大塊地下載。如果提供廣告,一次性多下載一些,然後再慢慢展示。如果要從服務器下載電子郵件,一次下載多條,不要一條一條地下載。

2)網絡操作能推遲就推遲。如果通過HTTP上傳、下載數據,建議使用NSURLSession中的後臺會話,這樣系統可以針對整個設備所有的網絡操作優化功耗。將可以推遲的操作儘量推遲到設備充電狀態並且連接Wi-Fi時進行,比如同步和備份工作。


2 定位

1)如果你的app只是需要快速確定一下用戶的位置,最好⽤CLLocationManager的requestLocation (iOS9引⼊入)方法。定位完成之後會自動讓硬件斷電。

2)除非是在導航的時候,app大部分時間不需要實時更新,降低位置的更新頻率。

3)儘量降低定位精度。iOS設備默認採用最⾼精度定位,如果你的app不是確實需要米級的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)。一般來說Core Location提供的精度比你設置的要好,比如你設置為3公里左右的精度,可能會收到100米左右的精度信息。

4)如果定位精度一直達不到設置的精度時,停止更新位置,稍後再試。

5)需要後臺更新位置時,儘量把pausesLocationUpdatesAutomatically設為YES,如果用戶不太可能移動的時候系統會自動暫停位置更 新。

6)後臺定位時延時更新位置。如果要做一個健身類的軟件追蹤用戶徒步的距離,可以等用戶移動一段距離或者過一段時間之後再更新位置,這樣可以讓系統優化能耗。

3 CPU

3.1 儘量減少計時器使用

使用計時器時,設置一個合適的超時,不再需要時及時關閉重複性定時器。用事件通知代替定時器。有些app用定時器監控文件內容、網絡或者其他狀態的變化,這會導致CPU無法進入閒置狀態而增加功耗。


3.2 減少後臺工作

實現UIApplicationDelegate中的方法,應用進入後臺前做好暫停任務,保存數據等工作。如果確實需要完成用戶執行的一些任務,應該調用UIApplicationDelegate中的beginBackgroundTaskWithExpirationHandler: 方法,這樣後臺任務可以繼續執行幾分鐘。任務執行完畢後一定要調用endBackgroundTask:方法,不要等著系統強行掛起進程。


3.3 用QoS分級有序工作

多個app和眾多操作需要共享CPU、緩存、網絡等資源,為了保持高效,系統需要根據不同任務的優先級智能地管理這些工作。比如更新UI這種重要的事需要多分配資源,而一些後臺任務可以延遲一些執行。服務質量(quality of service, 以下簡稱QoS, iOS8引⼊入)級別可以通過NSOperation, NSOperationQueue, NSThread objects, dispatch queues, 和pthreads (POSIX threads)指定工作的優先級。


3.4 優化I/O訪問

app每次執行I/O任務,比如寫⽂件,會導致系統退出閒置模式。而且寫入緩存格外耗電。通過下列方法可以提高能效、改善app性能。

1)減小寫入數據。數據有變化再寫文件,儘量把多個更改攢到一起一次性寫入。如果只有幾個字節的數據改變,不要把整個文件重新寫入一次。如果你的app經常要修改大⽂件⾥很少的內容,可以考慮用數據庫存儲這些數據。

2)避免訪問存儲頻度太高。如果app要存儲狀態信息,要等到狀態信息有變化時再寫入。儘量分批修改,不要頻繁地寫入這些小變動。

3)儘量順序讀寫數據。在文件中跳轉位置會消耗一些時間。

4)儘量從⽂件讀寫大數據塊,一次讀取太多數據可能會引發一些問題。比如,讀取一個32M⽂件的全部內容可能會在讀取完成前觸發內容分頁。

5)讀寫大量重要數據時,考慮用dispatchio,其提供了基於GCD的異步操作文件I/O的API。用dispatchio系統會優化磁盤訪問。

6)如果你的數據由隨機訪問的結構化內容組成,建議將其存儲在數據庫中,可以使用SQLite或CoreData訪問。特別是需要操作的內容可能增長到超過幾兆的時候。

7)瞭解系統如何緩存文件、如何優化緩存的使用。如果你不打算多次引用某些數據,不要⾃己緩存數據。

4 GPU

1)減少app使用的視圖數量。

2)少用運算獲得圓角,不論view.maskToBounds還是layer.clipToBounds都會有很大的資源開銷。

3)儘量少用透明或半透明,會產⽣額外的運算。

4)執行動畫時不要修改幀率。比如,你的app幀率是60fps,整個動畫就保持這個幀率不要變。

5)視頻播放時,app儘量不要在全屏視頻上添加額外的圖層(即使是隱藏的圖層)。

5 優化通知

1)儘量用本地通知(local notification),如果你的app不依賴外部數據,而是需要基於時間的通知,應該用本地通知,可以讓設備的網絡硬件休息一下。

2)遠程推送有兩個級別,一個是立即推送,另一個是針對功耗優化過的延時推送。如果不是真的需要即時推送,儘量使⽤延時推送。

總結

耗電量分析是應用開發中很難的課題,也是衡量性能的重要指標,做好電量優化,可以大幅度提升用戶體驗,在實際開發過程中,電量消耗往往是一個綜合的結果,⼩到日常的代碼習慣,積少成多,大到網絡的亂用、不合理的網絡超時、不合理的定位使用、不合理的CPU使用,都會帶來能耗的過多消耗,而這些問題不僅僅會影響電量,還會影響用戶體驗。我們需要提高日常開發的代碼質量,瞭解不同實現方式的差異點,優化頁面卡頓,優化網絡使用,優化GPS使用等等,只有綜合這些因素,才能獲得較好的用戶體驗。

在做耗電量分析的時候,⾸先要清楚耗電量較大的點,比如:網絡、定位、CPU、GPU,從這些點入手分析,再詳細分析每個點,細分每個點中的一些細節的影響,比如:網絡中可能會存在導致耗電量過高的因素,我們可以使用哪些優化方法,同時根據我們的需求特點,怎麼來優化,最終找到可優化點的,找到解決方案。在優化點尋找的過程中,我們⾸先可以使用Energy Impact來實時分析,各個維度指標是否有問題,佔比是否合理,然後再通過Time Profiler、NetWork Profiler、Location Profiler等工具對各項指標進行詳細分析,尋找優化點。其次我們可以使用Energy Log來橫向對比各個維度的數據,來分析各個維度對總功耗的影響,比如:wifi數據傳輸和4G數據傳輸時,耗電量的對比,打開藍牙和未打開藍牙,能耗數據的對比,查看各個維度對能耗消耗影響的權重。然後我們可以使用Sysdiagnose可以進行不同場景、競品app的對比分析,查找app的可優化點,也可以進行各種能耗數據的對比分析,以及優化前後的能耗數據對比,獲取最終的優化效果。Sysdiagnose中的數量比較精確,同時數據比較全面,可以挖掘更多的信息,來輔助我們進行電量優化。


附:iPhone各代電池容量


IOS系統APP耗電量檢測分析和優化


分享到:


相關文章: