È possibile attivare l'impostazione Android “USB Tethering” dalla riga di comando?


23

Vorrei attivare il "tethering USB" all'interno di uno script bash, quindi esiste la possibilità di eseguire una riga di comando adb shellper modificare alcune impostazioni di Android?

Modifica1 :

Il seguente comando apre le impostazioni necessarie ma non cambia nulla da solo:

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

Ho trovato il nome dell'azione TetherSettings da

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

È davvero fantastico. Ho provato a trovare altri comandi, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlma non ha funzionato sul mio telefono (aapt non trovato). Come posso visualizzare un elenco delle impostazioni disponibili?
George Profenza,


Grazie! Ho trovato aapt nella cartella build-tools. Posso eseguirlo ora. Non riesco a trovare com.android.settings.apk però. Ci ho provato: find / -name 'com.android.settings.apk'al telefono, ma non è
emerso

Risposte:


14

L'esecuzione del comando seguente come root dovrebbe abilitare il tethering USB:

  • service call connectivity 32 i32 1 on Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 su Jelly Bean (da 4.1 a 4.3)
  • service call connectivity 34 i32 1 su KitKat (4.4)
  • service call connectivity 30 i32 1 su Lollipop (5.0)
  • service call connectivity 31 i32 1su Lollipop (5.1) secondo una risposta di Firelord
  • service call connectivity 30 i32 1su Marshmallow (6.0), non testato
  • service call connectivity 41 i32 1 su Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 su Torrone (7.0)
  • service call connectivity 39 i32 1 su Samsung Nougat (7.0)

Il primo numero che vedi nei comandi è il setUsbTethering()numero del metodo in IConnectivityManager.aidl(dipende dalla versione di Android e non esiste su Gingerbread).

(Suggerimento: per controllare questo file per una particolare versione di Android, selezionare il ramo appropriato.)

Quindi, ciò che fa questo comando è chiamare setUsbTethering()e passare 1 (abilitare il tethering USB) o 0 (per disabilitarlo).

Per ulteriori informazioni, vedere questa domanda correlata su StackTranslate.it .


Se si abilita il tethering USB come parte di una configurazione di tethering inverso USB, setprop sys.usb.config rndis,adbdovrebbe essere più che sufficiente per rndis0configurare l' interfaccia.


1
Osservando il ramo di rilascio jb, int setUsbTethering (abilitazione booleana); sembra essere il 33 ° metodo, non il 34 °. Inoltre, ho testato entrambi i comandi 4.1 / 4.2 e 4.3 / 4.4 su un Nexus 7 con JB 4.3 e la connettività per chiamate di servizio 33 i32 1 attiva il tethering.

@JoshHolland deve essere stato un errore. Grazie per averlo riparato!
Léo Lam,

Questa è la risposta giusta per USBTethering. Tuttavia, non funzionerà per WifiTethering. L'API non è stata lasciata aperta per questo ...
Kristopher,

Ovviamente non mi dispiacerebbe;) grazie per il link.
Léo Lam,

1
su CM14.1 (7.1) il comando Jelly Bean funziona
christoph

7

Esiste un metodo piuttosto scadente utilizzando adb shell input tap, Ottieni le coordinate per abilitare il tethering e il sostituto

adb shell input tap <x> <y>

O navigare per abilitare la radio usando adb shell input keyevent. Dai un'occhiata a

adb shell input 

Ancora una volta ciò si limita a un dispositivo particolare.


Combinando questo tutti insieme, questo funziona per me se lo schermo è sbloccato: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Ho trovato un elenco di eventi chiave su SO.
Redbmk

1
Nel caso in cui qualcuno voglia testarlo e / o modificarlo per il proprio dispositivo, lo posterò qui. Ho scritto una piccola sceneggiatura per attivare il tethering per il mio Nexus 5x (deve essere sbloccato) e l'ho collegato a udev per farlo automaticamente quando lo collego
redbmk,

1
@redbmk - grazie per l'utile script. Per un Galaxy A5 2017 la sequenza di tasti è: $ {inputKey} DPAD_DOWN; $ pausa; $ {} InputKey DPAD_DOWN; $ pausa; $ {inputKey} INVIO . Inoltre ho scoperto che pause = "sleep 0.3" funziona bene.
P.Windridge,

Nella sequenza sopra avevo dimenticato il tasto iniziale premuto per chiudere la conferma pop-up sull'abilitazione dell'MTP, che è $ {inputKey} DPAD_DOWN; $ pausa; $ {} InputKey DPAD_DOWN; $ pausa; $ {} InputKey ENTER; .
P.Windridge,

6

Prova il setpropcomando seguente:

setprop sys.usb.config rndis,adb

2
Questa è solo una parte di ciò che è necessario. Questo non avvierà dnsmasq per esempio.
Kroot

2

Modificato per utilizzare il comando di timeout di Windows invece di sospensione, attivare prima la schermata e premere una volta sola. Due volte abilitato il tethering wifi sul mio telefono.

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

1

Il servicemetodo non ha funzionato per me sul mio dispositivo Samsung. Tuttavia, ho capito come farlo configurando direttamente l'interfaccia di rete. Ecco uno script che configura una macchina Linux e un dispositivo Android rooted connesso USB per il tethering USB. Questo non imposta il mascheramento DNS o NAT, ma è sufficiente per rendere accessibile il dispositivo in 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

Per abilitare l'inoltro (ovvero connettersi a Internet dal PC tramite il dispositivo Android), vedere la mia domanda e la risposta qui .


0

questo è indipendente dal dispositivo (attiva / disattiva il 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.