Activar conexión USB desde la línea de comandos

Me gustaría activar la conexión USB desde un script bash.

He encontrado TetherSettingsel nombre de la acción de

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether

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

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

¿ Hay alguna posibilidad de ejecutar una línea de comando adb shellpara cambiarlo?


Relacionado, pero al contrario: ¿Es posible deshabilitar el anclaje de USB desde la línea de comandos?

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 (aapt no encontrado). ¿Cómo puedo ver una lista de los ajustes disponibles?
¡Gracias! Encontré 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'en el teléfono, pero no apareció nada :( ¿Puede decirme dónde puedo encontrar com.android.settings.apk?

Respuestas (7)

Si su versión de Android tiene svcuna utilidad incorporada, ejecute este comando:

adb shell svc usb setFunctions rndis

Esto habilitaría la conexión USB. Para ver qué otras funciones USB están disponibles, ejecute:

adb shell svc usb
* setFunctionen primer comando
@Jortstek en la última versión de Android (versión 12), sigue siendo setFunctions. Consulte android.googlesource.com/platform/frameworks/base/+/refs/heads/… Es posible que la implementación de Android por parte del proveedor de su dispositivo haya eliminado el final sde la palabra clave.
Guau. Android 8 en el dispositivo Samsung, definitivamente no tiene la "s". En qué formas piensan para hacer tropezar a la gente.

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

  • service call connectivity 32 i32 1en Sándwich de Helado (4.0)
  • service call connectivity 33 i32 1en Jelly Bean (4.1 a 4.3)
  • service call connectivity 34 i32 1en KitKat (4.4)
  • service call connectivity 30 i32 1en Piruleta (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 1en Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1sobre Turrón (7.0)
  • service call connectivity 39 i32 1en 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).

(Consejo: 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 (habilitar conexión USB) o 0 (para deshabilitarlo).

Para obtener más información, consulte esta pregunta relacionada en Stack Overflow .


Si está habilitando el anclaje USB como parte de una configuración de anclaje inverso USB, setprop sys.usb.config rndis,adbdebería ser más que suficiente para configurar la rndis0interfaz.

Mirando la rama jb-release, int setUsbTethering(boolean enable); 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 la conectividad de llamada de servicio 33 i32 1 activa la conexión.
Esta es la respuesta correcta para USB Tethering. Sin embargo, no funcionará para WifiTethering. La API no se ha dejado abierta para eso...
Ese comando para Android M funciona bien en mi stock Android 6.0.1 en Nexus 6. Buen trabajo manteniendo una lista para múltiples versiones de Android. Ojalá pudiera votarlo de nuevo.
Confirme que el comando MM también funciona en CM13 6.0.1. ¡Gracias!
en CM14.1 (7.1) funciona el comando Jelly Bean
Para Oreo (8.0):service call connectivity 33 i32 1

Hay un método bastante malo usando 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,

adb shell input 

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

Combinando todo esto, esto me funciona si la pantalla está desbloqueada: 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.
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 (debe desbloquearse) y lo conecté a udev para hacerlo automáticamente cuando lo conecto.
@redbmk: gracias por el útil script. Para un Galaxy A5 2017, la secuencia de teclas es: ${inputKey}DPAD_DOWN; $pausa; ${clave de entrada}DPAD_DOWN; $pausa; ${clave de entrada}ENTRAR . También encontré que pause="sleep 0.3" funciona bien.
En la secuencia anterior, olvidé presionar la tecla inicial para descartar la confirmación emergente sobre la habilitación de MTP, que es ${inputKey}DPAD_DOWN; $pausa; ${clave de entrada}DPAD_DOWN; $pausa; ${clave de entrada}ENTRAR; .

Pruebe el setpropsiguiente comando:

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

Modificado para usar el comando de tiempo de espera de Windows en lugar de dormir, activar la pantalla primero y solo presionar una vez. Twice down habilitó conexión wifi 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

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

El servicemétodo no me funcionó en mi dispositivo Samsung. Sin embargo, descubrí cómo hacerlo configurando la interfaz de red directamente. Aquí hay una secuencia de comandos que configura una máquina Linux y un dispositivo Android enraizado conectado por USB para 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í .