Me gustaría activar la conexión USB desde un script bash.
He encontrado TetherSettings
el 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 shell
para cambiarlo?
Relacionado, pero al contrario: ¿Es posible deshabilitar el anclaje de USB desde la línea de comandos?
Si su versión de Android tiene svc
una 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
setFunction
en primer comandosetFunctions
. 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 s
de la palabra clave.Ejecutar el siguiente comando como root debería habilitar la conexión USB:
service call connectivity 32 i32 1
en Sándwich de Helado (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 Piruleta (5.0)service call connectivity 31 i32 1
en Lollipop (5.1) según una respuesta de Firelordservice call connectivity 30 i32 1
en Marshmallow (6.0), no probadoservice call connectivity 41 i32 1
en Samsung Marshmallow (6.0)service call connectivity 33 i32 1
sobre 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).
(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,adb
debería ser más que suficiente para configurar la rndis0
interfaz.
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.
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.Pruebe el setprop
siguiente comando:
setprop sys.usb.config rndis,adb
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 service
mé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í .
Jorge Profenza
aapt dump xmltree com.android.settings.apk AndroidManifest.xml
pero eso no funcionó en mi teléfono (aapt no encontrado). ¿Cómo puedo ver una lista de los ajustes disponibles?gilles quenot
Jorge Profenza
find / -name 'com.android.settings.apk'
en el teléfono, pero no apareció nada :( ¿Puede decirme dónde puedo encontrar com.android.settings.apk?