¿Es posible activar la configuración de Android "USB Tethering" desde la línea de comandos?

23

Me gustaría activar la "conexión USB" desde un script bash, entonces, ¿hay alguna posibilidad de ejecutar una línea de comando adb shellpara cambiar algunas configuraciones de Android?

Editar1 :

El siguiente comando abre la configuración necesaria pero no cambia nada solo:

am start -n com.android.settings/.TetherSettings

He encontrado el nombre de la acción TetherSettings de

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
fuente
Eso es realmente genial. Traté de encontrar otros comandos, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlpero eso no funcionó en mi teléfono (no se encontró). ¿Cómo puedo ver una lista de las configuraciones disponibles?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
¡Gracias! He encontrado aapt en la carpeta de herramientas de compilación. Puedo ejecutarlo ahora. Sin embargo, parece que no puedo encontrar com.android.settings.apk. Lo intenté: find / -name 'com.android.settings.apk'por teléfono, pero no surgió nada :( ¿Puede decirme dónde puedo encontrar com.android.settings.apk?
George Profenza

Respuestas:

14

Ejecutar el siguiente comando como root debería habilitar la conexión USB:

  • service call connectivity 32 i32 1 en Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 en Jelly Bean (4.1 a 4.3)
  • service call connectivity 34 i32 1 en KitKat (4.4)
  • service call connectivity 30 i32 1 en Lollipop (5.0)
  • service call connectivity 31 i32 1en Lollipop (5.1) según una respuesta de Firelord
  • service call connectivity 30 i32 1en Marshmallow (6.0), no probado
  • service call connectivity 41 i32 1 en Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 en turrón (7.0)
  • service call connectivity 39 i32 1 en Samsung Turrón (7.0)

El primer número que ve en los comandos es el setUsbTethering()número del método IConnectivityManager.aidl(esto depende de la versión de Android y no existe en Gingerbread).

(Sugerencia: para verificar este archivo para una versión particular de Android, seleccione la rama apropiada).

Entonces, lo que hace este comando es llamar setUsbTethering()y pasar 1 (habilite la conexión USB) o 0 (para deshabilitarlo).

Para obtener más información, consulte esta pregunta relacionada sobre Desbordamiento de pila .


Si habilita la conexión USB como parte de una configuración de conexión inversa USB, setprop sys.usb.config rndis,adbdebería ser más que suficiente para rndis0configurar la interfaz.

Léo Lam
fuente
1
Mirando la rama jb-release, int setUsbTethering (habilitación booleana); parece ser el método 33, no el 34. Además, probé los comandos 4.1 / 4.2 y 4.3 / 4.4 en un Nexus 7 con JB 4.3 y conectividad de llamadas de servicio 33 i32 1 activa la conexión.
@JoshHolland debe haber sido un error. Gracias por arreglarlo!
Léo Lam
Esta es la respuesta correcta para USBTethering. Sin embargo, no funcionará para WifiTethering. La API no se ha dejado abierta para eso ...
Kristopher
Por supuesto que no me importaría;) gracias por el enlace.
Léo Lam
1
en CM14.1 (7.1) el comando Jelly Bean funciona
christoph
7

Hay un método bastante malo que usa adb shell input tap, Obtener las coordenadas para habilitar el anclaje y sustituir

adb shell input tap <x> <y>

O navegue para habilitar la radio usando adb shell input keyevent. Solo echa un vistazo a

adb shell input 

De nuevo, esto se limita a un dispositivo en particular.

Rilwan
fuente
Combinando esto todos juntos, esto funciona para mí si se desbloquea la pantalla: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Encontré una lista de eventos clave en SO.
redbmk
1
En caso de que alguien quiera probar esto y / o modificarlo para su dispositivo, lo publicaré aquí. Escribí un pequeño script para activar el anclaje de mi nexus 5x (necesita ser desbloqueado) y lo conecté a udev para que lo haga automáticamente cuando lo
conecto
1
@redbmk: gracias por el útil script. Para un Galaxy A5 2017, la secuencia de teclas es: $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} ENTER . También encontré que pause = "sleep 0.3" funciona bien.
P.Windridge
En la secuencia anterior, me olvidé de presionar las teclas iniciales para descartar la confirmación emergente sobre habilitar MTP, que es $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} ENTER; .
P.Windridge
6

Prueba el setpropsiguiente comando:

setprop sys.usb.config rndis,adb
usuario29787
fuente
2
Esto es solo una parte de lo que se necesita. Esto no iniciará dnsmasq por ejemplo.
kroot
2

Modificado para usar el comando de tiempo de espera de Windows en lugar de dormir, activar la pantalla primero y solo presionar hacia abajo una vez. El doble de conexión Wi-Fi habilitada en mi teléfono.

adb shell input keyevent KEYCODE_WAKEUP && adb shell am start -n com.android.settings/.TetherSettings && adb shell input keyevent KEYCODE_DPAD_DOWN && adb shell input keyevent KEYCODE_ENTER && timeout 2 && adb shell input keyevent KEYCODE_BACK
idkaaa
fuente
1

El servicemétodo no funcionó para mí en mi dispositivo Samsung. Sin embargo, descubrí cómo hacerlo configurando la interfaz de red directamente. Aquí hay un script que configura una máquina Linux y un dispositivo Android rooteado conectado por USB para la conexión USB. Esto no configura el enmascaramiento de DNS o NAT, pero es suficiente para que el dispositivo sea accesible en 192.168.42.129:

#!/bin/bash
set -euo pipefail

# Set up USB tethering for an Android device.
# Usage: adb-usb-tether [USB-VENDOR USB-PRODUCT]
# If USB vendor/product is unspecified, use first USB network interface.
# On the Android side, tethering is enabled via adb shell.

if [[ $# -eq 2 ]]
then
    any=false
    vendor=$1
    product=$2
else
    any=true
fi

function find_if() {
    local path if
    for path in /sys/class/net/*
    do
        if=$(basename "$path")
        if [[ "$(readlink "$path")" == */usb* ]]
        then
            local ifproduct ifvendor
            ifproduct=$(cat "$(realpath "$path")/../../../idProduct")
            ifvendor=$(cat "$(realpath "$path")/../../../idVendor")
            if $any || [[ "$ifproduct" == "$product" && "$ifvendor" == "$vendor" ]]
            then
                echo "Found interface: $if" 1>&2
                echo "$if"
                return
            fi
        fi
    done
}

function adb_shell() {
    adb shell "$(printf " %q" "$@")"
}

function adb_su() {
    local quoted
    quoted="$(printf " %q" "$@")"
    adb shell su -c "$(printf %q "$quoted")"
}

if=$(find_if)
if [[ -z "$if" ]]
then
    echo "Requesting interface:" 1>&2
    adb_su setprop sys.usb.config rndis,adb
    echo " >> OK" 1>&2
fi

while [[ -z "$if" ]]
do
    echo "Waiting for network device..." 1>&2
    sleep 1
    if=$(find_if)
done

while ! ( ip link | grep -qF "$if" )
do
    echo "Waiting for interface..." 1>&2
    sleep 1
done

function configure_net() {
    local name="$1"
    local if="$2"
    local ip="$3"
    local table="$4"
    local cmdq="$5" # Query command
    local cmdx="$6" # Configuration command

    if ! ( "$cmdq" ip addr show dev "$if" | grep -qF 192.168.42."$ip" )
    then
        echo "Configuring $name interface address:" 1>&2
        "$cmdx" ip addr add 192.168.42."$ip"/24 dev "$if"
        echo " >> OK" 1>&2
    fi

    if ( "$cmdq" ip addr show dev "$if" | grep -qF 'state DOWN' )
    then
        echo "Bringing $name interface up:" 1>&2
        "$cmdx" ip link set dev "$if" up
        sleep 1
        echo " >> OK" 1>&2
    fi

    if ! ( "$cmdq" ip route show table "$table" | grep -qF "192.168.42.0/24 dev $if" )
    then
        echo "Configuring $name route:" 1>&2
        "$cmdx" ip route add table "$table" 192.168.42.0/24 dev "$if"
        echo " >> OK" 1>&2
    fi
}

configure_net local  "$if"   128 main  command   sudo
configure_net device rndis0  129 local adb_shell adb_su

Para habilitar el reenvío (es decir, conectarse a Internet desde la PC a través del dispositivo Android), vea mi pregunta y respuesta aquí .

Vladimir Panteleev
fuente
0

esto es independiente del dispositivo (alterna la conexión USB)

adb shell am start -n com.android.settings/.TetherSettings && adb shell input keyevent 20 && adb shell input keyevent 20 && adb shell input keyevent KEYCODE_ENTER && sleep 2 && adb shell input keyevent 4
Zibri
fuente