iOS耗電量?jī)?yōu)化實(shí)踐

前言-理論篇

耗電量分析是衡量應(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.耗電量概念

`x 軸`為時(shí)間酒繁,`y 軸`為電量消耗的坐標(biāo)圖
  • 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

Energy Imapct
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凯力、CPUNetWork礼华、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使用:
energy 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組成:
energylog4
  • Energy Usage Log 代表能耗消耗級(jí)別侥袜,有 0 到 20 的級(jí)別蝌诡,表示應(yīng)用在任何給定時(shí)間使用了多少電量,值越大表示越耗電枫吧∑趾担可以用來分析app的總體能耗。

  • CPU Activity Log 代表cpu能源消耗九杂,包括 :Foreground app Activity颁湖、Graphics ActivityMedia Activity例隆、Other Activity甥捺。

  • Network Activity Log 代表網(wǎng)絡(luò)能源消耗,包括 :Cellular in镀层、Cellular out镰禾、Wi-Fi InWi-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ù)甲棍,包括:ispapsocbase赶掖、 display感猛、wifi dataGPU 奢赂、CPU陪白、restofsoc膳灶、GPSDRAM轧钓、等詳細(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ì)比

對(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.需求分析

image.png

上面是使用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ò)的能耗圖。


多次網(wǎng)絡(luò)活動(dòng)產(chǎn)生間接能耗.png
1.1 縮減網(wǎng)絡(luò)請(qǐng)求
  1. 減少僧凤、壓縮網(wǎng)絡(luò)數(shù)據(jù)元扔。可以降低上傳或下載的多媒體內(nèi)容質(zhì)量和尺寸等吻氧。

  2. 使用緩存咏连,不要重復(fù)下載相同的數(shù)據(jù)。

  3. 使用斷點(diǎn)續(xù)傳振惰,否則網(wǎng)絡(luò)不穩(wěn)定時(shí)可能多次傳輸相同的內(nèi)容垄懂。

  4. 網(wǎng)絡(luò)不可用時(shí)不要嘗試執(zhí)行網(wǎng)絡(luò)請(qǐng)求,盡量只在Wi-Fi情況下聯(lián)網(wǎng)草慧。

  5. 讓用戶可以取消長(zhǎng)時(shí)間運(yùn)行或者速度很慢的網(wǎng)絡(luò)操作,設(shè)置合適的超時(shí)時(shí)間仔雷。

  6. 網(wǎng)絡(luò)請(qǐng)求失敗后用SCNetworkReachability的通知監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)舔示,網(wǎng)絡(luò)可用后再重試。

1.2 延遲聯(lián)網(wǎng)
  1. 分批傳輸竖共。比如俺祠,下載視頻流時(shí)借帘,不要傳輸很小的數(shù)據(jù)包,直接下載整個(gè)文件或者一大塊一大塊地下載肺然。如果提供廣告匣沼,一次性多下載一些,然后再慢慢展示释涛。如果要從服務(wù)器下載電子郵件,一次下載多條它匕,不要一條一條地下載窖认。

  2. 網(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.定位

  1. 如果你的app只是需要快速確定一下用戶的位置哩陕,最好用CLLocationManager的requestLocation (iOS9引入)方法。定位完成之后會(huì)自動(dòng)讓硬件斷電萌踱。

  2. 除非是在導(dǎo)航的時(shí)候,app大部分時(shí)間不需要實(shí)時(shí)更新,降低位置的更新頻率扔涧。

  3. 盡量降低定位精度届谈。iOS設(shè)備默認(rèn)采用最高精度定位艰山,如果你的app不是確實(shí)需要米級(jí)的位置信息,不要用最高精度(kCLLocationAccuracyBest)或10米左右的精度(kCLLocationAccuracyNearestTenMeters)曙搬。一般來說Core Location提供的精度比你設(shè)置的要好鸽嫂,比如你設(shè)置為3公里左右的精度,可能會(huì)收到100米左右的精度信息橡娄。

  4. 如果定位精度一直達(dá)不到設(shè)置的精度時(shí)癣籽,停止更新位置,稍后再試瓶籽。

  5. 需要后臺(tái)更新位置時(shí)埂材,盡量把pausesLocationUpdatesAutomatically設(shè)為YES,如果用戶不太可能移動(dòng)的時(shí)候系統(tǒng)會(huì)自動(dòng)暫停位置更新茬暇。

  6. 后臺(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性能筐乳。

  1. 減小寫入數(shù)據(jù)乔妈。數(shù)據(jù)有變化再寫文件,盡量把多個(gè)更改攢到一起一次性寫入勃刨。如果只有幾個(gè)字節(jié)的數(shù)據(jù)改變身隐,不要把整個(gè)文件重新寫入一次。如果你的app經(jīng)常要修改大文件里很少的內(nèi)容贾铝,可以考慮用數(shù)據(jù)庫(kù)存儲(chǔ)這些數(shù)據(jù)。

  2. 避免訪問存儲(chǔ)頻度太高垢揩。如果app要存儲(chǔ)狀態(tài)信息敛瓷,要等到狀態(tài)信息有變化時(shí)再寫入。盡量分批修改俘种,不要頻繁地寫入這些小變動(dòng)绝淡。

  3. 盡量順序讀寫數(shù)據(jù)。在文件中跳轉(zhuǎn)位置會(huì)消耗一些時(shí)間悬包。

  4. 盡量從文件讀寫大數(shù)據(jù)塊馍乙,一次讀取太多數(shù)據(jù)可能會(huì)引發(fā)一些問題垫释。比如棵譬,讀取一個(gè)32M文件的全部?jī)?nèi)容可能會(huì)在讀取完成前觸發(fā)內(nèi)容分頁订咸。

  5. 讀寫大量重要數(shù)據(jù)時(shí)酬诀,考慮用dispatch_io,其提供了基于GCD的異步操作文件I/O的API父叙。用dispatch_io系統(tǒng)會(huì)優(yōu)化磁盤訪問。

  6. 如果你的數(shù)據(jù)由隨機(jī)訪問的結(jié)構(gòu)化內(nèi)容組成趾唱,建議將其存儲(chǔ)在數(shù)據(jù)庫(kù)中鲸匿,可以使用SQLite或Core Data訪問阻肩。特別是需要操作的內(nèi)容可能增長(zhǎng)到超過幾兆的時(shí)候。

  7. 了解系統(tǒng)如何緩存文件乔煞、如何優(yōu)化緩存的使用柒室。如果你不打算多次引用某些數(shù)據(jù)雄右,不要自己緩存數(shù)據(jù)。

4.GPU

  1. 減少app使用的視圖數(shù)量囤屹。

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

  3. 盡量少用透明或半透明,會(huì)產(chǎn)生額外的運(yùn)算.

  4. 執(zhí)行動(dòng)畫時(shí)不要修改幀率逢渔。比如,你的app幀率是60fps智厌,整個(gè)動(dòng)畫就保持這個(gè)幀率不要變。

  5. 視頻播放時(shí)敷扫,app盡量不要在全屏視頻上添加額外的圖層(即使是隱藏的圖層)

5.優(yōu)化通知

  1. 盡量用本地通知(local notification)呻澜,如果你的app不依賴外部數(shù)據(jù),而是需要基于時(shí)間的通知,應(yīng)該用本地通知辫愉,可以讓設(shè)備的網(wǎng)絡(luò)硬件休息一下将硝。

  2. 遠(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)容:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荞彼,一起剝皮案震驚了整個(gè)濱河市卿泽,隨后出現(xiàn)的幾起案子滋觉,更是在濱河造成了極大的恐慌椎侠,老刑警劉巖措拇,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐吓,死亡現(xiàn)場(chǎng)離奇詭異券犁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荞估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跪腹,“玉大人飞醉,你說我怎么就攤上這事缅帘。” “怎么了膳音?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵祭陷,是天一觀的道長(zhǎng)趣席。 經(jīng)常有香客問我宣肚,道長(zhǎng),這世上最難降的妖魔是什么按价? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任楼镐,我火速辦了婚禮框产,結(jié)果婚禮上错洁,老公的妹妹穿的比我還像新娘。我一直安慰自己描睦,他們只是感情好窿锉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仍稀,像睡著了一般埂息。 火紅的嫁衣襯著肌膚如雪千康。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天值桩,我揣著相機(jī)與錄音奔坟,去河邊找鬼咳秉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澜建,可吹牛的內(nèi)容都是我干的炕舵。 我是一名探鬼主播跟畅,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼碍彭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悼潭!你這毒婦竟也來了庇忌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤舰褪,失蹤者是張志新(化名)和其女友劉穎皆疹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體占拍,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡略就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年捎迫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窄绒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彰导。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖堰燎,靈堂內(nèi)的尸體忽然破棺而出秆剪,到底是詐尸還是另有隱情,我是刑警寧澤膏燃,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站伶贰,受9級(jí)特大地震影響黍衙,放射性物質(zhì)發(fā)生泄漏琅翻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一棠众、第九天 我趴在偏房一處隱蔽的房頂上張望闸拿。 院中可真熱鬧揽趾,春花似錦但骨、人聲如沸奔缠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抱怔。三九已至屈留,卻和暖如春灌危,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挨约。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工惜傲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隘弊。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓开镣,卻偏偏與公主長(zhǎng)得像邪财,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘶伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文是來自@ShawnSun的投稿 一款好的App一定要有非常好的用戶體驗(yàn),這一點(diǎn)已經(jīng)是大多數(shù)開發(fā)者的共識(shí)癌别。功耗是...
    SmallDe閱讀 3,039評(píng)論 0 50
  • 電池壽命長(zhǎng)。隨著能效降低诞仓,電池壽命也會(huì)降低墅拭。但用戶想讓自己的移動(dòng)設(shè)備全天候待命谍婉。 速度快穗熬。iOS系統(tǒng)處理復(fù)雜操作時(shí)...
    武_IOS書閱讀 1,471評(píng)論 0 3
  • 本文由作者張迎貞授權(quán)網(wǎng)易云社區(qū)發(fā)布。 APP性能測(cè)試除了需要監(jiān)控PCU箱季、內(nèi)存占用藏雏、流量等掘殴,還需要獲取APP的電量數(shù)...
    43ce3d72fadb閱讀 776評(píng)論 0 0
  • 俗話說:人生有三福,平安是福笼踩,健康是福亡嫌,吃虧是福挟冠。 為啥吃虧的人肋僧,是會(huì)成功的人呢嫌吠?吃虧真是福嗎? 其實(shí)炕矮,這福是一種...
    夏日雪蓮花閱讀 153評(píng)論 0 1
  • 上午魏割,我步行出門, 漫不經(jīng)心得在街上走著殊鞭。只見有夫妻二人 ,面對(duì)面趾盐,且行救鲤。丈夫面朝我,手拄拐杖丹锹,腿跛行楣黍,向前邁步,...
    福在平安閱讀 255評(píng)論 0 3