前言-理論篇
耗電量分析是衡量應(yīng)用性能表現(xiàn)的一個(gè)重要指標(biāo)臂寝,要做好一款app娱节,不僅僅是實(shí)現(xiàn)功能,我們需要考慮很多性能指標(biāo)辐益,讓用戶用的更爽断傲,在開發(fā)過程中,要充分考慮到各項(xiàng)性能指標(biāo)智政,比如定位精度认罩,更高的精度,往往意味著更高的能耗续捂,因此要平衡好精度和功耗垦垂,避免我們的app過多的過多的電量消耗,而界面卡頓可能意味著大量的多余計(jì)算牙瓢,不僅影響流暢度劫拗,影響電量消耗,網(wǎng)絡(luò)的不合理使用矾克,也會(huì)增加耗電量页慷,這些都是影響耗電量和用戶體驗(yàn)的重要因素,因此必須要重視app耗電量。
1.耗電量概念
-
Idle
表示app處于休眠狀態(tài)滓彰,幾乎不使用電量。 -
Active
狀態(tài)說明app處于工作狀態(tài)州袒,用電量比較高揭绑,圖中的第二個(gè)Active
的耗電遠(yuǎn)高于第一個(gè),這是因?yàn)閍pp所做的工作類型不同而導(dǎo)致的郎哭。 -
Overhead
指的是調(diào)起硬件來支持app功能所消耗的電量洗做,這部分是支持硬件工作必要的電量消耗。 - 圖中橫線以下所包區(qū)域是固定開銷(
Fixed Cost
)彰居,橫線以上區(qū)域是動(dòng)態(tài)開銷(Dynamic cost
)诚纸。
2.節(jié)省電量的四個(gè)基本原則:
識(shí)別:想清楚你需要app在特定時(shí)刻需要完成哪些工作,如果是不必要的工作陈惰,考慮延后執(zhí)行或者省去畦徘。
優(yōu)化:優(yōu)化app的功能實(shí)現(xiàn),盡可能以更有效率的方式去完成功能抬闯。
合并:不需要立刻獲取井辆,可以延后合并執(zhí)行,比如合并網(wǎng)絡(luò)
減少:在滿足需求的基礎(chǔ)上溶握,盡量減少做重復(fù)工作的頻率杯缺。
一、耗電大戶
1.網(wǎng)絡(luò)
app進(jìn)行網(wǎng)絡(luò)通信時(shí)睡榆,蜂窩數(shù)據(jù)和Wi-Fi等元器件開始工作就會(huì)消耗大量電能萍肆,應(yīng)減少數(shù)據(jù)傳輸,合并網(wǎng)絡(luò)請(qǐng)求胀屿,適當(dāng)?shù)木W(wǎng)絡(luò)延時(shí)等塘揣。
2.定位
app為了記錄用戶的活動(dòng)或者提供基于位置的服務(wù)會(huì)進(jìn)行定位。定位精度越高宿崭,定位時(shí)間越長(zhǎng)亲铡,消耗電量也就越多。
3.CPU
app做的每件事幾乎都需要用CPU葡兑,所以CPU是電能消耗大戶奖蔓,高CPU使用時(shí)會(huì)迅速消耗掉用戶的電池電量,所以我們要更合理的使用CPU讹堤,降低能耗吆鹤。
4.GPU
app內(nèi)容每次更新到屏幕上都需要消耗電能處理像素信息。動(dòng)畫和視頻格外耗電蜕劝。不經(jīng)意的或者不必要的內(nèi)容更新同樣會(huì)消耗電能檀头,所以UI不可見時(shí),應(yīng)該避免更新其內(nèi)容岖沛。
5.傳感器和藍(lán)牙
長(zhǎng)時(shí)間用不上加速度計(jì)暑始、陀螺儀、磁力計(jì)等設(shè)備的動(dòng)作數(shù)據(jù)時(shí)婴削,應(yīng)該停止更新數(shù)據(jù)廊镜,不然也會(huì)浪費(fèi)電能。應(yīng)按需獲取唉俗,用完即停嗤朴。藍(lán)牙活動(dòng)頻度太高會(huì)消耗電能,應(yīng)該盡量分批虫溜、減少數(shù)據(jù)輪詢等操作雹姊。
二、測(cè)試工具
1.Energy Impact
1.1Average energy Imapct
Average energy Imapct
代表的是app的耗電量評(píng)級(jí)衡楞,low(綠色區(qū)域)
吱雏、high (黃色區(qū)域)
、very high(紅色區(qū)域
)瘾境。通過這張圖歧杏,我們可以大致了解 app 電量的使用情況。理想的狀態(tài)是 app 處于 low迷守、high 狀態(tài)犬绒。如果處于very high狀態(tài),我們需要分析哪些功能導(dǎo)致耗電量大漲兑凿。
1.2Average Componet Utilization
Average Componet Utilization
展示的是Overhead
凯力、CPU
、NetWork
礼华、Location
沮协、GPU
各部分耗電量的占比,通過這個(gè)占比卓嫂,我們可以分析各部分耗電量是否較高慷暂。
1.3Energy Impact
Energy Impact
會(huì)實(shí)時(shí)展示電量消耗,每個(gè)柱子代表每秒的電量消耗晨雳,通過每個(gè)柱子由不同的顏色組成行瑞,展示各部分電量消耗的比例,依次是Overhead(紅色)餐禁、CPU(藍(lán)色)血久、網(wǎng)絡(luò)(深黃)、定位(淡黃)帮非、GPU(綠色)氧吐、后臺(tái)(深灰)讹蘑、前臺(tái)(淡灰)、Suspend(白色)
筑舅。
1.4總結(jié)
在使用Energy Impact
的過程中座慰,首先可以觀察Average energy Imapct
。了解app的整體耗電量情況翠拣,處在什么位置版仔,對(duì)整體有個(gè)大概的了解,然后通過Average Componet Utilization
來觀察app整體耗電量中误墓,具體哪一部分占比較高蛮粮,最后使用Energy Impact
進(jìn)行實(shí)時(shí)分析,分析頁面各部分消耗是否是必要的谜慌,比如某個(gè)頁面只在進(jìn)入的時(shí)候需要獲取經(jīng)緯度然想,后面不需要實(shí)時(shí)獲取經(jīng)緯度,那么在進(jìn)入頁面獲取經(jīng)緯度以后欣范,就要將定位關(guān)閉又沾,以減少電量消耗。
優(yōu)點(diǎn):
實(shí)時(shí)性高熙卡、數(shù)據(jù)分析可以通過圖形直觀展示杖刷、可以獲取`Overhead(紅色)、CPU(藍(lán)色)驳癌、網(wǎng)絡(luò)(深黃)滑燃、定位(淡黃)、GPU(綠色)颓鲜、后臺(tái)(深灰)表窘、前臺(tái)(淡灰)、Suspend(白色)等數(shù)據(jù)和各部分?jǐn)?shù)據(jù)占比甜滨。
缺點(diǎn):
顆粒度較大乐严,想做詳細(xì)的分析,需要借助衣摩,其它工具昂验。比如針對(duì)CPU的消耗情況,可以通過Time Profiler
來進(jìn)行分析艾扮,分析具體哪部分代碼消耗較多,使用Network Profiler
來分析網(wǎng)絡(luò)的消耗情況既琴、使用Location Profiler
來分析定位的情況,詳細(xì)獲取各部分?jǐn)?shù)據(jù)泡嘴,找到電量的消耗點(diǎn)甫恩。
2.Energy Log
2.1Energy Log使用:
設(shè)置路徑:開發(fā)者 -> Logging -> Energy -> Start Recording -> Stop Recording。
首先找到開發(fā)者酌予,點(diǎn)擊進(jìn)入磺箕,找到Logging選項(xiàng)奖慌,如下圖:
<img src="https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/Art/ios_settings_2x.png" width = "300" height = "500" align = center /><img src="https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/Art/ios_developer_2x.png" width = "300" height = "500" align = center /></br>
然后點(diǎn)金進(jìn)入Logging選項(xiàng)、進(jìn)入新頁面松靡,打開Energy開關(guān)简僧,同時(shí)點(diǎn)擊Start Recording,此時(shí)開始記錄電量消耗情況击困,涎劈,這時(shí)你可以選擇想要測(cè)試的app广凸,在測(cè)試完畢后阅茶,點(diǎn)擊Stop Recording,關(guān)閉電量記錄功能谅海,如下圖:
<img src="https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/Art/ios_logging_startrecording_2x.png" width = "300" height = "500" align = center /><img src="https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/Art/ios_logging_stoprecording_2x.png" width = "300" height = "500" align = center /></br>
最后脸哀,將手機(jī)連接到電腦,導(dǎo)出設(shè)備中的電量記錄數(shù)據(jù)扭吁,在Energy Log中撞蜂,可以看到詳細(xì)的電量消耗數(shù)據(jù),如下圖:
<img src="https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/Art/instruments_file_menu_importloggeddatafromdevice_menuitem_2x.png" width = "400" height = "500" div align = center /></br>
2.2Energy Log組成:
Energy Usage Log
代表能耗消耗級(jí)別侥袜,有 0 到 20 的級(jí)別蝌诡,表示應(yīng)用在任何給定時(shí)間使用了多少電量,值越大表示越耗電枫吧∑趾担可以用來分析app的總體能耗。CPU Activity Log
代表cpu能源消耗九杂,包括 :Foreground app Activity
颁湖、Graphics Activity
、Media Activity
例隆、Other Activity
甥捺。Network Activity Log
代表網(wǎng)絡(luò)能源消耗,包括 :Cellular in
镀层、Cellular out
镰禾、Wi-Fi In
、Wi-Fi Out
唱逢。Display Brightness Log
代表屏幕消耗羡微。Sleep/Wake Log
代表儀器捕獲有關(guān)設(shè)備當(dāng)前狀態(tài)的信息。Bluetooth On/Off Log
代表藍(lán)牙開關(guān)狀態(tài)惶我。Wi-Fi On/Off Log
代表Wi-Fi開關(guān)狀態(tài)妈倔。Gps On/Off Log
代表Gps開關(guān)狀態(tài)。
2.3總結(jié)
在使用Energy Log過程中绸贡,可以通過橫向比較各個(gè)維度的數(shù)據(jù)盯蝴,來分析各部分的能源消耗毅哗,分析能耗的使用情況,更合理的使用手機(jī)電量捧挺。
優(yōu)點(diǎn):
Energy Log可以測(cè)試自己app和別人app的電量消耗虑绵,有各個(gè)上面??維度的詳細(xì)數(shù)據(jù),比如:某個(gè)時(shí)刻的cpu使用情況闽烙、定位使用情況翅睛,可以關(guān)聯(lián)CPU、定位黑竞、總能耗消耗等數(shù)據(jù)捕发,通過這些數(shù)據(jù),分析使用是否合理很魂。
缺點(diǎn):
Energy Log只能看整體能耗的水平扎酷,同時(shí)由于log不是實(shí)時(shí)的,要具體確定某個(gè)頁面或者某個(gè)路徑的能耗情況遏匆,需要自己測(cè)試的時(shí)候記錄一下法挨,只能大概對(duì)照,而且不能輸出精準(zhǔn)數(shù)據(jù)幅聘。
3.Sysdiagnose
Sysdiagnose是用來診斷系統(tǒng)問題的工具凡纳,它包括了過去幾天里,系統(tǒng)整體的詳細(xì)功耗情況帝蒿、各個(gè)App在各個(gè)硬件上的耗電情況荐糜,溫度、電流等等一系列詳細(xì)的數(shù)據(jù)陵叽。這些數(shù)據(jù)最終會(huì)存儲(chǔ)在數(shù)據(jù)庫(kù)中狞尔,數(shù)據(jù)庫(kù)中包含多張數(shù)據(jù)表,比如在iOS12的系統(tǒng)中巩掺,有多達(dá)406張表偏序。
3.1配置和數(shù)據(jù)獲取
蘋果官方在Battery Life Logging Instructions中詳細(xì)說明了導(dǎo)出日志的步驟。通過安裝電量分析的profile來記錄手機(jī)耗電量信息胖替,使用iTunes進(jìn)行同步研儒,最終從文件夾(~/Library/Logs/CrashReporter/MobileDevice/你的手機(jī)名/)中獲取后綴是.PLSQL或者.PLSQL.gz的幾個(gè)文件,這些文件記錄了手機(jī)中各個(gè)app的耗電情況独令。
3.2分析數(shù)據(jù)
數(shù)據(jù)庫(kù)中有多張表格端朵,這些表格的具體用途,蘋果沒有詳細(xì)說明燃箭,下面是騰訊和一些開發(fā)者總結(jié)的部分表格信息冲呢。
表名 | 內(nèi)容 |
---|---|
PLBatteryAgent_EventBackward_Battery | 整機(jī)的電量信息,包含電流招狸、電壓敬拓、溫度等信息邻薯。(每20秒記錄一條數(shù)據(jù)) |
PLBatteryAgent_EventBackward_Battery_UI | 剩余電量百分比。(每20秒記錄一條數(shù)據(jù)) |
PLIOReportAgent_EventBackward_EnergyModel | 整機(jī)不同硬件上的詳細(xì)功耗數(shù)據(jù)乘凸。分別記錄了 CPU厕诡、GPU、DRAM 等硬件的耗電量营勤。 |
PLAccountingOperator_Aggregate_RootNodeEnergy | 各個(gè) App 的詳細(xì)耗電數(shù)據(jù)灵嫌。記錄各個(gè) App 在各個(gè)硬件上的耗電量。(每小時(shí)更新一次數(shù)據(jù)) |
PLAccountingOperator_EventNone_Nodes | 各個(gè)硬件對(duì)應(yīng)的 Node ID葛作,以及各個(gè) App 的對(duì)應(yīng)的 Node ID寿羞。 |
PLAccountingOperator_EventNone_AllApps | 手機(jī)中安裝的所有 App 的信息 |
PLApplicationAgent_EventForward_Application | App 運(yùn)行狀態(tài)記錄。記錄各個(gè) App 在某個(gè)時(shí)間段以什么狀態(tài)運(yùn)行进鸠。 |
PLAppTimeService_Aggregate_AppRunTime | App 的運(yùn)行時(shí)長(zhǎng)統(tǒng)計(jì)稠曼。(每小時(shí)更新一次數(shù)據(jù)形病。 |
PLBatteryAgent_EventForward_LightningConnectorStatus Lighting | 接口連接狀態(tài)客年。 |
PLBatteryAgent_EventNone_BatteryConfig | 電池的配置信息。包括電池容量漠吻、循環(huán)計(jì)數(shù)量瓜、電池壽命、電池溫度等信息途乃。 |
PLBatteryAgent_EventNone_BatteryShutdown | 電池導(dǎo)致的意外關(guān)機(jī)記錄绍傲。 |
PLCameraAgent_EventForward_Camera | 相機(jī)使用記錄。記錄了相機(jī)類型和使用相機(jī)的 App |
PLConfigAgent_EventNone_Config | 本機(jī)的一些配置信息和一些系統(tǒng)設(shè)置耍共。 |
PLDisplayAgent_Aggregate_UserTouch | 屏幕點(diǎn)擊計(jì)數(shù)烫饼。每 15 分鐘記錄一條數(shù)據(jù)。 |
PLDisplayAgent_EventForward_Display | 屏幕亮度信息试读。包括流明杠纵、尼特、亮度滑竿值等信息钩骇。 |
PLProcessNetworkAgent_EventPoint_Connection | 網(wǎng)絡(luò)連接記錄比藻。記錄了發(fā)起網(wǎng)絡(luò)連接的 App、地址倘屹、端口等信息银亲。 |
PLXPCAgent_EventPoint_CacheDelete | 清除緩存的記錄。包括申請(qǐng)的空間大小纽匙、清除緩存的耗時(shí)务蝠、清除的緩存大小、服務(wù)名稱烛缔、緊急程度等信息。 |
我們可以根據(jù)上面的表格矮燎,來分析耗電情況良漱,比如:
- PLBatteryAgent_EventBackward_Battery_UI 可以分析剩余電量曲線
- PLBatteryAgent_EventBackward_Battery 可以分析整體耗電量和溫度變化
- PLAccountingOperator_Aggregate_RootNodeEnergy 和 PLAccountingOperator_EventNone_Nodes 兩張表,可以得到某個(gè) Bundle ID 對(duì)應(yīng)的 App 在各個(gè)硬件上的耗電情況气嫁。
下面是一些數(shù)據(jù)獲取的SQL語句:
-
查看APP運(yùn)行的時(shí)間timestamp
select ID,timestamp,datetime(timestamp, 'unixepoch', 'localtime')as time,BundleID from PLAppTimeService_Aggregate_AppRunTime where BundleID='XXX' order by timestamp
-
查看APP的NodeID
select * from PLAccountingOperator_EventNone_Nodes where Name ='XXX'
-
查看APP的電量測(cè)試
select ID,timestamp,datetime(timestamp, 'unixepoch','localtime')as time,Energy,NodeID,RootNodeID from PLAccountingOperator_Aggregate_RootNodeEnergy where NodeID=XXX order by time
-
查看APP某個(gè)時(shí)間點(diǎn)的電量求和
select datetime(timestamp, 'unixepoch', 'localtime')as time,sum(Energy),NodeID from PLAccountingOperator_Aggregate_RootNodeEnergy where NodeID=XXX and timestamp='XXX'
RootNodeID硬件對(duì)照表
RootNodeID | 硬件 |
---|---|
2 | CPU |
4 | VENC |
5 | VDEC |
6 | ISP |
7 | RestOfSOC |
8 | GPU |
9 | DRAM |
10 | Display |
11 | WiFi-Data |
14 | AudioHeadset |
15 | AudioSpeaker |
17 | FrontCamera |
18 | BackCamera |
19 | Torch |
37 | BB |
38 | BB-Voice |
47 | BB-Pssi |
48 | GPS |
50 | Bluetooth |
53 | WiFi-IdLe |
54 | APSOCBaseIOReport |
55 | AudioCodec |
3.4總結(jié)
Sysdiagnose是一個(gè)可以詳細(xì)獲取各個(gè)維度數(shù)據(jù)的工具,具體到某個(gè)app够坐、某段時(shí)間寸宵、某個(gè)硬件的具體能源消耗,可以使用這個(gè)工具元咙,進(jìn)行app的不同場(chǎng)景的能耗數(shù)據(jù)對(duì)比梯影、競(jìng)品app的能耗數(shù)據(jù)分析和對(duì)比,十分精確庶香。
優(yōu)點(diǎn):
可以精確獲取各個(gè)維度的能耗消耗數(shù)據(jù)甲棍,包括:isp
、apsocbase
赶掖、 display
感猛、wifi data
、GPU
奢赂、CPU
陪白、restofsoc
膳灶、GPS
、DRAM
轧钓、等詳細(xì)數(shù)據(jù)。通過這些數(shù)據(jù)毕箍,可以分析某個(gè)app的某段時(shí)間,各個(gè)維度的能耗數(shù)據(jù)霉晕,這個(gè)數(shù)據(jù)十分精確。
缺點(diǎn):
數(shù)據(jù)不能實(shí)時(shí)獲取牺堰,部分?jǐn)?shù)據(jù)需要等待一個(gè)小時(shí)才能獲取,測(cè)試周期長(zhǎng)伟葫,數(shù)據(jù)量較大恨搓,沒有官方文檔指導(dǎo),需要自己分析各個(gè)表中的數(shù)據(jù)含義。
三斧抱、案例分析
1.對(duì)比分析
使用Sysdiagnose常拓,通過對(duì)比A頁面和B頁面(A和B是兩個(gè)不同app相同業(yè)務(wù)的頁面),來分析各自耗電量情況辉浦,以及可能的優(yōu)化點(diǎn)弄抬。下面數(shù)據(jù)單位是1/1000 mAh
1.1A頁面和B頁面
測(cè)試條件:iphone7,iOS12.2宪郊,記錄5分鐘電量消耗掂恕,滑動(dòng)100次,取三次平均值.
APP | Display | GPS | WiFi-Data | CPU | RestOfSOC | DRAM | GPU | SUM |
---|---|---|---|---|---|---|---|---|
A頁面 | 31888 | 0 | 1753 | 18523 | 5437 | 5059 | 0 | 62660 |
B頁面 | 36180 | 9652 | 1500 | 16338 | 4792 | 4460 | 289 | 73211 |
對(duì)比A頁面和B頁面能耗數(shù)據(jù)弛槐,整體能耗數(shù)據(jù)懊亡,B頁面高于A頁面電量消耗,CPU乎串、RestOfSOC店枣、DRAM數(shù)據(jù),A頁面都高于B頁面叹誉,B頁面GPS電量消耗量較高鸯两,這是因?yàn)锽頁面一直開啟了GPS,Display數(shù)據(jù)B頁面高于A頁面桂对,可能和動(dòng)畫使用有關(guān)甩卓。通過這些指標(biāo)分析鸠匀,可對(duì)比競(jìng)品之間的能耗水平蕉斜,也可以初步為電量?jī)?yōu)化提供方向。
1.2頁面中硬件電量消耗
通過圖片可以看出頁面中宅此,Display和CPU是主要消耗爬范,占用頁面整體電量消耗的80%左右,這一部分也是優(yōu)化的重點(diǎn)璧亮,對(duì)于Diaplay的電量消耗受很多因素影響斥难,比較復(fù)雜,比如:屏幕亮度和動(dòng)畫等影響群扶。
總結(jié):通過對(duì)比分析,可以獲取app的具體電量消耗水平缴饭,可以根據(jù)具體數(shù)據(jù)骆莹,推斷出app能運(yùn)行的時(shí)間,同時(shí)可以對(duì)比競(jìng)品峭火,判斷app的電量消耗水平智嚷,并從具體指標(biāo)分析,初步推斷優(yōu)化方向盏道。
2.需求分析
上面是使用Energy Log來測(cè)試C頁面的電量消耗情況猜嘱,紅色部分是Overhead,表示調(diào)起硬件的正常電量消耗弦撩,其占據(jù)頁面57.1%论皆,網(wǎng)絡(luò)占10.2%,cpu占1.2%点晴,Location占31.1%,但在這個(gè)頁面中陪竿,GPS是一直開啟的屠橄,也就是圖中的黃色部分,實(shí)際情況是是不需要一直開啟GPS定位礁哄,這一部分存在優(yōu)化空間贮匕,按需要開啟和關(guān)閉GPS開關(guān)。
總結(jié)
在進(jìn)行電量消耗測(cè)試時(shí)掏膏,需要對(duì)頁面需求進(jìn)行具體分析,用來判別頁面中網(wǎng)絡(luò)佳簸、CPU颖变、GPU、GPS各部分的電量消耗是否是合理和必要的马胧,上面例子的情況衔峰,GPS沒必要一直開啟,可以在不需要使用時(shí)關(guān)閉垫卤,存在優(yōu)化空間。關(guān)于更多電量?jī)?yōu)化建議歇盼,可以參考蘋果官方Apple Energy Guide或者這篇翻譯App功耗優(yōu)化建議评抚,會(huì)從網(wǎng)絡(luò)、CPU耿眉、GPU鱼响、GPS等方面丈积,更詳細(xì)的角度來分析耗電量?jī)?yōu)化债鸡。
四、優(yōu)化建議
1.網(wǎng)絡(luò)
只要app執(zhí)行網(wǎng)絡(luò)操作唬滑,就會(huì)產(chǎn)生大量的見解能耗,網(wǎng)絡(luò)硬件為了響應(yīng)下一次任務(wù)擒悬,往往會(huì)持續(xù)活躍一段時(shí)間稻艰,下面是多次網(wǎng)絡(luò)的能耗圖。
1.1 縮減網(wǎng)絡(luò)請(qǐng)求
減少僧凤、壓縮網(wǎng)絡(luò)數(shù)據(jù)元扔。可以降低上傳或下載的多媒體內(nèi)容質(zhì)量和尺寸等吻氧。
使用緩存咏连,不要重復(fù)下載相同的數(shù)據(jù)。
使用斷點(diǎn)續(xù)傳振惰,否則網(wǎng)絡(luò)不穩(wěn)定時(shí)可能多次傳輸相同的內(nèi)容垄懂。
網(wǎng)絡(luò)不可用時(shí)不要嘗試執(zhí)行網(wǎng)絡(luò)請(qǐng)求,盡量只在Wi-Fi情況下聯(lián)網(wǎng)草慧。
讓用戶可以取消長(zhǎng)時(shí)間運(yùn)行或者速度很慢的網(wǎng)絡(luò)操作,設(shè)置合適的超時(shí)時(shí)間仔雷。
網(wǎng)絡(luò)請(qǐng)求失敗后用SCNetworkReachability的通知監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)舔示,網(wǎng)絡(luò)可用后再重試。
1.2 延遲聯(lián)網(wǎng)
分批傳輸竖共。比如俺祠,下載視頻流時(shí)借帘,不要傳輸很小的數(shù)據(jù)包,直接下載整個(gè)文件或者一大塊一大塊地下載肺然。如果提供廣告匣沼,一次性多下載一些,然后再慢慢展示释涛。如果要從服務(wù)器下載電子郵件,一次下載多條它匕,不要一條一條地下載窖认。
網(wǎng)絡(luò)操作能推遲就推遲。如果通過HTTP上傳烧给、下載數(shù)據(jù)喝噪,建議使用NSURLSession中的后臺(tái)會(huì)話,這樣系統(tǒng)可以針對(duì)整個(gè)設(shè)備所有的網(wǎng)絡(luò)操作優(yōu)化功耗酝惧。將可以推遲的操作盡量推遲到設(shè)備充電狀態(tài)并且連接Wi-Fi時(shí)進(jìn)行,比如同步和備份工作巫财。
2.定位
如果你的app只是需要快速確定一下用戶的位置哩陕,最好用CLLocationManager的requestLocation (iOS9引入)方法。定位完成之后會(huì)自動(dòng)讓硬件斷電萌踱。
除非是在導(dǎo)航的時(shí)候,app大部分時(shí)間不需要實(shí)時(shí)更新,降低位置的更新頻率扔涧。
盡量降低定位精度届谈。iOS設(shè)備默認(rèn)采用最高精度定位艰山,如果你的app不是確實(shí)需要米級(jí)的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)曙搬。一般來說Core Location提供的精度比你設(shè)置的要好鸽嫂,比如你設(shè)置為3公里左右的精度,可能會(huì)收到100米左右的精度信息橡娄。
如果定位精度一直達(dá)不到設(shè)置的精度時(shí)癣籽,停止更新位置,稍后再試瓶籽。
需要后臺(tái)更新位置時(shí)埂材,盡量把pausesLocationUpdatesAutomatically設(shè)為YES,如果用戶不太可能移動(dòng)的時(shí)候系統(tǒng)會(huì)自動(dòng)暫停位置更新茬暇。
后臺(tái)定位時(shí)延時(shí)更新位置寡喝。如果要做一個(gè)健身類的軟件追蹤用戶徒步的距離,可以等用戶移動(dòng)一段距離或者過一段時(shí)間之后再更新位置巧骚,這樣可以讓系統(tǒng)優(yōu)化能耗格二。
3.CPU
3.1盡量減少計(jì)時(shí)器使用
使用計(jì)時(shí)器時(shí),設(shè)置一個(gè)合適的超時(shí)時(shí)顶猜,不再需要時(shí)及時(shí)關(guān)閉重復(fù)性定時(shí)器。用事件通知代替定時(shí)器滔吠。有些app用定時(shí)器監(jiān)控文件內(nèi)容、網(wǎng)絡(luò)或者其他狀態(tài)的變化疮绷,這會(huì)導(dǎo)致CPU無法進(jìn)入閑置狀態(tài)而增加功耗冬骚。
3.2減少后臺(tái)工作
實(shí)現(xiàn)UIApplicationDelegate中的方法,應(yīng)用進(jìn)入后臺(tái)前做好暫停任務(wù)庇麦,保存數(shù)據(jù)等工作属愤。如果確實(shí)需要完成用戶執(zhí)行的一些任務(wù),應(yīng)該調(diào)用UIApplicationDelegate中的beginBackgroundTaskWithExpirationHandler: 方法驾胆,這樣后臺(tái)任務(wù)可以繼續(xù)執(zhí)行幾分鐘贱呐。任務(wù)執(zhí)行完畢后一定要調(diào)用endBackgroundTask:方法,不要等著系統(tǒng)強(qiáng)行掛起進(jìn)程驳阎。
3.3用QoS分級(jí)有序工作
多個(gè)app和眾多操作需要共享CPU馁蒂、緩存、網(wǎng)絡(luò)等資源饵隙,為了保持高效沮脖,系統(tǒng)需要根據(jù)不同任務(wù)的優(yōu)先級(jí)智能地管理這些工作。比如更新UI這種重要的事需要多分配資源驶俊,而一些后臺(tái)任務(wù)可以延遲一些執(zhí)行免姿。服務(wù)質(zhì)量(quality of service, 以下簡(jiǎn)稱QoS, iOS8引入)級(jí)別可以通過NSOperation, NSOperationQueue, NSThread objects, dispatch queues, 和pthreads (POSIX threads)指定工作的優(yōu)先級(jí)。
3.4優(yōu)化I/O訪問
app每次執(zhí)行I/O任務(wù)嗜湃,比如寫文件澜掩,會(huì)導(dǎo)致系統(tǒng)退出閑置模式。而且寫入緩存格外耗電肩榕。通過下列方法可以提高能效、改善app性能筐乳。
減小寫入數(shù)據(jù)乔妈。數(shù)據(jù)有變化再寫文件,盡量把多個(gè)更改攢到一起一次性寫入勃刨。如果只有幾個(gè)字節(jié)的數(shù)據(jù)改變身隐,不要把整個(gè)文件重新寫入一次。如果你的app經(jīng)常要修改大文件里很少的內(nèi)容贾铝,可以考慮用數(shù)據(jù)庫(kù)存儲(chǔ)這些數(shù)據(jù)。
避免訪問存儲(chǔ)頻度太高垢揩。如果app要存儲(chǔ)狀態(tài)信息敛瓷,要等到狀態(tài)信息有變化時(shí)再寫入。盡量分批修改俘种,不要頻繁地寫入這些小變動(dòng)绝淡。
盡量順序讀寫數(shù)據(jù)。在文件中跳轉(zhuǎn)位置會(huì)消耗一些時(shí)間悬包。
盡量從文件讀寫大數(shù)據(jù)塊馍乙,一次讀取太多數(shù)據(jù)可能會(huì)引發(fā)一些問題垫释。比如棵譬,讀取一個(gè)32M文件的全部?jī)?nèi)容可能會(huì)在讀取完成前觸發(fā)內(nèi)容分頁订咸。
讀寫大量重要數(shù)據(jù)時(shí)酬诀,考慮用dispatch_io,其提供了基于GCD的異步操作文件I/O的API父叙。用dispatch_io系統(tǒng)會(huì)優(yōu)化磁盤訪問。
如果你的數(shù)據(jù)由隨機(jī)訪問的結(jié)構(gòu)化內(nèi)容組成趾唱,建議將其存儲(chǔ)在數(shù)據(jù)庫(kù)中鲸匿,可以使用SQLite或Core Data訪問阻肩。特別是需要操作的內(nèi)容可能增長(zhǎng)到超過幾兆的時(shí)候。
了解系統(tǒng)如何緩存文件乔煞、如何優(yōu)化緩存的使用柒室。如果你不打算多次引用某些數(shù)據(jù)雄右,不要自己緩存數(shù)據(jù)。
4.GPU
減少app使用的視圖數(shù)量囤屹。
少用運(yùn)算獲得圓角,不論view.maskToBounds還是layer.clipToBounds都會(huì)有很大的資源開銷.
盡量少用透明或半透明,會(huì)產(chǎn)生額外的運(yùn)算.
執(zhí)行動(dòng)畫時(shí)不要修改幀率逢渔。比如,你的app幀率是60fps智厌,整個(gè)動(dòng)畫就保持這個(gè)幀率不要變。
視頻播放時(shí)敷扫,app盡量不要在全屏視頻上添加額外的圖層(即使是隱藏的圖層)
5.優(yōu)化通知
盡量用本地通知(local notification)呻澜,如果你的app不依賴外部數(shù)據(jù),而是需要基于時(shí)間的通知,應(yīng)該用本地通知辫愉,可以讓設(shè)備的網(wǎng)絡(luò)硬件休息一下将硝。
遠(yuǎn)程推送有兩個(gè)級(jí)別,一個(gè)是立即推送痰腮,另一個(gè)是針對(duì)功耗優(yōu)化過的延時(shí)推送膀值。如果不是真的需要即時(shí)推送误辑,盡量使用延時(shí)推送。
五翘狱、總結(jié)
耗電量分析是應(yīng)用開發(fā)中很難的課題潦匈,也是衡量性能的重要指標(biāo)赚导,做好電量?jī)?yōu)化,可以大幅度提升用戶體驗(yàn)寒屯,在實(shí)際開發(fā)過程中寡夹,電量消耗往往是一個(gè)綜合的結(jié)果,小到日常的代碼習(xí)慣魂角,積少成多智绸,大到網(wǎng)絡(luò)的亂用、不合理的網(wǎng)絡(luò)超時(shí)斯稳、不合理的定位使用迹恐、不合理的CPU使用殴边,都會(huì)帶來能耗的過多消耗,而這些問題僅僅會(huì)影響電量竖幔,還會(huì)影響用戶體驗(yàn)是偷,而對(duì)于這一個(gè)很多因素綜合起來的結(jié)果,我們需要提高日常開發(fā)的代碼質(zhì)量饿幅,了解不同實(shí)現(xiàn)方式的差異點(diǎn)戒职,優(yōu)化頁面卡頓洪燥,優(yōu)化網(wǎng)絡(luò)使用,優(yōu)化GPS使用等等市咆,只有綜合這些因素蒙兰,最終獲得較好的用戶體驗(yàn)。
在做耗電量分析的時(shí)候搜变,首先要清楚耗電量較大的點(diǎn),比如:網(wǎng)絡(luò)扳抽、定位贸呢、CPU拢军、GPU朴沿,從這些點(diǎn)來入手分析,再詳細(xì)分析每個(gè)點(diǎn),細(xì)分每個(gè)點(diǎn)中的一些細(xì)節(jié)的影響昌犹,比如:網(wǎng)絡(luò)中可能會(huì)存在導(dǎo)致耗電量過高的因素,我們可以使用哪些優(yōu)化方法鸿竖,同時(shí)根據(jù)我們的需求特點(diǎn)缚忧,怎么來優(yōu)化杈笔,最終找到可優(yōu)化點(diǎn)的,找到解決方案球榆,來優(yōu)化耗電量禁筏。
在優(yōu)化點(diǎn)尋找的過程中持钉,我們首先可以使用Energy Impact來實(shí)時(shí)分析每强,各個(gè)維度指標(biāo)是否有問題空执,占比是否合理,然后在通過Time Profiler
山林、Network Profiler
邢羔、Location Profiler
等工具對(duì)各項(xiàng)指標(biāo)進(jìn)行詳細(xì)分析拜鹤,尋找優(yōu)化點(diǎn)。
其次我們可以使用Energy Log來橫向?qū)Ρ雀鱾€(gè)維度的數(shù)據(jù)明也,來分析各個(gè)維度對(duì)總功耗的影響惯裕,比如:wifi數(shù)據(jù)傳輸和4G數(shù)據(jù)傳輸時(shí)蜻势,耗電量的對(duì)比,打開藍(lán)牙和未打開藍(lán)牙够傍,能耗數(shù)據(jù)的對(duì)比挠铲,查看各個(gè)維度對(duì)能耗消耗影響的權(quán)重。然后安聘,我們可以使用Sysdiagnose可以進(jìn)行不同場(chǎng)景搞挣、競(jìng)品app的對(duì)比分析音羞,查找app的可優(yōu)化點(diǎn)嗅绰,也可以進(jìn)行各種能耗數(shù)據(jù)的對(duì)比分析搀继,以及優(yōu)化前后的能耗數(shù)據(jù)對(duì)比叽躯,獲取最終的優(yōu)化效果点骑。Sysdiagnose中的數(shù)量比較精確谍夭,同時(shí)數(shù)據(jù)比較全面,可以挖掘更多的信息袁辈,來輔助我們進(jìn)行電量?jī)?yōu)化珠漂。</br>
附:iPhone各代電池容量
??手機(jī)型號(hào) | ??電池容量 |
---|---|
iPhone 11 Pro Max | 3500mAh |
iPhone 11 Pro | 3190mAh |
iPhone 11 | 3110mAh |
iPhone XS Max | 3174mAh |
iPhone XS | 2658mAh |
iPhone XR | 2942mAh |
iPhone 8 Plus | 2675mAh |
iPhone 8 | 1821mAh |
iPhone 7 Plus | 2900mAh |
iPhone 7 | 1960mAh |
iPhone 6s Plus | 2750mAh |
iPhone 6s | 1715 mAh |
iPhone 6 Plus | 2915mAh |
iPhone 6 | 1810 mAh |
參考內(nèi)容: