É possível ativar a configuração do Android "USB Tethering" na linha de comando?

23

Gostaria de ativar o "tethering USB" a partir de um script bash, então existe a possibilidade de executar uma linha de comando adb shellpara alterar algumas configurações do Android?

Edit1 :

O comando a seguir abre as configurações necessárias, mas não altera nada sozinho:

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

Encontrei o nome da ação TetherSettings de

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
fonte
Isso é muito legal. Tentei encontrar outros comandos, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlmas isso não funcionou no meu telefone (aapt não encontrado). Como posso ver uma lista das configurações disponíveis?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
Obrigado! Encontrei o aapt na pasta de ferramentas de construção. Eu posso executá-lo agora. Não consigo encontrar com.android.settings.apk embora. Eu tentei: find / -name 'com.android.settings.apk'no telefone, mas nada veio :( Você pode por favor deixe-me saber onde posso encontrar com.android.settings.apk?
George Profenza

Respostas:

14

A execução do seguinte comando como root deve ativar o tethering USB:

  • service call connectivity 32 i32 1 em Sanduíche de Sorvete (4.0)
  • service call connectivity 33 i32 1 no Jelly Bean (4.1 a 4.3)
  • service call connectivity 34 i32 1 no KitKat (4.4)
  • service call connectivity 30 i32 1 em pirulito (5.0)
  • service call connectivity 31 i32 1no pirulito (5.1) de acordo com uma resposta do Firelord
  • service call connectivity 30 i32 1no Marshmallow (6.0), não testado
  • service call connectivity 41 i32 1 no Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 em Nougat (7.0)
  • service call connectivity 39 i32 1 no Samsung Nougat (7.0)

O primeiro número que você vê nos comandos é o setUsbTethering()número do método IConnectivityManager.aidl(isso depende da versão do Android e não existe no Gingerbread).

(Dica: para verificar se esse arquivo possui uma versão específica do Android, selecione a ramificação apropriada.)

Portanto, o que esse comando faz é chamar setUsbTethering()e passar 1 (ativar o tethering USB) ou 0 (para desativá-lo).

Para obter mais informações, consulte esta pergunta relacionada no Stack Overflow .


Se você estiver ativando o tethering USB como parte de uma configuração de tethering reverso USB, setprop sys.usb.config rndis,adbdeve ser mais do que suficiente para rndis0configurar a interface.

Léo Lam
fonte
1
Observando o ramo jb-release, int setUsbTethering (ativação booleana); parece ser o 33º método, não o 34º. Além disso, testei os comandos 4.1 / 4.2 e 4.3 / 4.4 em um Nexus 7 com JB 4.3 e conectividade de chamada de serviço 33 i32 1 ativa o tethering.
@ JoshHolland deve ter sido um erro. Obrigado por corrigi-lo!
Léo Lam
Esta é a resposta certa para USBTethering. Porém, não funcionará para WifiTethering. A API não foi deixado aberto para que ...
Kristopher
Claro que não me importaria;) obrigado pelo link.
Léo Lam
1
em CM14.1 (7.1), o comando Jelly Bean funciona #
christoph
7

Existe um método bastante ruim de usar adb shell input tap, obter as coordenadas para ativar o tethering e substituir

adb shell input tap <x> <y>

Ou navegue para ativar o rádio usando adb shell input keyevent. Basta dar uma olhada,

adb shell input 

Novamente, isso se limita a um dispositivo específico.

Rilwan
fonte
Combinando tudo isso junto, isso funciona para mim se a tela é desbloqueado: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Encontrei uma lista dos principais eventos no SO.
Redbmk
1
Caso alguém queira testá-lo e / ou modificá-lo para o dispositivo deles, postarei aqui. Eu escrevi um pequeno script para ligar tethering para o meu Nexus 5x (precisa ser desbloqueado) e conectei ao udev para fazer isso automaticamente quando eu ligá-lo
redbmk
1
@redbmk - obrigado pelo script útil. Para um Galaxy A5 2017, a sequência de teclas é: $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} ENTER . Também achei que pause = "sleep 0.3" funciona ok.
P.Windridge
Na sequência acima, esqueci as teclas pressionadas para ignorar a confirmação pop-up sobre a ativação do MTP, que é $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} DPAD_DOWN; $ pausa; $ {inputKey} ENTER; .
P.Windridge
6

Experimente o setpropcomando abaixo:

setprop sys.usb.config rndis,adb
user29787
fonte
2
Isso é apenas parte do que é necessário. Isso não iniciará o dnsmasq, por exemplo.
Kroot
2

Modificado para usar o comando timeout do Windows em vez de suspensão, ative a tela primeiro e pressione apenas uma vez. Duas vezes ativada a conexão wifi no meu telefone.

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
fonte
1

O servicemétodo não funcionou para mim no meu dispositivo Samsung. Eu descobri como fazê-lo, configurando a interface de rede diretamente, no entanto. Aqui está um script que configura uma máquina Linux e um dispositivo Android com raiz USB conectado para compartilhamento USB. Isso não configura o mascaramento de DNS ou NAT, mas é suficiente para tornar o dispositivo acessível em 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 ativar o encaminhamento (por exemplo, conectar-se à Internet a partir do PC através do dispositivo Android), consulte minha pergunta e resposta aqui .

Vladimir Panteleev
fonte
0

isso é independente do dispositivo (alterna o tethering 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
fonte