前言
這次的 WWDC17 又放出了許多乾貨
來幫助開發者更好地開發 app。精彩的內容特別多,本篇主要關注的是《Writing Energy Efficient Apps》 中所介紹的一些關於如何讓 app 節省電量的內容。
正文
以下是本次演講的主要內容。先講一下本次演講的概述。
概述
Why
(為什麼要關注 app 用電情況)What
(一些概念)How
( 程式碼層面的一些建議、利用工具的效能檢測)
Why
為什麼我們要關注自己開發的 app 所消耗的電量?先放個圖。
如圖,使用者可以在設定-電量
檢視過去24小時及七天,自己 app 耗電情況排行榜。如果你的 app 不幸在列表中名列前茅,然而如果這個 app 並不像微信
那樣會被重度使用時,那挑剔的使用者就會認定這是一個極其耗電的 app, 然後極有可能刪除這個 app 。顯然,我們作為開發者是不希望碰到這種窘境的。因此,我們非常需要關注自己 app 的電量能耗情況是否合理,以此提升使用者體驗,避免 app 被刪除的厄運。
What
一些概念
(還是上圖解釋)Idle
狀態說明 app 處於休眠狀態,幾乎不使用電量。Active
狀態說明 app 處於前臺工作狀態,用電量比較高,我們可以看到圖中的第二個Active
的耗電遠高於第一個,這主要因為 app 實際所做的工作型別不同而導致的。Overhead
指的是調起硬體來支援 app 功能所消耗的電量(原文是 bring hardware up)。note:如果你的 app 就算只做了一點點事,Overhead
所帶來的電量消耗都是一點不會減少的! 圖中,橫線以下所包區域是固定開銷
(Fixed Cost),橫線以上區域是動態開銷
(Dynamic cost)。耗電的四大天王
CPU 處理
(Processing)網路
(Networking)定位
(Location)影象
(Graphics)
節省電量的四個基本原則
Identify
想清楚你需要 app 在特定時刻需要完成哪些工作,如果是不必要的工作,考慮延後執行或者省去。Optimize
優化 app 的功能實現,儘可能以更有效率的方式去完成功能。Coalesce
意為合併。Reduce
減少做重複工作的頻率。
How
-
Networking(網路)
演講者舉了一個社交 app 的例子,這個 app 具有MainFeed
(類似重新整理出微博的資訊流)、上傳照片
、上傳使用者分析統計資料
3個功能。- MainFeed
原先的做法
:建立了一個定時器,定時去重新載入重新整理資料。這樣就會導致 app 會不斷重複重新整理內容。改進
:1.去除定時器
,只在產生使用者互動響應(例如下拉重新整理、點選按鈕等)、收到新訊息時去重新載入資料。2. 使用 NSURLSession 的WaitsForConnectivity
屬性,查了一下 API(Causes tasks to wait for network connectivity to become available, rather than immediately failing with an error,讓任務等待到有網路再執行,而不是立刻報錯
)3.使用快取
(避免重複請求獲取相同的內容) - 上傳照片
原本的做法
:當使用者上傳照片後,立刻向伺服器傳送照片,一旦上傳失敗,就不斷重試上傳。改進
:1.減少重試次數
2.設定合理的超時時間
3.批量上傳照片
(當累計了一定數量的照片後,一起上傳) 4.使用 Background Session
(僅當重試次數達到上限)。 - 上傳使用者分析資料
強推使用
NSURLSession Background Session
,它的好處有自動重試
、全程監控
,全新的屬性包括了Start time
、Workload size
,幫助 app 知道工作的最佳時機(Indicate system the best time to do your work)。 - 小結:1.
保證沒有重複的工作
2.使用 background session
3.使用批處理
4.減少重試次數
- MainFeed
-
Location(定位)
介紹了一大堆定位 API,包括了Continuous location
、Quick location update
、Region monitoring
、Visit monitoring
、Significant location change
。 其中Continuous location
保證了定位功能的持續性,防止裝置休眠。因為我的現有開發比較少接觸到定位方面的功能,對於不太 API 熟,因此不多講述。有興趣的童鞋可以看一下這兩個 API CLLocationManager、CLLocation 。 小結:1.清楚 app 需要的定位精確度
(適合你的需求就好) 2.使用其它來替代 Continuous location
(因為這個比較耗電) 3.不需要使用定位時,就停止
4.延後定位更新
-
Graphics(影象處理)
兩條建議
:1.保證在 UI 真的需要有變化時,進行螢幕更新
(Minimize screen updates Ensure screen updates provide needed changes) 2.避免blur
(Review blur usage Avoid placing blurs over updating elements)關於 MacOS
簡單提了下儘量少使用獨立顯示卡,只在動畫效能吃緊、或者其獨有功能時才去使用它。 -
CPU
明確 app 要完成的任務
(Identify tasks)更高效地完成任務
(Do work quickly and efficiently)不要使用定時器
(Avoid timers)給一點餘地
(如果必須要設定一個定時器,設定比較長的間隔時間)
-
Background Processing(後臺處理)
快速完成任務
(Finish work quickly)使用後臺 app 重新整理 API
(Use background app refresh)呼叫 completion handler
(Call completion handler)PushKit API 現在有 completion handler了,處理完推送後會呼叫的!前後對比圖,讓 app 更快進入空閒狀態。
-
Debug 工具使用介紹
照例先強調了 tools 的重要性。正如文章開頭所講,用電量大的 app 容易被使用者刪除...所以我們必須用好這個工具。除錯介面組成部分
連線 Xocde 除錯,選擇 debug 選項。 可以看到如下介面 可以檢視你的 app 在裝置的CPU
、記憶體
、電量使用
、硬碟
、網路
的使用情況。點選Energy Impact
檢視電量情況。 接下來專注右邊的區域 先看左上角 如圖,指標所指向的半圓環分為三部分,代表的是 app 的總體上的平均消耗電量評級,low
(綠色區域)、high
(黃色區域)、very high
(紅色區域)。通過這張圖,我們可以大致瞭解 app 電量的使用情況。理想
的狀態是 app 處於low
、high
狀態。但是通常情況下,如果我們進行過優化,app 會處於high
、甚至very high
狀態。我們需要更深入地知道究竟哪一部分的功能導致耗電量大漲。繼續往下看。 這張餅圖能讓我們快速瞭解各耗電部分的佔比。裡面包含了前文提到的耗電的幾個部分,包括CPU
、網路
、定位
、GPU
、Overhead
。 接下來看中間部分(note
Xcode 9 更新) 柱狀圖中,其中每根柱子
代表了每秒鐘
的耗電情況。每根柱子
都由不同顏色的矩形塊堆疊而成。依次是Overhead
(紅色)、CPU
(藍色)、網路
(深黃)、定位
(淡黃)、GPU
(綠色)、後臺
(深灰)、前臺
(淡灰)、Suspend
(白色)。 如上圖所示的最右側,可以看到各部分的用電情況佔比。這意味著可以一邊操作 app,一邊檢視裝置的各部分耗電情況。舉個例子,當你期望你的 app 只需要有 CPU、網路方面的功能,執行起來之後卻發現有一部分的電量是因為定位功能而損耗的!這顯然是你所不希望的。你肯定想去看看究竟是什麼坑爹的原因造成了定位的耗電。怎麼查呢?再往下看。 如果你覺得CPU
、網路
、定位
這幾個方面耗電情況讓你不滿意的話,點選Time Profiler
、Network Profiler
、Location Profiler
這三個按鈕的其中之一,Xcode
會幫你斷開除錯連線,並啟動Instruments
來分析 app 效能。 比如點選Time Profiler
,可以幫助檢視你的方法耗時情況,從中找出最耗時的方法,然後優化。使用場景
啟動
空閒
後臺
特殊
:如導航類 app 的話,可以對其中的導航相關功能進行檢測。直播類 app,對直播間進行檢測。
最後的總結(Final Thoughts)
- 1
使用 NSURLSession Background Session
(處理後臺工作) - 2
儘量減少使用 continuous location
(因為持續定位太耗電!) - 3
避免使用定時器
- 4
合併
(一起重複的工作一起執行,減輕負擔) - 5
使用 energy gauges
(即Xcode 的內建 tools)
小尾巴
希望這篇文章能幫助到那些對通過優化 app 節省裝置電量相關知識還不太瞭解的同學。如果你對這方面感興趣的話,趕緊安裝 Xcode 9
,動起手來!因為其中一些除錯功能只在 Xcode 9
中有所體現。第一次如此碼這麼多字,可能在表達方面存在缺陷,如果有看不懂或其它不盡如人意的地方,敬請告知,謝謝!