微信開源了 Hardcoder,旨在解決手機「卡成狗」,但開發者先別高興。

今年一月微信公開課 Pro 2019 上,提到的微信性能優化框架「Hardcoder」,近日終於開源了。

微信開源的東西,作爲 Android 開發,當然是雙擊 666 了。

但是作爲一名 Android 開發者,我更關心的是 Hardcoder 到底是什麼?對我們 Android 開發者有什麼影響?

什麼是 Hardcoder?

Hardcoder 在 18 年微信就放出了消息,簡單來說,Hardcoder 是微信研發的一款性能優化框架。

如果看了這麼一句話,簡單去理解的話,好像只要等微信開源之後,我們在 App 內也接入 Hardcoder,就可以如微信般絲滑。

但理想總是很豐滿的…

Hardcoder 本身也是業務發展的產物,在微信越來越複雜後,常規的性能優化,帶來的提升已經越來越小了。但是從廠商的角度,微信這種國民 App,就應該秒開無卡頓,做到極致的優化。

打個比方說,如果那個廠商的手機,運行微信有問題,用戶肯定覺得是這個手機有問題,而不是微信有問題。

有句話怎麼說的,「當你強大,整個世界都會對你和顏悅色」。

廠商也意識到了這一點,所以部分廠商早期是會針對微信,做一些小優化,其中比較典型的就是「暴力提頻」。系統在識別當前微信正在運行,會粗暴的提高 CPU 頻率,從而提升 App 的運行性能。

要知道,所有「一刀切」的事情,都是在暴露一些問題。

「暴力提頻」也是一樣。過多的提高 CPU 頻率,必然會對手機的功耗造成影響,最直接的影響,就是你發現你的手機耗電更快了。

廠商對硬件資源的限制,本身有一部分,也是從功耗的角度考慮的,隨着手機功能越來越豐富,其實電池技術是跟不上的,一款功能強大但離不開電源的手機,肯定不會是用戶的理想選擇。

所以手機廠商就會對硬件做出一些限制,在不需要那麼多資源的時候,就減少資源的給予。但是資源的減少,必然會引起一些體驗上的問題,例如卡頓,而這種用戶體驗的問題,廠商也並不願意。

畢竟誰卡,誰不卡,用戶心理自然有一杆秤。

但這其中有個難點,廠商之所以選擇一刀切這種暴力提頻的方案,根本原因在於,作爲手機,沒有辦法準確知道 App 當前在幹什麼,是否需要資源。畢竟現在 App 的功能太豐富了,靠手機自身無法做到精準的優化。

既然廠商想優化體驗,微信又有優化 App 性能的需求,那真是一拍即合,就誕生了 Hardcoder。Hardcoder 構建了 App 與系統(ROM)之間可靠的通信框架,讓系統知道 App 的需求。

之前廠商也不知道什麼時候該給資源,什麼時候該省資源,真是又怕他不來又怕他亂來。

現在好了,有了 Hardcoder,既然系統不知道,就由 App 主動告訴它,等於微信主動告訴手機系統,我現在在什麼場景下,或者我接下來要幹什麼了,這個場景需要一些系統資源來加持,才能保證速度嗖嗖的,不會卡頓。

到這裏大家應該就理解了,Hardcoder 更像是一個通信框架,可以通過它告知操作系統,我接下來要做複雜操作了,請給我資源。

Hardcoder 本身與廠商,已經預設了一些場景值,可以直接使用。

int APP_SCENE_UNDEFINE = 0; //未定義場景
int APP_SCENE_STARTUP = 1; //進程啓動,APP啓動
int APP_SCENE_WINDOW_SWITCH = 2; //UI頁面切換(同一進程),activity,fragment切換
int APP_SCENE_WINDOW_SCROLL = 3; //UI頁面滑動
int APP_SCENE_DATA_LOADING_AND_PROCESS = 4//數據加載和處理任務,指APP本地前後臺任務
int APP_SCENE_MULTI_MEDIA_PROCESS = 5; //多媒體相關業務
int APP_SCENE_COMMUNICATE = 6; //APP/服務端通信
int APP_SCENE_SYSTEM_DEVICE = 7//調用系統服務

當然你也可以自行定義。

Hardcoder 的原理

知道了 Hardcoder 都幹了什麼,再簡單瞭解一下它的設計。

Hardcoder 在 App 和系統之間,構建了一個可靠的通信框架,跳出之前 App 只能調用系統標準 API,而無法直接調用系統底層硬件資源的問題,讓 Android App 與 系統之間,可以實現實時的通信。

利用 Hardcoder,App 可以在必要的時候,向系統申請更多的硬件資源,例如 CPU 頻率、大小核、GPU 頻率等資源來提升 App 的性能。

Hardcoder 框架,分爲 Client 端和 Server 端,本次開源的就是 Client 端,Server 端則交由廠商系統側自行實現。

Hardcoder Client 端和 Server 端之間,採用的是 LocalSocket 的通信方式,等於 App 如果需要資源,通過 Hardcoder 的 Client 端向系統實現的 Server 發請求,系統側接到請求之後,按需調整不同的系統資源,例如給更大的 CPU 頻率,把系統綁定到大核運行等等。

說到 LocalSocket,我想 Android 開發應該比較熟悉。因爲在 Java 層,Android 本身提供了一套 LocalSocket 的 API,但是呢 Hardcoder 沒用它。因爲 Hardcoder 主要是採用 Native 實現的,所以微信在 C 層,使用 Linux 的 Socket 接口,又自己實現了一套 LocalSocket。

這大概就是大佬的世界,用不了就自己寫。

那利用 Hardcoder 到底對性能有多少提升呢?

從官方里給出的數據來看,平均優化效果達 10%~30%,而又因爲微信本身對資源的申請也比較精細和準確,所以功耗上僅增加了 2% 的耗電,相當於用 2% 的功耗,換來了 20% 性能的提升。這份數據在廠商來看,應該是可以接受的。

Hardcoder 框架的覆蓋的設備量也非常的大,目前已接入 OPPO、vivo、華爲、小米、三星、魅族等主流手機廠商,覆蓋 4.6 億+ 設備量。

到這裏大家應該都明白了。說白了 Hardcoder 就是一個 App 與系統的通信框架,之前說的性能優化框架,但實際上真正的起作用的邏輯,都在 Server 端。你想申請資源,你就用 Hardcoder 申請你的,系統給不給你,完全由系統側自身決定。

普通開發者看 Hardcoder

體量決定了複雜度,再簡單的技術,用在 10w 用戶和用在 10 億用戶上,就是天差地別。

有些事情,微信能做到的,你就算拿到了微信的源碼,你也做不到。主要還是因爲微信這樣的用戶體量,讓廠商一路給開綠燈。

從文檔中瞭解到,Hardcoder 目前國內的主流廠商都已經支持了,並且有些已經開放出權限申請方式。

VIVO 這種商務渠道的申請,應該是比較困難的,但是自助註冊的 OPPO 以及華爲這種無需註冊的,就可以用到 Hardcoder 了。

但 Hardcoder 本質上還是一個與系統通信的框架,至於系統是否響應你申請資源的請求,完全拒絕於系統側自身的邏輯,你這個申請資源的消息發過去了,對方受不受理,就不是我們能決定的。

文檔裏也提到,Hardcoder Server 端也會對應用請求資源做一定的限制,例如當前 App 在前臺或者在後臺,就會有不同的處理邏輯。

站在微信的視角,Hardcoder 是性能優化框架,站在普通開發者的角度,它可能僅僅是一個通信框架,並且還是那種單向通信的框架,是否有作用,完全取決於廠商,這部分堪稱是玄學。

可能你在 A 手機上不好使,換到 B 手機上就好使了,也可能你在測試機上有效,換到自用機上就無效了。

不過話說回來,提升用戶體驗一直也是廠商的目標,這和大部分 App 開發者的目標上一致的,所以長期來看 Hardcoder 還是有價值的。但在國內全家桶 App 的環境下,天然的讓廠商不信任 App,將廠商與 App 推到了對立面。

但是如果廠商有一套標準的檢驗流程,可以檢驗出 App 開發者是否真的做到「誠實」,在需要的時候做到精確控制,只在需要的時候申請,不需要的時候不亂申請。就可以讓 App 和廠商愉快的玩耍了。

而 Hardcoder 發佈之前也並不只有微信在使用,騰訊系的不少產品已經在使用它了,例如 QQ、企業微信、天天快報等。等於微信這次開源了 Hardcoder,如果廠商想開放出來讓廣大開發者使用,其實成本是非常低的。

說到底 Hardcoder 是否有效的主動權還是在廠商,所以在這件事情期待後續廠商的發聲。

最後我提一句,Hardcoder 在 Github 上開源的文檔,還是值得 Android 開發者讀一讀的,可以學到不少東西。

你對 Hardcoder 有什麼看法?歡迎留言討論。

references:

https://github.com/Tencent/Hardcoder

本文對你有幫助嗎?留言、轉發、點好看是最大的支持,謝謝!


「聯機圓桌」????推薦我的知識星球,一年 50 個優質問題,上桌聯機學習。

公衆號後臺回覆成長『成長』,將會得到我準備的學習資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章