Ist es möglich, die Android-Einstellung „USB Tethering“ über die Befehlszeile zu aktivieren?

23

Ich möchte "USB-Tethering" über ein Bash-Skript aktivieren. Gibt es also eine Möglichkeit, eine Befehlszeile mit auszuführen adb shell, um einige Android-Einstellungen zu ändern?

Edit1 :

Der folgende Befehl öffnet die erforderlichen Einstellungen, ändert aber nichts:

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

Ich habe den Aktionsnamen TetherSettings von gefunden

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
quelle
Das ist wirklich cool. Ich habe versucht, andere Befehle zu finden, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlaber das hat auf meinem Telefon nicht funktioniert (aapt nicht gefunden). Wie kann ich eine Liste der verfügbaren Einstellungen sehen?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
Vielen Dank! Ich habe aapt im Build-Tools-Ordner gefunden. Ich kann es jetzt ausführen. Ich kann com.android.settings.apk jedoch nicht finden. Ich habe versucht: find / -name 'com.android.settings.apk'am Telefon, aber nichts kam :( Können Sie mich bitte wissen lassen, wo ich com.android.settings.apk finden kann?
George Profenza

Antworten:

14

Wenn Sie den folgenden Befehl als root ausführen, sollte das USB-Tethering aktiviert sein:

  • service call connectivity 32 i32 1 auf Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 auf Jelly Bean (4,1 bis 4,3)
  • service call connectivity 34 i32 1 auf KitKat (4.4)
  • service call connectivity 30 i32 1 auf Lutscher (5.0)
  • service call connectivity 31 i32 1auf Lollipop (5.1) nach einer Antwort von Firelord
  • service call connectivity 30 i32 1auf Marshmallow (6.0), ungetestet
  • service call connectivity 41 i32 1 auf Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 auf Nougat (7.0)
  • service call connectivity 39 i32 1 auf Samsung Nougat (7.0)

Die erste Zahl, die Sie in den Befehlen sehen, ist die setUsbTethering()Nummer der Methode in IConnectivityManager.aidl(dies hängt von der Android-Version ab und ist in Gingerbread nicht vorhanden).

(Tipp: Um diese Datei auf eine bestimmte Android-Version zu überprüfen, wählen Sie den entsprechenden Zweig aus.)

Mit diesem Befehl wird also setUsbTethering()entweder 1 (USB-Tethering aktivieren) oder 0 (zum Deaktivieren) aufgerufen und übergeben.

Weitere Informationen finden Sie in dieser verwandten Frage zum Stapelüberlauf .


Wenn Sie USB-Tethering als Teil eines USB-Reverse-Tethering-Setups aktivieren, setprop sys.usb.config rndis,adbsollte dies mehr als ausreichend sein, um die rndis0Schnittstelle einzurichten.

Léo Lam
quelle
1
Mit Blick auf den Zweig jb-release: int setUsbTethering (boolean enable); scheint die 33. Methode zu sein, nicht die 34.. Außerdem habe ich die Befehle 4.1 / 4.2 und 4.3 / 4.4 auf einem Nexus 7 mit JB 4.3 und Service Call Connectivity 33 getestet. I32 1 aktiviert das Tethering.
@ JoshHolland muss ein Fehler gewesen sein. Danke, dass du das Problem behoben hast!
Léo Lam
Dies ist die richtige Antwort für USBTethering. WifiTethering funktioniert jedoch nicht. Die API wurde dafür nicht offen gelassen ...
Kristopher
Natürlich hätte ich nichts dagegen;) danke für den Link.
Léo Lam
1
auf CM14.1 (7.1) funktioniert der Befehl Jelly Bean
christoph
7

Es gibt eine ziemlich schlechte Methode adb shell input tap, bei der die Koordinaten für das Aktivieren und Ersetzen von Tethering abgerufen werden

adb shell input tap <x> <y>

Oder navigieren Sie zum Aktivieren des Radios mit adb shell input keyevent. Schauen Sie doch mal rein,

adb shell input 

Dies beschränkt sich wiederum auf ein bestimmtes Gerät.

Rilwan
quelle
Die Kombination all dies zusammen, das funktioniert für mich , wenn der Bildschirm entsperrt ist: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Ich habe eine Liste der wichtigsten Ereignisse auf SO gefunden.
Redbmk
1
Falls jemand dies testen und / oder für sein Gerät modifizieren möchte, werde ich dies hier posten. Ich habe ein kleines Skript geschrieben , um das Tethering für mein Nexus 5x zu aktivieren (muss entsperrt werden) und es mit udev verbunden, um dies automatisch zu tun, wenn ich es einstecke
redbmk 31.01.17
1
@redbmk - danke für das nützliche Skript. Für ein Galaxy A5 2017 lautet die Tastensequenz: $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} ENTER . Auch fand ich, dass pause = "sleep 0.3" ok funktioniert.
P.Windridge
In der obigen Sequenz hatte ich die ersten Tastendrücke vergessen, um die Popup-Bestätigung zum Aktivieren von MTP zu verwerfen. Dies ist $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} ENTER; .
P.Windridge
6

Versuchen Sie den folgenden setpropBefehl:

setprop sys.usb.config rndis,adb
user29787
quelle
2
Dies ist nur ein Teil dessen, was benötigt wird. Dies startet beispielsweise nicht dnsmasq.
Kroot
2

Geändert, um den Windows-Befehl "Zeitüberschreitung" anstelle von "Ruhezustand" zu verwenden. Wachen Sie den Bildschirm zuerst auf und drücken Sie ihn nur einmal nach unten. Zweimal aktiviertes WLAN-Tethering auf meinem Telefon.

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

Die serviceMethode funktionierte auf meinem Samsung-Gerät nicht. Ich fand heraus, wie es geht, indem ich die Netzwerkschnittstelle direkt konfigurierte. Hier ist ein Skript, das einen Linux-Computer und ein über USB verbundenes verwurzeltes Android-Gerät für das USB-Tethering einrichtet. Hiermit wird keine DNS- oder NAT-Maskierung eingerichtet, es ist jedoch ausreichend, um das Gerät unter 192.168.42.129 verfügbar zu machen:

#!/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

Informationen zum Aktivieren der Weiterleitung (dh zum Herstellen einer Verbindung zum Internet vom PC über das Android-Gerät) finden Sie unter Meine Frage und Antwort hier .

Vladimir Panteleev
quelle
0

dies ist geräteunabhängig (schaltet das USB-Tethering um)

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
quelle