- O serviço EthernetTracker do Android reconhece apenas interfaces de rede com nome
ethX
- O driver Linux de Ethernet CDC cria os nomes de interface como
usbX
- Por causa disso, dispositivos Ethernet CDC padrão não são ativados automaticamente no Android
- Para resolver isso, o usuário precisa fazer root no celular e alterar o valor de
config_ethernet_iface_regex
- Na prática, a forma mais realista é usar apenas produtos com chipsets específicos que tenham drivers específicos do fornecedor, em vez de adaptadores USB Ethernet padrão compatíveis com a norma
Introdução e visão geral do problema
- O motivo central de o Ethernet CDC não funcionar em dispositivos Android é a regra de nomenclatura das interfaces
- Em nível de sistema, há suporte a adaptadores USB Ethernet, mas há restrições nas condições para que o menu Ethernet seja ativado
- É difícil obter informações sobre chipsets compatíveis e, na prática, a estrutura depende de “rumores” entre usuários
- Embora o Android também seja baseado no kernel Linux, nem tudo é definido apenas pela configuração do kernel
Depuração USB e configuração do ADB
- É necessário ativar a depuração USB e instalar o ADB no dispositivo Android
- Para testar o adaptador de rede, é preciso mudar o ADB para o modo de rede via Wi‑Fi
- Por meio de comandos, é possível verificar a versão do kernel e a arquitetura atuais
Como verificar a versão e a configuração do kernel
- Telefones mais recentes (Android 11 ou superior) usam a estrutura de kernel GKI (Generic Kernel Image)
- O Google compila o kernel base, e o fabricante adiciona apenas módulos
- É possível identificar os recursos suportados no arquivo de configuração desse kernel (
gki_defconfig)
- Em telefones antigos, é preciso procurar o arquivo defconfig no código-fonte do kernel fornecido separadamente por cada fabricante
- Com sorte, também é possível verificar diretamente a configuração atual do kernel em
/proc/config.gz
Como verificar adaptadores USB Ethernet compatíveis
- A maioria dos valores de configuração relevantes do kernel tem o formato
CONFIG_USB_NET_XXX
y significa embutido, m significa compilado como módulo (provavelmente utilizável), e is not set significa sem suporte
- É possível consultar a explicação de cada valor no arquivo
drivers/net/usb/Kconfig
- Mesmo assim, ainda é raro que as informações sobre o chipset do adaptador apareçam de forma clara
Ethernet CDC (Communications Device Class) e casos de aplicação no Android
- CDC é um padrão de rede USB que oferece vários protocolos como EEM/ECM/NCM
- Em Linux, Windows e macOS, dispositivos Ethernet CDC padrão são reconhecidos automaticamente sem driver adicional
- O Android também já tem, no nível do kernel, os drivers relacionados compilados
- Exemplo: em dispositivos Samsung,
CONFIG_USB_NET_CDCETHER, EEM e NCM estão todos definidos como y
- No entanto, o menu Ethernet continua desativado
Lógica de rastreamento de interfaces de rede no Android
- O Android usa a classe
EthernetTracker.java para detectar interfaces de rede
- O
EthernetTracker faz correspondência por padrão de nome (expressão regular) quando uma nova interface aparece
- O critério de correspondência é obtido do recurso
config_ethernet_iface_regex
- O valor padrão é
eth\\d (apenas interfaces de rede que começam com eth e são seguidas por um número são consideradas válidas)
- O nome gerado pelo kernel (
usb0) não corresponde a esse padrão e, por isso, é ignorado no rastreamento e na ativação
Limitações da solução e conclusão
- Essa expressão regular de nomenclatura não pode ser alterada diretamente pelo usuário (sem root, é impossível)
- Como resultado, produtos Ethernet CDC padrão não podem ser usados no menu de rede mesmo quando conectados
- Em contrapartida, apenas alguns adaptadores registrados diretamente por drivers do fornecedor ou do chipset podem ser usados
- Mesmo que o Google inclua no kernel código de suporte padrão, como o módulo EEM, isso ainda não permite o funcionamento real
- É um problema simples que seria resolvido se a expressão regular fosse alterada ao menos para
(eth|usb)\\d, mas isso continua como está
Resumo
- Causa principal: o Android não ignora o padrão Ethernet CDC em si; a estrutura simplesmente não ativa a interface porque o nome da interface de rede não corresponde à expressão regular (
eth\\d)
- Forma de contornar: é necessário fazer root no celular e alterar o valor de
config_ethernet_iface_regex para algo como (eth|usb)\\d
- Escolha prática: em vez de adaptadores com suporte padrão a USB CDC, a alternativa mais realista é escolher produtos com integração de driver claramente definida para cada chipset
- Problema estrutural: este é um caso em que a política de nomenclatura da camada superior de software atua como limitação sistêmica em termos de visibilidade para o usuário e compatibilidade com padrões
1 comentários
Comentários do Hacker News
ethX; a pessoa não testou isso diretamente nem atualizou a postagem com essa informação, e hoje em dia quase não usa mais dispositivos Android; acrescenta ainda que esse método só serve quando é possível controlar o endereço MACeth\\dpara*, o que provavelmente resolveu o problema; também foi apresentado um link para a mudança no código; explicação de que, a partir do Android U+ (provavelmente versão 14),usb\\d+eeth%dpassaram a ser incluídos por padrãoethX; explicação de que distribuições Linux já resolveram esse problema nos anos 2000; lembrança de que antes era incômodo ter de inspecionar o sistema inteiro porque muitos drivers usavam seus próprios prefixos de nome; hoje, distribuições Linux renomeiam automaticamente interfaces de rede com ferramentas comoudev, e esse processo funciona por meio da chamadaSIOCSIFNAMEviaioctlno kernel; acrescenta que kernels modernos ainda oferecem a conveniência de numerar automaticamente nomes comowlan*ouwlan%difup, e a interface do Android não mostra nada disso — só dá para ver o problema nos logs dodmesg; não há certeza se isso também se aplica a dispositivos CDC, mas muitas dongles USB Ethernet usavam chipsets Realtek ou Kawasaki e havia casos que exigiam firmware; essa mudança no Android parece ser recente, mas em um dispositivo de depuração com AOSP vanilla a pessoa conseguiu usar bem dongles de rede USB, então suspeita que seja uma questão de convenção de nomenclatura no kernel ou no driver CDC; no fim, recomenda prestar atenção ao chipset da dongle e à necessidade de firmware