内核网络单元测试

从 Android 5.0 开始,要使 Android 网络堆栈在 Linux 内核中正常运行,开发者需要集成近期才提交给上游或尚未提交给上游的多个补丁程序。手动验证需要的内核功能或跟踪缺失的补丁并不容易,因此,Android 团队打算共享他们使用的测试方案,以确保内核按预期运行。

运行测试的原因

运行这些测试的原因主要有 3 个:

  1. 设备上使用的 Linux 内核的确切版本通常是特定于设备的,如果不运行测试,就很难了解所有内核是否都能够正常工作。
  2. 将内核补丁向前移植和向后移植到不同的内核版本或不同的设备树时,可能会导致出现一些细微的问题;如果不运行测试,将很难发现这些问题。
  3. 新的网络功能可能需要新的内核功能,或需要修复内核 bug。

如果未通过测试,设备的网络栈将无法正常运作,从而导致出现用户可见的连接 bug,例如 Wi-Fi 网络断开连接。设备还可能会无法通过 Android 兼容性测试套件 (CTS) 测试。

使用测试

测试会使用 User-Mode 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 源文件包含注释,这些注释会指定通过测试所必需的已知内核提交。应该在通用内核树(所有通用内核分支 android-4.4 及更高版本,在 AOSP 的 kernel/common 项目中)中通过测试。因此,若要在内核上通过测试,只需从相应的通用内核分支不断合并。

贡献

报告问题

请使用组件-网络标签在 Android 问题跟踪器中报告内核网络测试出现的任何问题。

记录提交项并添加测试

请如上文所述报告问题;如果可能,请在发生以下情况时上传更改以修复问题:

  • 测试没有在通用内核树上通过
  • 您发现在源代码注释中没有提及某项必要的补丁
  • 需要进行重大更改才能在上游内核通过测试
  • 您认为测试是多余指定的,或者未来的内核测试会失败
  • 您希望添加更多测试或扩大现有测试的覆盖面。