- AndroidのEthernetTrackerサービスは、名前が
ethX のネットワークインターフェースしか認識しない
- LinuxのCDC Ethernetドライバーは、インターフェース名を
usbX として生成する
- このため、標準的なCDC EthernetデバイスはAndroidで自動的に有効化されない
- これを解決するには、ユーザーが自分で端末をroot化し、
config_ethernet_iface_regex の値を変更する必要がある
- 標準準拠のUSB Ethernetアダプターではなく、ベンダー固有ドライバーがある特定チップセット製品だけを使うのが現実的な方法である
序論と問題の概要
- AndroidデバイスでCDC Ethernetが動作しない主因は、インターフェースの命名規則にある
- システムとしてはUSB Ethernetアダプターをサポートしているが、Ethernetメニューが有効化される条件には制約がある
- 互換性のあるチップセット情報を得るのは難しく、実際にはユーザー間の「口コミ」に依存する構造になっている
- AndroidもLinuxカーネルベースではあるが、カーネル設定だけですべてが決まるわけではない
USBデバッグとADB設定
- Androidデバイスでは、USBデバッグを有効化したうえでADBをインストールする必要がある
- ネットワークアダプターをテストするには、ADBをWi-Fi経由のネットワークモードに切り替える必要がある
- コマンドによって現在のカーネルバージョンとアーキテクチャを確認できる
カーネルバージョンと設定の確認方法
- 新しいスマートフォン(Android 11以降)は、GKI(Generic Kernel Image)カーネル構造を持つ
- Googleが基本カーネルをビルドし、メーカーがモジュールだけを追加する方式
- そのカーネル設定ファイル(
gki_defconfig)からサポート機能を把握できる
- 古いスマートフォンでは、メーカーごとに提供されるカーネルソースから**
defconfig**ファイルを探して確認する必要がある
- 運がよければ、
/proc/config.gz から現在のカーネル設定を直接確認できることもある
対応しているUSB Ethernetアダプターの確認方法
- 関連するカーネル設定値の多くは
CONFIG_USB_NET_XXX という形式である
y なら内蔵、m ならモジュールとしてビルド(おそらく使用可能)、is not set なら未サポート
drivers/net/usb/Kconfig ファイルで各設定値の説明を参照できる
- それでも、アダプターのチップセット情報が明確に表示されるケースはまれである
CDC Ethernet(Communications Device Class)とAndroidでの適用事例
- CDCはUSBネットワーキング標準であり、EEM/ECM/NCMの各種プロトコルを提供する
- Linux、Windows、macOSでは、標準的なCDC Ethernetデバイスは追加ドライバーなしで自動認識される
- Androidでもカーネルレベルでは関連ドライバーがビルドされている
- 例:
CONFIG_USB_NET_CDCETHER、EEM、NCM がいずれも y に設定されたSamsung端末
- しかし、Ethernetメニューは依然として無効のままである
Androidのネットワークインターフェース追跡ロジック
- Androidは、ネットワークインターフェースの検出に
EthernetTracker.java クラスを使用する
EthernetTracker は新しいインターフェースが現れると、名前パターン(正規表現)のマッチングを行う
- マッチ条件はリソース(
config_ethernet_iface_regex)から取得される
- デフォルト値は
eth\\d(eth で始まり、その後に数字が続くネットワークインターフェースだけが有効)
- カーネルが生成する名前(
usb0)はこのパターンに一致しないため、追跡および有効化の対象から外れる
解決上の制約と結論
- この命名正規表現は、ユーザーが直接変更できない(root化なしでは不可能)
- 結果として、標準的なCDC Ethernet製品は接続してもネットワークメニューでは使用できない
- 逆に、ベンダーやチップセットのドライバーによって直接登録される一部のアダプターだけが利用可能である
- GoogleがEEMモジュールなど標準サポートコードをカーネルに含めていても、実際には動作しない
- 少なくとも正規表現を
(eth|usb)\\d に変えれば解決するシンプルな問題だが、現状ではそのまま放置されている
要約
- 主な原因: AndroidがCDC Ethernet標準を無視しているのではなく、ネットワークインターフェース名が正規表現(
eth\\d)に一致しないため有効化されない構造である
- 回避策: 端末をroot化したうえで
config_ethernet_iface_regex の値を (eth|usb)\\d などに変更する必要がある
- 現実的な選択: 標準USB CDC対応アダプターよりも、チップセットごとにドライバー連携が明確な製品を選ぶのが現実的な代替策である
- 構造的な問題: ユーザーから見える挙動や標準互換性の観点で、ソフトウェア上位スタックの命名ポリシー不備がシステム上の制約として作用している事例である
1件のコメント
Hacker Newsのコメント
ethXという名前を割り当てると聞いたとのこと。本人は直接テストしたり、その内容を投稿に反映したりはしておらず、最近はAndroidデバイスをほとんど使っていないとの説明。この方法はMACアドレスを制御できる場合にしか使えないという前提も追加eth\dから*に変更されたようで、その結果この問題は解決したと推測。関連コード変更リンクを提示。Android U+(おそらくバージョン14)からはデフォルトでusb\d+とeth%dの両方を含むようになったとの説明usbXインターフェースでテザリングするデバイスがあるため」ロールバックされたが、その後すぐにAndroid V+バージョン(新バージョン)のみを対象として再度反映されたとの説明。ロールバック関連リンク、最終適用リンクも添付EthernetTrackerサービスがethXと命名されたインターフェースしか認識しない点への強い批判。Linuxディストリビューションではこうした問題はすでに2000年代に解決されていたとの説明。ドライバーごとに独自の名前プレフィックスを使うことが多く、システム全体を調査しなければならない不便さがあったという回想。今日のLinuxディストリビューションではudevのようなツールでネットワークインターフェース名を自動変更し、この処理はカーネルのSIOCSIFNAMEioctl 呼び出しで動作するとの説明。最新のカーネルでは"wlan*"や"wlan%d"のような名前に自動で番号が付与される便利さまで提供されている点も補足config_ethernet_iface_regexの値を変えるには、スマホをroot化する以外に方法がない」という記事の一文に共感し、自分の所有するデバイスでroot権限が重要であるもう一つの理由だと主張ifupで失敗し、Android UIではこの状況をまったく表示できず、dmesgログを確認して初めて問題が見えるとのこと。これがCDCデバイスにも当てはまるかは不明だが、多くのUSB EthernetドングルはRealtekやKawasakiチップセット中心で、ファームウェアが必要なケースがあったという経験談。このAndroidの変更は最近のもののようだが、素のAOSPデバッグ機ではUSBネットワークドングルを問題なく使えていたため、カーネル側あるいはCDCドライバー側の命名慣行ではないかと推測。結局のところ、ドングルのチップセットとファームウェア要否には注意すべきだという助言