He agotado los métodos documentados de habilitación programada de la conexión USB :
-
El
service
método no funciona en mi teléfono (Samsung Note 4). Parece que es una especie de API protegida, y pinchando desdeadb
no tiene ningún efecto. -
El
shell input
no es aplicable, ya que requiere que el dispositivo esté desbloqueado, y no parece haber una forma de desbloquear de forma programada y no destructiva un dispositivo bloqueado con una huella digital.
Así que estoy estudiando la posibilidad de conseguir este objetivo "por las malas", es decir, hacer todo lo que hace el espacio de usuario de Android cuando se pulsa la casilla de anclaje USB.
Por lo que sé, esto implica los siguientes pasos (la mayoría de los cuales serían similares a cómo lo harías en una máquina Linux):
-
Establezca una conexión IP con el ordenador anfitrión a través de USB. Esto implica poner el USB en
rndis
modo, configurar rutas, asignar una IP, etc.Ya he averiguado cómo conseguirlo y he publicado la respuesta aquí .
-
Lanzar un
dnsmasq
por ejemplo, para asignar una IP al PC conectado a través de DHCP, y reenviar las solicitudes de DNS.Este paso no debería ser necesario si no necesitas la detección del servidor DNS y asignas tú mismo las IPs estáticas en las interfaces USB.
-
Activar el reenvío de IP (
/proc/sys/net/ipv4/ip_forward
). -
Preparar
iptables
para habilitar el reenvío/mascarada. -
Actualizar las tablas de enrutamiento para la contabilización del tráfico.
Me las arreglé para escribir un montón de scripts que replican exactamente los efectos visibles (descritos anteriormente) que realiza el sistema operativo Android cuando se habilita el tethering USB a través de su UI. Para crear los scripts, registré el estado del sistema ( iptables -S
, ip route show table all
) con y sin tethering, luego convertí las diferencias en comandos de shell para aplicar los cambios al sistema. Sin embargo, mis réplicas siguen siendo insuficientes; alguna parte del sistema sigue sin configurarse, lo que impide que el tráfico pase.
¿Alguien tiene alguna idea de lo que me puede faltar, o de cómo puedo acotar / depurar el problema?