華爲:既知足用戶體驗,又節省功耗的App應用設計開發方法


內容來源:2018 年 1 月 20 日,華爲手機功耗架構師錢華君在「走進網易:移動測試與安全實踐」進行《低功耗設計和開發方法探討》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。前端

閱讀字數:2756 | 7分鐘閱讀算法

嘉賓演講視頻及PPT回顧: suo.im/4AcBmp

摘要

本次演講將介紹常見的高耗電設計場景,功耗異常的場景舉例,並結合Android機制,介紹爲什麼致使耗電,以及推薦的設計方法;接下來說解編譯技術在低功耗開發中的應用,如何基於LLVM編譯器來開發構建一個靜態代碼分析工具,檢測常見的錯誤編碼方式,深刻淺出介紹如何經過編譯器來檢測持鎖未釋放的場景;最後是機器學習在低功耗設計中的應用展望,經過機器學習瞭解用戶的行爲,在應用開發中既知足用戶體驗,又節省功耗。編程

高耗電設計場景舉例

Push

Push即notification消息的一個交互,是一種消息推送機制,iOS有惟一的Push通道,全部應用的服務端要與應用交互的消息都必須經過這個Push通道,避免了通知消息喚醒應用。Android則存在多個Push通道,谷歌有GCM;每一個廠商也有本身的通道,好比華爲Push;除此以外應用有本身的獨立通道,如微信。這種狀況下就致使應用被頻繁喚醒,整個系統實際上是沒有休眠的,沒辦法像iOS的通道這樣控制行爲。後端

Wakelock長時間持鎖

上圖是Android的休眠機制,剛開始的時候系統被頻繁的喚醒,在息屏後一段時間會進入淺睡眠,這時網路訪問就沒有了、Syncs以及Jobs Deferred都不推薦使用,可是按期仍是會有一個維護窗口,這段時間應用程序是能夠被喚醒的。再持續一段時間後就進入了深度睡眠模式,這時不只沒有網絡鏈接,GPS等也被禁止,這實際上是理想的睡眠狀態,實際是比較難進入這種狀態的。安全

爲了避免讓系統的休眠致使應用進程結束,通常須要設置Wakelock。Wakelock有兩種使用形式,一種是採用PowerMananger申請Wakelock鎖,這段時間內系統不會進入休眠狀態;另外一種是直接使用底層的wake_lock或wake_unlock接口來避免系統進入休眠狀態。微信

Wakelock持鎖若是忘記釋放,會致使系統一直被頻繁喚醒沒法進入淺睡眠而一直處於異常耗電狀態。程序獲持鎖以後異常退出會致使wake_lock一直被開啓,這時也系統也是處於異常耗電狀態。網絡

編譯技術在低功耗開發中的應用

編譯技術的應用

理論上的全部把一種編程語言轉換爲另外一種語言或格式的都叫編譯。第一種常見的編譯是把編程語言直接編譯爲機器碼,典型的如C/C++的編譯器;第二種是把編程語言編譯爲字節碼,由虛擬機執行;第三種是領域特定語言(DSL)的編譯器。架構

在產品中應用編譯技術的幾種可行方面

- 研究編譯器選項,或者經過迭代編譯得到最佳選項,從而在產品中得到性能提高。框架

- 增長編譯器擴展(pragma,_attribute_),進行額外的編譯檢查和輔助代碼生成。機器學習

- 基於編譯器前端生成的抽象語法樹(AST)進行代碼靜態分析,以及基於AST重寫進行自動化的代碼重構。

- 基於編譯器後端輸入的中間表達式(IR)進行跨函數/跨TU的分析。

- 基於編譯指令修改的運行時錯誤發現。

CLAN & LLVM

應用編譯技術不須要全部從頭本身寫,能夠合理選擇已有的編譯器基礎軟件。

LLVM不是虛擬機,而是一套編譯優化(全時優化)的基礎庫,Clang是一個前端,支持C(包括C99/C十一、大部分GCC擴展)、C++(已經徹底支持到C++14)、Object-C、OpenCL。Clang和LLVM的紐帶在於LLVMIR(Intermediate Representation),這也是LLVM的核心。

相對GCC來講Clange&LLVM學習曲線更平緩,而且它們使用的是BSD License,相比GPL更加優化;高度的模塊化,比GCC更容易擴展和二次開發;另外它們有設計良好的接口和模式,便於訪問內部數據,如:訪問抽象語法樹(AST)節點、獲取控制流圖節點(CFG Node)、進行上下文符號獲取等等;Clang對C++標準的支持更完整、更快;它們還有良好的GCC兼容性,包括GCC內置擴展語法、內置關鍵字的支持;不管是編譯速度、內存開銷、部分平臺上代碼執行效率Clang和LLVM都超過了GCC。

代碼的靜態分析

代碼的靜態分析中被分析程序不須要運行起來,不依賴執行環境,經過對程序的源代碼或者某種形式的中間代碼進行分析來發現代碼中的缺陷,在大型軟件分析中,是很是有價值的。

靜態分析一樣也面臨着諸多挑戰,首先代碼中的各類分支路徑均須要分析;並且要根據上下文分析,好比變量的取值範圍和條件;另外各類分支組合會帶來算法複雜度的指數級增加,尤爲是跨函數分析;最後靜態分析須要儘量的清除誤報。

符號執行

Symbolic Execution

- 根據AST構造控制流程圖CFG

- 從CFG的根節點開始,沿着圖的各條邊進行語句的虛擬執行,對全部可能的Path都須要進行遍歷,使用符號來表示結果,而不是向運行時記錄實際的值。

- 在遍歷每條路徑是,在每一個點上收集全部在這個點上可見的符號值。

- 對於「資源泄露」這類問題,就轉化爲圖的可達性判斷問題。

在路徑的遍歷分析中用記錄變量的Symbolic Value

- FITE* f在全部路徑均可見

- 路徑的全部節點(語句)上均記錄f的Symbolic Value

- 達到Sink節點時,根據f的Symbolic Value來判斷是否殘留句柄未關閉

Analysis Checker

- 在CFG遍歷過程當中,每一個stmt訪問時觸發,是一種典型的控制反轉(Ioc)模式。

- 開發者能夠在不一樣的觸發點上註冊本身的檢查。

- Checker會參與並影響到Exloded Graph的建立。

- 爲了減小路徑爆炸,Checker能夠經過建立Sink Node來作路徑支剪。

機器學習在低功耗中的應用展望

機器學習應用場景

通常開發中的耗電量統計是基於進程的角度,不能進一步查看到進程下每一個函數的耗電量,經過機器學習就能基於線性迴歸統計函數級別的功耗。

Android即將到來的p版本中機器學習將應用於場景分析,好比智能亮度控制,auto-awesome Battery。而iOS 11集成了機器學習框架Core ML,當前用於視覺和天然語言處理。

相關文章
相關標籤/搜索