每天都有大量的更改提交給上游 Linux 內核。這些更改通常不會評估安全影響,但其中許多可能會影響內核的安全性。評估這些更改中的每一個的安全影響是一項昂貴且可能不可行的操作。相反,更可持續和可維護的方法是定期與上游 Linux 內核同步更改。
建議使用較新的長期支持 (LTS) 內核定期更新設備。定期 LTS 更新有助於在惡意行為者公開披露或發現之前解決潛在的未被識別的安全漏洞,例如 2019 年初的零項目報告。
先決條件
- Android 通用內核分支(來自 AOSP)
- 目標設備內核的 LTS 合併暫存分支
- 設備內核發布分支
- Git 倉庫
- 內核構建工具鏈
與 LTS 更改合併
以下步驟概述了 LTS 合併的典型步驟。
- 將目標內核發布分支反向合併到 -LTS 暫存分支
- 本地合併 linux-stable 或 Android common 到 -LTS staging 分支
- 解決合併衝突(根據需要諮詢區域/代碼所有者)
- 在本地構建並執行健全性/單元測試(請參閱下面的測試部分)
- 將 Android 常見更改上傳並合併到 LTS 暫存分支
- 使用 -LTS staging 分支進行徹底測試(請參閱下面的測試部分)
- 查看測試結果
- 解決任何回歸,根據需要平分合併
- 將 -LTS 暫存分支合併到主設備內核發布分支
- 為您的設備創建包含暫存 LTS 內核的新 Android 版本
- 使用新內核編譯發布版本/ROM
與 LTS 合併的示例。
將 android-4.9 合併到 main/master(通過 LTS staging)並結帳和同步 LTS staging 分支:
repo init -b <Device kernel LTS staging branch> # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch> # back-merge
git commit
此時最好在繼續之前將反向合併推送到您的源遠程。之後,將 Android common 合併到 LTS staging 中。
git merge -X patience android-4.9-q # LTS merge
解決合併衝突
在大多數情況下,Android 通用內核和 -LTS staging 分支之間會存在衝突。在 LTS 合併期間解決合併衝突可能具有挑戰性,因此以下是一些解決它們的有用技巧。
增量合併
如果自使用 LTS 更新設備內核以來已經過了很長時間,則很有可能自上次合併更新在上游發布以來已經有許多 (>50) 穩定版本。解決此問題的最佳方法是通過一次合併較少數量的版本(<=5 個次要版本)來慢慢趕上,同時在每個步驟中進行測試。
例如,如果設備內核版本子級別為 4.14.100,上游穩定子級別為 4.14.155,則最好以小增量進行合併,以確保可以充分審查和測試合理的更改量。
一般來說,我們發現每次合併以 <= 5 個次要版本的批次增量工作可以確保一組更易於管理的補丁。
測試
快速開機測試
要執行快速啟動測試,您必須首先在本地合併 LTS 更改並構建內核。
以下步驟說明了快速啟動測試過程。
使用 USB 電纜將目標設備連接到您的計算機,然後使用 Android 調試橋 (ADB) 將 .ko 推送到設備。
adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader
引導 dtbo 並旁加載內核映像。
fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)
檢查 /dev/kmsg 日誌是否有錯誤。
adb shell
su
cat /dev/kmsg (inspect kernel log for obvious new errors)
安卓測試
首先使用新的 LTS 內核和模塊在本地構建 -userdebug 映像。
檢查 /dev/kmsg 是否有任何錯誤,並在繼續之前確認沒有錯誤。測試以下內容以確保一切都按預期運行。
- 無線網絡速度
- 鉻瀏覽器
- 使用相機應用程序捕獲圖像和視頻
- 使用內置揚聲器和藍牙耳機播放 YouTube 視頻
- 通過運營商網絡撥打電話
- 通過 Wi-Fi 進行視頻通話
自動化測試套件
使用通過供應商測試套件(VTS) 和自動穩定性壓力測試提供的測試套件執行最終驗證以確保產品圖像不會倒退。