안드로이드에서 CDC 이더넷을 사용할 수 없는 이유 (2023)

1 week ago 5

  • 안드로이드의 EthernetTracker 서비스는 이름이 ethX인 네트워크 인터페이스만 인식함
  • Linux의 CDC 이더넷 드라이버는 인터페이스 이름을 usbX로 생성
  • 이로 인해, 표준 CDC 이더넷 장치는 안드로이드에서 자동으로 활성화되지 않음
  • 이를 해결하려면 사용자가 직접 폰을 루팅하고 config_ethernet_iface_regex 값을 변경해야 가능함
  • 표준을 따르는 USB 이더넷 어댑터가 아니라, 벤더 특화 드라이버가 있는 특정 칩셋 제품만 사용하는 것이 현실적 방법임

서론 및 문제 개요

  • 안드로이드 기기에서 CDC Ethernet이 작동하지 않는 핵심 원인은 인터페이스 네이밍 규칙 때문임
  • 시스템적으로는 USB 이더넷 어댑터를 지원하지만, Ethernet 메뉴가 활성화되는 조건에는 제약이 있음
  • 호환 가능한 칩셋 정보를 얻기 어렵고, 실질적으로는 사용자 간 "소문"에 의존하는 구조임
  • 안드로이드도 리눅스 커널 기반이지만, 커널 설정만으로 모든 것이 결정되진 않음

USB 디버깅 및 ADB 설정

  • 안드로이드 기기에서 USB 디버깅 활성화 후 ADB 설치 필요
  • 네트워크 어댑터를 테스트하려면, ADB를 Wi-Fi를 통한 네트워크 모드로 전환해야 함
  • 커맨드를 통해 현재 커널 버전과 아키텍처를 확인 가능

커널 버전 및 설정 확인 방법

  • 최신 폰(Android 11 이상)은 GKI(Generic Kernel Image) 커널 구조를 가짐
    • Google이 기본 커널을 빌드하고, 제조사가 모듈만 추가하는 방식
    • 해당 커널 설정 파일(gki_defconfig)에서 지원 기능을 파악 가능
  • 구형 폰은 제조사별로 따로 제공하는 커널 소스에서 defconfig 파일을 찾아 확인해야 함
  • 운이 좋다면, /proc/config.gz 경로에서 현재 커널의 설정을 직접 확인할 수도 있음

지원되는 USB 이더넷 어댑터 확인법

  • 대부분의 관련 커널 설정값은 CONFIG_USB_NET_XXX 형태임
    • y이면 내장, m이면 모듈로 빌드(아마도 사용 가능함), is not set이면 지원 안 함
  • drivers/net/usb/Kconfig 파일에서 각 설정값 설명을 참고 가능
  • 어댑터 칩셋 정보는 여전히 명확히 표시되는 경우가 드묾

CDC 이더넷(Communications Device Class) 및 안드로이드 적용 사례

  • CDC는 USB 네트워킹 표준으로, EEM/ECM/NCM 다양한 프로토콜을 제공
  • Linux, Windows, macOS에서 표준 CDC 이더넷 장치는 별도 드라이버 없이 자동 인식
  • 안드로이드 역시 커널 레벨에서는 관련 드라이버 빌드가 되어 있음
    • 예시: CONFIG_USB_NET_CDCETHER, EEM, NCM 모두 y로 설정된 삼성 기기
  • 그러나, 이더넷 메뉴는 여전히 비활성화

안드로이드의 네트워크 인터페이스 추적 로직

  • 안드로이드는 네트워크 인터페이스 탐지에 EthernetTracker.java 클래스를 사용
  • EthernetTracker는 새 인터페이스가 등장할 때 이름 패턴(정규표현식) 매칭을 수행함
  • 매칭 기준은 리소스(config_ethernet_iface_regex)에서 가져옴
    • 기본값은 eth\d (eth로 시작하고 숫자가 뒤에 오는 네트워크 인터페이스만 유효)
  • 커널이 생성하는 이름(usb0)은 해당 패턴에 부합하지 않아 추적 및 활성화에서 무시

해결 제한 및 결론

  • 이 네이밍 정규표현식은 사용자가 직접 변경 불가(루팅 없이 불가능)
  • 결과적으로 표준 CDC 이더넷 제품은 연결되어도 네트워크 메뉴에서 사용할 수 없음
  • 반대로, 벤더나 칩셋 드라이버로 직접 등록되는 일부 어댑터만 사용 가능
  • Google이 EEM 모듈 등 표준 지원 코드를 커널에 포함하더라도, 실제 동작은 불가함
  • 최소한 (eth|usb)\d로 정규표현식을 바꾸면 해결될 심플한 문제지만, 현재는 그대로 남아 있음

요약

  • 핵심 원인: 안드로이드가 CDC 이더넷 표준을 무시하는 것이 아니라, 네트워크 인터페이스 이름이 정규표현식(eth\d)과 일치하지 않아 활성화되지 않는 구조임
  • 우회 방법: 폰을 루팅한 후 config_ethernet_iface_regex 값을 (eth|usb)\d 등으로 변경해야 가능함
  • 실제 선택: 표준 USB CDC 지원 어댑터보다는, 칩셋별로 드라이버 연동이 명확한 제품을 선택하는 것이 현실적인 대안임
  • 구조적 문제: 사용자 가시성 및 표준 호환성 측면에서 소프트웨어 상위 스택의 네이밍 정책 미비가 시스템적 한계로 작용하는 사례임

Read Entire Article