カーネル ネットワーク ユニットのテスト

Android 5.0 以降、Linux カーネルの Android ネットワーク スタックを正しく動作させるには、比較的最近アップストリームになった commit や、まだアップストリームになっていない commit が必要になっています。必要なカーネル機能を手作業で確認したり、欠けている commit を追い掛けたりすることは容易ではありません。このため、Android チームは、カーネルが想定どおりに動作しているかどうかの確認に使用するテストを共有しています。

テストを実施する理由

このテストは、主に 3 つの理由で実施します。

  1. 通常、デバイスで使用される Linux カーネルの正確なバージョンはデバイス固有であるため、テストを実行しなければカーネルが正常に動作するかどうかはわかりません。
  2. カーネルパッチを別のカーネル バージョンや別のデバイスツリーにフォワード ポートまたはバックポートすると、テストを実行しなければ見つけられない微妙な問題が発生する場合があります。
  3. 新しいネットワーク機能では、新しいカーネル機能やカーネルのバグ修正が必要になる場合があります。

テストに合格しない場合、デバイスのネットワーク スタックが正しく動作せず、Wi-Fi ネットワークの切断など、ユーザーの目に見える接続に関する不具合が発生します。そのデバイスは、Android 互換性テストスイート(CTS)のテストでも不合格になる可能性が高くなります。

テストを使用する

このテストでは、User-Mode Linux を使用して、Linux ホストマシン上のプロセスとしてカーネルを起動します。オペレーティング システムの適切なバージョンについては、ビルド環境の構築をご覧ください。ユニットテスト フレームワークは、適切なディスク イメージでカーネルを起動し、ホスト ファイルシステムからテストを実行します。テストは Python で作成されており、TAP インターフェースを使用してカーネルの動作やソケット API をテストします。

ARCH=um でカーネルをコンパイルする

テストを実行するには、カーネルを ARCH=um SUBARCH=x86_64 でコンパイルする必要があります。このアーキテクチャは、アップストリームと、android-4.4 などの共通 Android カーネルツリーでサポートされています。ただし、デバイスツリーの共通ファイル(sys/exit.c など)にデバイス固有のコードやハードウェア固有のコードが含まれているために、このモードではデバイス カーネルをコンパイルできないことがあります。

多くの場合は、ハードウェア固有のコードを #ifdef で囲むようにすれば十分です。これは通常、そのコードに関連する特定の機能を制御する設定オプションの #ifdef です。このような設定オプションがない場合は、ハードウェア固有のコードを #ifndef CONFIG_UML ブロックの内側に入れてください。

一般に、この修正はカーネルツリー プロバイダ(チップセットや SoC のベンダーなど)の責任で行う必要があります。Google は 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 ソースファイルには、テストの合格に必要なカーネル commit の詳細についてのコメントが含まれています。AOSP の kernel/common プロジェクトにある共通カーネルツリー(すべての共通カーネル ブランチ android-4.4 以上)内では、このテストに合格するはずです。したがって、あるカーネルでテストに合格するかどうかは、対応する共通カーネル ブランチから継続的にマージしているかどうかの問題です。

Android の改善に貢献する

問題の報告

カーネル ネットワーク テストについて問題があれば、Component-Networking のラベルを付けて Android Issue Tracker に報告してください。

commit のドキュメント化とテストの追加

以下の場合、上記のように問題を報告して、可能であれば、その問題を修正する変更をアップロードしてください。

  • 共通カーネルツリーがテストに合格しない場合。
  • 必要な commit がソースコメントに記載されていないことに気付いた場合。
  • アップストリーム カーネルでテストに合格するために大きな変更が必要な場合。
  • テストの条件が厳しすぎる、または将来のカーネルでテストが不合格になると考えられる場合。
  • 既存のテストにテストを追加したり、既存のテストの範囲を広げたりしたい場合。