Apakah mungkin untuk mengaktifkan pengaturan Android "USB Tethering" dari baris perintah?

23

Saya ingin mengaktifkan "penambatan USB" dari dalam skrip bash, jadi apakah ada kemungkinan untuk menjalankan baris perintah dengan adb shellmengubah beberapa pengaturan Android?

Sunting1 :

Perintah berikut membuka pengaturan yang diperlukan tetapi jangan mengubah apa pun sendirian:

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

Saya telah menemukan nama tindakan TetherSettings dari

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
sumber
Itu keren sekali. Saya mencoba menemukan perintah lain aapt dump xmltree com.android.settings.apk AndroidManifest.xmlberfungsi tetapi itu tidak berfungsi pada ponsel saya (tidak ditemukan). Bagaimana saya bisa melihat daftar pengaturan yang tersedia?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
Terima kasih! Saya menemukan aapt di folder build-tools. Saya bisa menjalankannya sekarang. Sepertinya saya tidak dapat menemukan com.android.settings.apk. Saya sudah mencoba: find / -name 'com.android.settings.apk'di telepon, tetapi tidak ada yang muncul :( Bisakah Anda memberi tahu saya di mana saya dapat menemukan com.android.settings.apk?
George Profenza

Jawaban:

14

Menjalankan perintah berikut sebagai root harus mengaktifkan penambatan USB:

  • service call connectivity 32 i32 1 pada Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 pada Jelly Bean (4.1 hingga 4.3)
  • service call connectivity 34 i32 1 pada KitKat (4.4)
  • service call connectivity 30 i32 1 di Lollipop (5.0)
  • service call connectivity 31 i32 1pada Lollipop (5.1) sesuai dengan jawaban oleh Firelord
  • service call connectivity 30 i32 1pada Marshmallow (6.0), belum diuji
  • service call connectivity 41 i32 1 pada Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 pada Nougat (7.0)
  • service call connectivity 39 i32 1 pada Samsung Nougat (7.0)

Angka pertama yang Anda lihat di perintah adalah nomor setUsbTethering()metode dalam IConnectivityManager.aidl(ini tergantung pada versi Android dan tidak ada pada Gingerbread).

(Kiat: untuk memeriksa file ini untuk versi Android tertentu, pilih cabang yang sesuai.)

Jadi yang dilakukan perintah ini adalah memanggil setUsbTethering()dan meneruskan 1 (aktifkan tethering USB) atau 0 (untuk menonaktifkannya).

Untuk informasi lebih lanjut, lihat pertanyaan terkait ini di Stack Overflow .


Jika Anda mengaktifkan tethering USB sebagai bagian dari pengaturan tethering terbalik USB, setprop sys.usb.config rndis,adbharus lebih dari cukup untuk rndis0mengatur antarmuka.

Léo Lam
sumber
1
Melihat cabang jb-release, int setUsbTethering (mengaktifkan boolean); tampaknya menjadi metode ke-33, bukan ke-34. Selain itu, saya telah menguji perintah 4.1 / 4.2 dan 4.3 / 4.4 pada Nexus 7 dengan JB 4.3 dan konektivitas panggilan layanan 33 i32 1 mengaktifkan penambatan.
@JoshHolland pasti salah. Terima kasih telah memperbaikinya!
Léo Lam
Ini adalah jawaban yang tepat untuk Penetapan USB. Ini tidak akan berfungsi untuk WifiTethering. API belum dibiarkan terbuka untuk itu ...
Kristopher
Tentu saja saya tidak keberatan;) terima kasih atas tautannya.
Léo Lam
1
pada CM14.1 (7.1) perintah Jelly Bean berfungsi
christoph
7

Ada metode yang sangat buruk menggunakan adb shell input tap, Dapatkan koordinat untuk mengaktifkan tethering dan pengganti

adb shell input tap <x> <y>

Atau navigasikan untuk mengaktifkan radio menggunakan adb shell input keyevent. Lihat saja,

adb shell input 

Sekali lagi ini terbatas pada perangkat tertentu.

Rilwan
sumber
Menggabungkan ini semua bersama-sama, ini bekerja untuk saya jika layar terkunci: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Saya menemukan daftar acara utama di SO.
redbmk
1
Jika ada yang ingin menguji ini dan / atau memodifikasinya untuk perangkat mereka, saya akan memposting ini di sini. Saya menulis sebuah skrip kecil untuk mengaktifkan tethering untuk nexus 5x saya (perlu dibuka) dan menghubungkannya ke udev untuk melakukan itu secara otomatis ketika saya pasang
redbmk
1
@redbmk - terima kasih untuk skrip yang bermanfaat. Untuk Galaxy A5 2017 urutan utamanya adalah: $ {inputKey} DPAD_DOWN; $ jeda; $ {inputKey} DPAD_DOWN; $ jeda; $ {inputKey} ENTER . Saya juga menemukan bahwa pause = "sleep 0.3" berfungsi dengan baik.
P.Windridge
Dalam urutan di atas saya lupa penekanan tombol awal untuk mengabaikan konfirmasi pop up tentang mengaktifkan MTP, yaitu $ {inputKey} DPAD_DOWN; $ jeda; $ {inputKey} DPAD_DOWN; $ jeda; $ {inputKey} ENTER; .
P.Windridge
6

Coba setpropperintah di bawah ini:

setprop sys.usb.config rndis,adb
pengguna29787
sumber
2
Ini hanya bagian dari apa yang dibutuhkan. Ini tidak akan memulai dnsmasq misalnya.
kroot
2

Dimodifikasi untuk menggunakan perintah batas waktu windows alih-alih tidur, bangunkan layar terlebih dahulu, dan hanya tekan sekali. Dua kali diaktifkan wifi tethering di ponsel saya.

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

The serviceMetode tidak bekerja untuk saya pada perangkat Samsung saya. Saya menemukan cara untuk melakukannya dengan mengkonfigurasi antarmuka jaringan secara langsung. Berikut ini adalah skrip yang mengatur mesin Linux dan perangkat Android yang di-root-kan USB yang terhubung untuk tethering USB. Ini tidak mengatur DNS atau penyamaran NAT, tetapi cukup untuk membuat perangkat dapat diakses di 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

Untuk mengaktifkan penerusan (yaitu terhubung ke Internet dari PC melalui perangkat Android), lihat pertanyaan dan jawaban saya di sini .

Vladimir Panteleev
sumber
0

ini adalah perangkat yang independen (mengaktifkan 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
sumber