커널 네트워크 단위 테스트

Android 5.0 이후로 Android 네트워킹 스택이 Linux 커널에서 제대로 작동하려면 비교적 최근에 업스트림되었거나 아직 업스트림으로 만들지 않은 커밋이 여러 개 필요합니다. 필요한 커널 기능을 수동으로 확인하거나 누락된 커밋을 추적하는 것은 쉽지 않습니다. 따라서 Android 팀은 커널이 예상대로 작동하는지 확인하기 위해 사용하는 테스트를 공유합니다.

테스트를 실행하는 이유

이러한 테스트를 하는 주된 이유는 다음과 같이 3가지입니다.

  1. 기기에서 사용되는 Linux 커널의 정확한 버전은 일반적으로 기기에 따라 다르며 테스트를 실행하지 않고 커널이 제대로 작동하는지 알기 어렵습니다.
  2. 커널 패치를 다른 커널 버전이나 다른 기기 트리로 포워드 포팅하거나 백 포팅하면 테스트를 실행하지 않으면 찾을 수 없는 미묘한 문제가 발생할 수 있습니다.
  3. 새로운 네트워킹 기능에는 새로운 커널 기능이나 커널 버그 수정이 필요할 수 있습니다.

테스트를 통과하지 못한 경우 기기의 네트워크 스택이 제대로 작동하지 않아 Wi-Fi 네트워크 연결 해제와 같이 사용자의 육안으로 확인 가능한 연결 버그가 발생합니다. 또한 이러한 기기는 Android 호환성 테스트 도구 모음(CTS) 테스트에도 실패할 수 있습니다.

테스트 사용하기

이 테스트는 사용자 모드 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 마스터에서 실행하는 것이 좋습니다. 일부의 경우 지정된 Android 버전의 적절한 작업을 위해 필요한 커널 기능은 아직 지정된 버전의 전체 테스트 범위에 속하지 않습니다. 테스트를 실행하는 자세한 방법은 커널 네트워크 테스트 README 파일을 참조하세요. 기본적으로 커널 트리의 맨 위에서 다음을 실행합니다.

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

테스트 통과

커널 네트워크 테스트 Python 소스 파일에는 테스트를 통과하는 데 필요한 것으로 알려진 커널 커밋을 지정하는 주석이 포함되어 있습니다. AOSP의 kernel/common 프로젝트에 있는 일반 커널 트리(모든 일반 커널 분기 android-4.4 이상)에서 테스트를 통과해야 합니다. 따라서 커널에서 테스트를 통과하는 것은 간단히 말해 대응되는 일반 커널 분기에서 계속 병합하는 것입니다.

기여

문제 보고

커널 네트워크 테스트와 관련된 모든 문제는 Android Issue TrackerComponent-Network 라벨을 사용하여 보고해 주세요.

커밋 문서화 및 테스트 추가

위에서 설명한 대로 문제를 보고해 주시고 다음과 같은 경우에는 가능하면 문제를 수정할 수 있도록 변경사항을 업로드해 주세요.

  • 공통 커널 트리에서 테스트에 통과하지 못한 경우
  • 소스 주석에 언급되지 않았지만 필요한 커밋을 찾은 경우
  • 업스트림 커널에 테스트를 통과하려면 큰 변화가 필요한 경우
  • 테스트가 너무 상세하게 지정되어 있거나 향후 커널에서 테스트에 실패하겠다고 생각되는 경우
  • 기존 테스트에 테스트를 추가하거나 범위를 넓히려는 경우