Чи можна активувати налаштування Android USB Tethering з командного рядка?


23

Я хотів би активувати «USB-прив’язку» з баш скрипту, тож чи є можливість запустити командний рядок, adb shellщоб змінити деякі налаштування Android?

Редагувати1 :

Наступна команда відкриває потрібні налаштування, але нічого не змінює сама:

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

Я знайшов назву дії TetherSettings від

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

Це справді круто. Я намагався знайти інші команди, які роблять, aapt dump xmltree com.android.settings.apk AndroidManifest.xmlале це не спрацювало на моєму телефоні (aapt не знайдено). Як я можу переглянути список доступних налаштувань?
Джордж Профенза


Спасибі! Я знайшов aapt у папці build-tools. Я можу це запустити зараз. Я, здається, не можу знайти com.android.settings.apk, хоча. Я спробував: find / -name 'com.android.settings.apk'по телефону, але нічого не підійшло :( Чи можете ви, будь ласка, повідомте мені, де я можу знайти com.android.settings.apk?
Джордж Профенза

Відповіді:


14

Виконання наступної команди як root повинне ввімкнути прив'язку USB:

  • service call connectivity 32 i32 1 на бутерброді з морозивом (4.0)
  • service call connectivity 33 i32 1 на квасолі (4,1 до 4,3)
  • service call connectivity 34 i32 1 на KitKat (4.4)
  • service call connectivity 30 i32 1 на льодяник (5.0)
  • service call connectivity 31 i32 1на льодяник (5.1) в відповідно до відповіддю по Firelord
  • service call connectivity 30 i32 1на зефір (6,0), неперевірений
  • service call connectivity 41 i32 1 на Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 на Нугаті (7,0)
  • service call connectivity 39 i32 1 на Samsung Nougat (7.0)

Перше число, яке ви бачите в командах, - setUsbTethering()це номер методу в IConnectivityManager.aidl(це залежить від версії Android і не існує в Gingerbread).

(Порада: щоб перевірити цей файл для певної версії Android, виберіть відповідну гілку.)

Отже, ця команда - це зателефонувати setUsbTethering()та передати або 1 (увімкнути прив'язку через USB), або 0 (щоб її відключити).

Для отримання додаткової інформації дивіться це пов’язане питання щодо переповнення стека .


Якщо ви ввімкнено прив'язку через USB як частину налаштування зворотного тетерування через USB, то для налаштування інтерфейсу setprop sys.usb.config rndis,adbповинно бути більше ніж достатньо rndis0.


1
Дивлячись на відділення jb-release, int setUsbTethering (boolean enable); виглядає як 33-й метод, а не 34-й. Крім того, я протестував як команди 4.1 / 4.2, так і 4.3 / 4.4 на Nexus 7 з JB 4.3 та підключенням службового виклику 33 i32 1, увімкнено прив'язку.

@JoshHolland, мабуть, була помилкою. Дякуємо, що це виправили!
Лео Лам

Це правильна відповідь для USBTethering. Однак це не працюватиме для WifiTethering. API не залишився відкритим для цього ...
Крістофер

Звичайно, я не заперечував би;) дякую за посилання.
Лео Лам

1
на CM14.1 (7.1) працює команда Jelly Bean
Крістоф

7

Існує досить поганий метод використання adb shell input tap: Отримати координати для ввімкнення прив'язки та заміни

adb shell input tap <x> <y>

Або перейдіть, щоб увімкнути використання радіо adb shell input keyevent. Просто подивіться,

adb shell input 

Знову це обмежується певним пристроєм.


Об'єднуючи все це разом, це працює для мене , якщо екран розблоковано: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Я знайшов список ключових подій на SO.
redbmk

1
Якщо хтось хоче перевірити це та / або змінити його для свого пристрою, я опублікую це тут. Я написав невеликий сценарій, щоб увімкнути прив’язку для свого Nexus 5x (його потрібно розблокувати) і підключив його до udev, щоб зробити це автоматично, коли я підключаю його
redbmk

1
@redbmk - дякую за корисний сценарій. Для Galaxy A5 2017 ключовою послідовністю є: $ {inputKey} DPAD_DOWN; $ пауза; $ {inputKey} DPAD_DOWN; $ пауза; $ {inputKey} Введення . Також я виявив, що пауза = "сон 0,3" працює нормально.
P.Windridge

У наведеній вище послідовності я забув початкові натискання клавіш, щоб відхилити спливаюче підтвердження про включення MTP, що є $ {inputKey} DPAD_DOWN; $ пауза; $ {inputKey} DPAD_DOWN; $ пауза; $ {inputKey} ENTER; .
P.Windridge

6

Спробуйте setpropвказану нижче команду:

setprop sys.usb.config rndis,adb

2
Це лише частина того, що потрібно. Наприклад, це не запуститься dnsmasq.
kroot

2

Модифіковано, щоб використовувати команду Windows timeout замість сну, спочатку екран, і натисніть лише один раз. Двічі ввімкнено підключення Wi-Fi на моєму телефоні.

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

serviceМетод не працює для мене на моєму Samsung пристрою. Я зрозумів, як це зробити, налаштувавши мережевий інтерфейс безпосередньо. Ось сценарій, який налаштовує машину Linux та підключений до USB пристрій Android для прив’язки USB. Це не налаштовує DNS або NAT маскування, але достатньо, щоб зробити пристрій доступним на 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

Щоб увімкнути переадресацію (тобто підключитися до Інтернету з ПК через пристрій Android), дивіться моє запитання та відповідь тут .


0

це незалежно від пристрою (перемикає прив'язку 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.