1、Hardcoder 的誕生

隨著微信越來越複雜,效能最佳化變得越來越難做,最佳化所帶來的效果提升也越來越不明顯。所以我們⼀直在思考,該如何突破這個最佳化的

極限

直到有一次與廠商的交流我們瞭解到,部分廠商會針對微信做一些小改動,其中比較典型的就是“暴力提頻”。系統在識別到微信啟動,頁面切換等場景時,會粗暴地提高 CPU 頻率,從而提升 APP 執行的效能。

但由於廠商無法準確判斷微信場景,暴力提頻效果並不理想;而如果過多地提高 CPU 頻率,又對手機的

功耗

有影響。這一方案啟發了我們,我們何不跳出軟體的範疇,在

手機硬體

的層面上挖掘更多的效能最佳化空間呢?於是 Hardcoder 框架應運而生。

2、Hardcoder 是什麼

廠商暴力提頻效果不理想是由於在目前 Android 框架下,手機沒有辦法準確獲知 APP 需要資源的時機。如果我們需要挖掘手機硬體層面的效能最佳化,就需要跳過 Android 作業系統的應用框架,在應用開發者和硬體之間開啟一個通道,讓硬體可以直接根據應用開發者的需要進行資源的排程。

Hardcoder 構建了 APP 與系統(ROM)之間可靠的通訊框架,突破了 APP 只能呼叫系統標準 API,無法直接呼叫系統底層硬體資源的問題,讓 Android APP 和系統能實時通訊。

微信底層呼叫方案Hardcoder已開源!

利用 Hardcoder,APP 能充分排程系統資源如 CPU 頻率,大小核,GPU 頻率等來提升 APP 效能,系統能夠從 APP 側獲取更多資訊以便更合理提供各項系統資源。同時,對於 Android 缺乏標準介面實現的功能,APP 和系統間也可以透過該框架實現機型適配和功能拓展。

3、Hardcoder 框架通訊流程

Hardcoder 框架分為 Server 端和 Client 端。其中 Server 端在廠商系統側實現,Client 端以 aar 形式合入到 APP中。

微信底層呼叫方案Hardcoder已開源!

APP 在需要資源的時候,向 Hardcoder 的 Client 端發出

請求

。Hardcoder Client 端接收到請求後向 Hardcoder Server 端發出請求。Server 端接受到請求後會根據請求引數向硬體申請不同的資源,比如調整 CPU 頻率,把執行緒繫結到大核執行等,實現了 APP 到系統的通訊。

同時系統也可把當前系統的狀態透過 Hardcoder Client 在 Server 端註冊的介面回撥通知到 Client 端,從而 APP 可以獲取到系統狀態,實現系統到 APP 的通訊。

Hardcoder Client 端與 Server 端採用的是 LocalSocket 的通訊方式,由於 Hardcoder 採用 Native 實現,因而在 C 層使用 Linux 的 socket 介面實現了一套 LocalSocket 機制作為 Client 端與 Server 端之間的通訊方式。

Hardcoder 通訊框架有以下特點:

1)系統服務為 optional,實現上可以完全支援或者部分支援;

2)框架實現不依賴於特定 Android 系統,如 API level 限制;

3)APP 的功能和業務特性不依賴於該框架。

4、Hardcoder 適用場景和效果

Hardcoder 框架有效提升了微信啟動、傳送影片、小程式啟動等重度場景的速度,朋友圈的滑動流暢性也明顯提升,平均最佳化效果達 10%-30%。

此外,由於微信作為主動請求方可以在場景資源把控上做得更精細和準確,Hardcoder 在效能得到提升的同時僅增加了 2% 的電量消耗,相當於用 2% 的功耗換取平均 20% 的

效能提升

Hardcoder 框架目前已接入 OPPO、vivo、華為、小米、三星、魅族等主流手機廠商,覆蓋 4。6 億+ 裝置量。

5、Hardcoder 開源

從微信技術開放共享的理念出發,我們在騰訊內部進行了 Hardcoder 框架的宣傳和推廣,包括手機 QQ、企業微信、

天天快報

等多個應用團隊接入。其中手機 QQ 接入 Hardcoder 後,在啟動、開啟聊天介面、傳送圖片等場景的平均最佳化效果達 10%-50%。

我們現將 Hardcoder 框架開源,讓更多 Android 開發者享受到 Hardcoder 框架的價值,解決大家在效能最佳化和機型適配上的煩惱。

歡迎大家查閱 github 網址:

http://

github。com/Tencent/Hard

coder。git

6、如何使用 Hardcoder

一、透過

Hardcoder 技術方案介紹,瞭解 Hardcoder 實現原理以及框架;

二、使用工程自帶 testapp 快速使用 Hardcoder 並驗證效果,具體請見

Hardcoder Testapp 測試指南;

三、APP 接入 Hardcoder,具體請參見

Hardcoder 接入指南:

1)下載 Hardcoder

工程編譯

aar;

2)專案 build。gradle 引入 Hardcoder aar;

3)程序啟動時呼叫 initHardCoder 建立 socket 連線(一般程序啟動時需要請求資源,因而推薦在程序啟動時呼叫)。每個程序都是獨立的,都需要呼叫 initHardCoder 建立 socket 連線,建立連線後每個程序維持一個 socket,程序退出時 socket 也會斷開;

4)initHardCoder 回撥成功後呼叫 checkPermission,傳入 APP 已申請的各個廠商鑑權值;

5)在需要請求資源的場景呼叫 startPerformance,傳入請求資源的引數。若場景位於程序啟動階段,比如 APP 啟動,需要在 initHardCoder 的回撥成功以後再呼叫 startPerformance,確保連線已成功建立,或者判斷 HardCoderJNI 的 isConnect() 檢查 socket 是否已連線。

6)場景結束時主動呼叫 stopPerformance,傳入對應場景 startPerformance 時的返回值 hashCode 作為引數,停止本次請求。

7)測試效能,APP 可對開啟/關閉 Hardcoder 的情況做對比實驗,測試效能是否有提升。

四、向廠商申請線上許可權,具體請見常見問題;

五、釋出帶 Hardcoder 功能的 APP。

附錄: github的wiki 文件連結

Hardcoder產品方案介紹:

https://github。com/Tencent/Hardcoder/wiki/Hardcoder-產品方案介紹

Hardcoder 技術方案介紹:

https://github。com/Tencent/Hardcoder/wiki/Hardcoder-技術方案介紹

Hardcoder testapp 測試指南:

https://github。com/Tencent/Hardcoder/wiki/Hardcoder-Testapp測試指南

Hardcoder 接入指南:

https://github。com/Tencent/Hardcoder/wiki/Hardcoder-接入指南

常見問題:

https://

github。com/Tencent/Hard

coder/wiki/FAQ