核心網路單元測試

自 Android 5.0 起,Linux 核心上的 Android 網路堆疊必須有許多相對較新或尚未上游的提交內容,才能正常運作。手動驗證必要核心功能或追蹤缺少的提交內容並不容易,因此 Android 團隊會分享他們用來確保核心運作正常的測試。

執行測試的原因

我們之所以進行這些測試,主要有三個原因:

  1. 裝置使用的 Linux 核心確切版本通常因裝置而異,且不執行測試就難以判斷核心是否正常運作。
  2. 將核心修補程式轉移到不同核心版本或不同裝置樹狀結構時,可能會產生細微問題,如果不執行測試,就無法發現這些問題。
  3. 新的網路功能可能需要新的核心功能或修正核心錯誤。

如果測試未通過,裝置的網路堆疊行為不正確,就會導致使用者可見的連線錯誤 (例如 Wi-Fi 網路中斷)。裝置可能也會無法通過 Android 相容性測試套件 (CTS) 測試。

使用測試

測試會使用 User-Mode Linux,在 Linux 主體機器上以程序的形式啟動核心。請參閱「建立建構環境」,瞭解適用的作業系統版本。單元測試架構會使用適當的磁碟映像檔啟動核心,並從主機檔案系統執行測試。測試以 Python 編寫,並使用 TAP 介面來練習核心行為和 Socket API。

編譯 ARCH=um 的核心

如要執行測試,核心必須為 ARCH=um SUBARCH=x86_64 編譯。無論是上游或常見的 Android 核心樹狀結構 (例如 android-4.4),都支援這個架構。但有時裝置核心不會在這個模式下編譯,因為裝置樹狀結構在常見檔案中含有裝置專屬或硬體專屬的程式碼 (例如 sys/exit.c)。

在許多情況下,只要確保硬體專屬程式碼位於 #ifdef 後方即可。通常這應該是設定選項上的 #ifdef,可控制與程式碼相關的特定功能。如果沒有這類設定選項,請將硬體專屬程式碼放在 #ifndef CONFIG_UML 區塊內。

一般來說,修正這個問題應由核心樹狀結構供應商 (例如晶片組或 SoC 供應商) 負責。我們正與原始設備製造商和供應商合作,確保目前和未來的核心都能編譯 ARCH=um SUBARCH=x86_64,且不需要進行任何變更。

執行測試

測試位於 kernel/tests/net/test。建議從 AOSP 主線執行測試,因為這些測試是最新版本;在某些情況下,特定 Android 版本正常運作所需的 Kernel 功能,在該版本中尚未完全涵蓋測試。如要瞭解如何執行測試,請參閱核心網路測試 README 檔案。基本上,從核心樹狀結構頂端執行:

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

通過測試

核心網路測試 Python 來源檔案包含註解,指定已知通過測試所需的核心提交內容。測試應會在常見的 Kernel 樹狀結構中通過,包括 AOSP 專案中的所有常見 Kernel 分支 android-4.4 以上版本。kernel/common因此,只要持續從對應的通用核心分支合併,即可通過核心測試。

捐款

回報問題

如要回報核心網路測試的任何問題,請前往 Android Issue Tracker,並加上 Component-Networking 標籤。

記錄提交內容並新增測試

如有下列狀況,請按上述方法回報問題,並盡可能上傳變更來修正問題:

  • 測試未通過常見核心樹狀結構
  • 您發現來源註解中未提及的必要提交內容,
  • 須進行重大變更才能讓測試在上游核心通過
  • 您認為測試過於詳細,或測試會在未來的核心上失敗
  • 您想為現有測試新增更多測試或擴大涵蓋範圍。