核心網路單元測試

自 Android 5.0 起,在 Linux 核心上正確運作 Android 網路堆疊,需要一些最近才上游提交或尚未上游提交的提交內容。手動驗證所需的核心功能或追蹤缺少的提交內容並不容易,因此 Android 團隊會分享他們使用的測試,以確保核心運作正常。

執行測試的原因

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

  1. 裝置上使用的 Linux 核心確切版本通常是裝置專屬,因此在未執行測試的情況下,很難得知任何核心是否正常運作。
  2. 將核心修補程式前端移植和後端移植至不同核心版本或不同裝置樹狀結構,可能會引發細微問題,除非執行測試,否則無法察覺。
  3. 新的網路功能可能需要新的核心功能或核心錯誤修正。

如果測試未通過,表示裝置的網路堆疊運作異常,導致使用者可見的連線錯誤 (例如 Wi-Fi 網路連線中斷)。裝置也可能無法通過 Android Compatibility Test Suite (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 供應商) 負責。我們正與原始設備製造商 (OEM) 和供應商合作,確保目前和未來的核心會為 ARCH=um SUBARCH=x86_64 編譯,且無須進行任何變更。

執行測試

測試位於 kernel/tests/net/test。建議您從 AOSP 主版本執行測試,因為這些測試是最新的;在某些情況下,在特定 Android 版本中,可讓系統正常運作的核心功能尚未在該版本中進行完整測試。如要進一步瞭解如何執行測試,請參閱 核心網路測試 README 檔案。基本上,請從核心樹狀結構頂端執行以下命令:

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

通過測試

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

貢獻

回報問題

請在 Android Issue Tracker 中,使用「Component-Networking」標籤回報任何核心網路測試問題。

記錄提交內容並新增測試

請按照上述方式回報問題,並盡可能上傳修正問題的變更內容,如果符合下列情況:

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