內核網絡單元測試

自 Android 5.0 起,Android 網路堆疊在 Linux 核心上的正確運作需要大量最近上游或尚未上游的提交。手動驗證所需的核心功能或追蹤缺少的提交並不容易,因此 Android 團隊正在共享其用於確保核心按預期運行的測試。

為什麼要運行測試?

這些測試的存在有以下三個主要原因:

  1. 設備上使用的 Linux 核心的確切版本通常是特定於設備的,並且在不運行測試的情況下很難知道任何核心是否能夠正常工作。
  2. 將核心修補程式向前移植和向後移植到不同的核心版本或不同的裝置樹可能會引入微妙的問題,如果不執行測試就無法發現這些問題。
  3. 新的網路功能可能需要新的核心功能或核心錯誤修復。

如果測試未通過,裝置的網路堆疊將表現不正確,導致使用者可見的連線錯誤(例如從 Wi-Fi 網路脫落)。該設備也可能無法通過 Android 相容性測試套件 (CTS) 測試。

使用測試

測試使用使用者模式 Linux將核心作為 Linux 主機上的進程啟動。請參閱建立建置環境以了解合適的作業系統版本。單元測試框架使用適當的磁碟映像啟動內核,並從主機檔案系統執行測試。這些測試是用 Python 編寫的,並使用 TAP 介面來測試核心行為和套接字 API。

為 ARCH=um 編譯內核

為了執行測試,核心必須針對ARCH=um SUBARCH=x86_64進行編譯。這是上游和常見 Android 核心樹(例如android-4.4 )中受支援的架構。但有時裝置核心不會在此模式下編譯,因為裝置樹在公用檔案(例如sys/exit.c )中包含特定於裝置或特定於硬體的程式碼。

在許多情況下,確保特定於硬體的程式碼位於#ifdef後面就足夠了。通常,這應該是配置選項上的#ifdef ,用於控制與程式碼相關的特定功能。如果沒有這樣的設定選項,請將特定於硬體的程式碼放入#ifndef CONFIG_UML區塊中。

一般來說,解決這個問題應該是內核樹提供者(例如晶片組或 SoC 供應商)的責任。我們正在與 OEM 和供應商合作,確保當前和未來的核心將針對ARCH=um SUBARCH=x86_64進行編譯,而無需進行任何更改。

運行測試

測試位於kernel/tests/net/test 。建議從 AOSP main 執行測試,因為它們是最新的;在某些情況下,給定 Android 版本中正常運作所需的核心功能尚未在給定版本中進行完整的測試覆蓋。有關如何運行測試的信息,請參閱內核網路測試自述文件。基本上,從內核樹的頂部運行:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

通過測試

核心網路測試 Python 原始檔包含指定已知通過測試所需的核心提交的註解。測試應該在 AOSP 中的kernel/common專案中的公共核心樹(所有公共核心分支android-4.4及更高版本)中通過。因此,通過內核測試只需從相應的公共內核分支不斷合併即可。

貢獻

報告問題

請使用組件網路標籤在Android 問題追蹤器中報告內核網路測試的任何問題。

記錄提交並新增測試

請按照上述方式報告問題,並在可能的情況下上傳變更以解決問題,如果:

  • 測試未通過通用內核樹
  • 您發現來源註釋中未提及的必要提交,
  • 讓測試在上游核心上通過需要進行重大更改
  • 您認為測試過度指定,或測試在未來的核心上失敗
  • 您想要新增更多測試或對現有測試新增更多覆蓋範圍。