Czy można aktywować ustawienie Androida „Tethering przez USB” z wiersza poleceń?

23

Chciałbym aktywować „Tethering przez USB” z poziomu skryptu bash, więc czy jest jakaś możliwość uruchomienia wiersza poleceń, adb shellaby zmienić niektóre ustawienia Androida?

Edycja1 :

Następujące polecenie otwiera wymagane ustawienia, ale nie zmienia niczego samodzielnie:

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

Znalazłem nazwę działania TetherSettings od

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
źródło
To jest naprawdę świetne. Próbowałem znaleźć inne polecenia działające, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlale to nie działało na moim telefonie (aapt nie znaleziono). Jak mogę wyświetlić listę dostępnych ustawień?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
Dzięki! Znalazłem aapt w folderze build-tools. Mogę to teraz uruchomić. Jednak nie mogę znaleźć com.android.settings.apk. Próbowałem: find / -name 'com.android.settings.apk'na telefon, ale nic nie wymyślił :( Czy możesz dać mi znać, gdzie mogę znaleźć com.android.settings.apk?
George Profenza

Odpowiedzi:

14

Uruchomienie następującego polecenia jako root powinno włączyć tethering przez USB:

  • service call connectivity 32 i32 1 na lody Sandwich (4.0)
  • service call connectivity 33 i32 1 na Jelly Bean (4.1 do 4.3)
  • service call connectivity 34 i32 1 na KitKat (4.4)
  • service call connectivity 30 i32 1 na Lollipop (5.0)
  • service call connectivity 31 i32 1na Lollipop (5.1) zgodnie z odpowiedzią przez Ognia
  • service call connectivity 30 i32 1na Marshmallow (6.0), niesprawdzone
  • service call connectivity 41 i32 1 na Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 w sprawie Nougat (7.0)
  • service call connectivity 39 i32 1 na Samsung Nougat (7.0)

Pierwszą liczbą, którą widzisz w poleceniach, jest numer setUsbTethering()metody IConnectivityManager.aidl(zależy to od wersji Androida i nie istnieje w Pierniku).

(Wskazówka: aby sprawdzić ten plik dla konkretnej wersji Androida, wybierz odpowiednią gałąź).

To polecenie wykonuje wywołanie setUsbTethering()i przekazuje 1 (włącz tethering przez USB) lub 0 (aby je wyłączyć).

Aby uzyskać więcej informacji, zobacz to pokrewne pytanie dotyczące przepełnienia stosu .


Jeśli włączasz tethering przez USB jako część konfiguracji tetheringu odwrotnego USB, setprop sys.usb.config rndis,adbpowinno wystarczyć do rndis0skonfigurowania interfejsu.

Léo Lam
źródło
1
Patrząc na gałąź wydania jb, int setUsbTethering (boolean enable); wygląda na 33. metodę, a nie 34. Przetestowałem także polecenia 4.1 / 4.2 i 4.3 / 4.4 na Nexusie 7 z JB 4.3, a łączność połączeń serwisowych 33 i32 1 włącza tethering.
@JoshHolland musiał być pomyłką. Dzięki za naprawę!
Léo Lam
To jest właściwa odpowiedź na USBTethering. Nie działa jednak w przypadku Wi-Fi. Interfejs API nie został dla tego otwarty ...
Kristopher
Oczywiście, że nie miałbym nic przeciwko;) dzięki za link.
Léo Lam
1
na CM14.1 (7.1) działa polecenie Jelly Bean
christoph
7

Istnieje dość zła metoda użycia adb shell input tap: Uzyskaj współrzędne, aby włączyć tethering i zastąpić

adb shell input tap <x> <y>

Lub nawiguj, aby włączyć korzystanie z radia adb shell input keyevent. Wystarczy spojrzeć na

adb shell input 

Ponownie ogranicza się to do konkretnego urządzenia.

Rilwan
źródło
Łącząc to wszystko razem, to działa na mnie, jeśli ekran jest odblokowany: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Znalazłem listę kluczowych wydarzeń na SO.
redbmk
1
Jeśli ktoś chce to przetestować i / lub zmodyfikować na swoim urządzeniu, opublikuję to tutaj. Napisałem mały skrypt, aby włączyć tethering dla mojego nexusa 5x (wymaga odblokowania) i podłączyłem go do udev, aby zrobić to automatycznie po podłączeniu
redbmk
1
@redbmk - dzięki za przydatny skrypt. W przypadku Galaxy A5 2017 sekwencja klawiszy to: $ {inputKey} DPAD_DOWN; pauza; $ {inputKey} DPAD_DOWN; pauza; $ {inputKey} ENTER . Odkryłem również, że pause = "sleep 0.3" działa dobrze.
P.Windridge
W powyższej sekwencji zapomniałem początkowe naciśnięcia klawiszy, aby odrzucić wyskakujące potwierdzenie włączenia MTP, czyli $ {inputKey} DPAD_DOWN; pauza; $ {inputKey} DPAD_DOWN; pauza; $ {inputKey} ENTER; .
P.Windridge
6

Spróbuj setpropwykonać poniższe polecenie:

setprop sys.usb.config rndis,adb
użytkownik29787
źródło
2
To tylko część tego, co jest potrzebne. To na przykład nie uruchomi dnsmasq.
Kroot,
2

Zmodyfikowano tak, aby używał polecenia limitu czasu systemu Windows zamiast uśpienia, najpierw wybudzaj ekran i naciśnij tylko raz. Dwukrotnie włączony tethering Wi-Fi w moim telefonie.

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
źródło
1

Ta servicemetoda nie działała na moim urządzeniu Samsung. Jednak wymyśliłem, jak to zrobić, bezpośrednio konfigurując interfejs sieciowy. Oto skrypt, który konfiguruje komputer z systemem Linux i zrootowane urządzenie z Androidem podłączone do USB do modemu USB. Nie konfiguruje to maskowania DNS ani NAT, ale wystarcza, aby urządzenie było dostępne pod adresem 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

Aby włączyć przekazywanie (tj. Połączyć się z Internetem z komputera za pośrednictwem urządzenia z systemem Android), zobacz moje pytanie i odpowiedź tutaj .

Vladimir Panteleev
źródło
0

jest to niezależne od urządzenia (przełącza tethering przez 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
źródło