內核網絡單元測試

從 Android 5.0 開始,在 Linux 內核上正確運行 Android 網絡堆棧需要一些提交,這些提交是相對較新的或尚未提交的。手動驗證所需的內核功能或跟踪丟失的提交並不容易,因此 Android 團隊正在共享其用於確保內核按預期運行的測試。

為什麼要運行測試?

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

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

如果測試未通過,設備的網絡堆棧將運行不正確,從而導致用戶可見的連接錯誤(例如從 Wi-Fi 網絡掉線)。該設備也可能無法通過 Android 兼容性測試套件 (CTS) 測試。

使用測試

測試使用用戶模式 Linux將內核作為 Linux 主機上的進程啟動。有關合適的操作系統版本,請參閱建立構建環境。單元測試框架使用適當的磁盤映像引導內核並從主機文件系統運行測試。這些測試是用 Python 2.x 編寫的,並使用 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 master 運行測試,因為它們是最新的;在某些情況下,在給定 Android 版本中正常運行所必需的內核功能在給定版本中尚未具有完整的測試覆蓋率。有關如何運行測試的信息,請參閱內核網絡測試 README 文件。基本上,從內核樹的頂部運行:

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

通過測試

內核網絡測試 Python 源文件包含指定已知通過測試所需的內核提交的註釋。測試應在 AOSP 的kernel/common項目中通過公共內核樹 - 所有公共內核分支android-4.4及更高版本。因此,在內核上通過測試只是從相應的公共內核分支不斷合併的問題。

貢獻

報告問題

請在帶有組件網絡標籤的Android 問題跟踪器中報告內核網絡測試的任何問題。

記錄提交和添加測試

請如上所述報告問題,如果可能,請上傳更改以解決問題,如果:

  • 測試不會通過常見的內核樹
  • 您找到了源註釋中未提及的必要提交,
  • 讓測試通過上游內核需要進行重大更改
  • 您認為測試被過度指定,或者測試在未來的內核上失敗
  • 您想為現有測試添加更多測試或更多覆蓋。