“USB Bağlama” Android ayarını komut satırından etkinleştirmek mümkün mü?


23

Bir bash betiğinden "USB bağlantısı" nı etkinleştirmek istiyorum, bu yüzden adb shellbazı Android ayarlarını değiştirmek için bir komut satırı çalıştırma imkanı var mı?

Düzenleme1 :

Aşağıdaki komut gerekli ayarları açar ancak tek bir şeyi değiştirmez:

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

TetherSettings işlem adını buldum

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

Bu gerçekten havalı. aapt dump xmltree com.android.settings.apk AndroidManifest.xmlYapmakta olan diğer komutları bulmaya çalıştım ama bu benim telefonumda işe yaramadı (aapt bulunamadı). Kullanılabilir ayarların listesini nasıl görebilirim?
George Profenza


Teşekkürler! Build-tools klasöründe bir aapt buldum. Şimdi çalıştırabilirim. Yine de com.android.settings.apk bulamıyorum. Denedim: find / -name 'com.android.settings.apk'telefonda, ama hiçbir şey çıkmadı :( Lütfen com.android.settings.apk'ı nerede bulabileceğimi
söyler

Yanıtlar:


14

Aşağıdaki komutu root olarak çalıştırmak USB bağlamayı etkinleştirmelidir:

  • service call connectivity 32 i32 1 Dondurmalı Sandviç üzerine (4.0)
  • service call connectivity 33 i32 1 Jelly Bean üzerine (4.1 ila 4.3)
  • service call connectivity 34 i32 1 KitKat'ta (4.4)
  • service call connectivity 30 i32 1 Lolipop üzerinde (5.0)
  • service call connectivity 31 i32 1Firelord tarafından yazılan bir cevaba göre Lollipop (5.1) hakkında
  • service call connectivity 30 i32 1Hatmi (6.0) üzerinde denenmemiş
  • service call connectivity 41 i32 1 Samsung Marshmallow (6.0) hakkında
  • service call connectivity 33 i32 1 Nougat'ta (7.0)
  • service call connectivity 39 i32 1 Samsung Nougat'ta (7.0)

Komutlarda gördüğünüz ilk sayı, setUsbTethering()yöntemin içindeki sayıdır IConnectivityManager.aidl(bu Android sürümüne bağlıdır ve Gingerbread'te yoktur).

(İpucu: Bu dosyayı belirli bir Android sürümü için kontrol etmek için uygun şubeyi seçin.)

Öyleyse bu komutun yaptığı çağrıdır setUsbTethering()ve 1'i (USB bağlantısını etkinleştirin) veya 0'ı (devre dışı bırakmak için) iletin.

Daha fazla bilgi için Yığın Taşması ile ilgili bu soruya bakın .


Bir USB ters bağlama ayarının bir parçası olarak USB bağlantısını etkinleştiriyorsanız setprop sys.usb.config rndis,adb, rndis0arabirimin ayarlanması için fazlasıyla yeterli olmalıdır .


1
Jb-release dalına baktığımızda, int setUsbTethering (boolean enable); 34'üncü yöntem değil, 33'üncü yöntem gibi görünüyor. Ayrıca, 4.1 / 4.2 ve 4.3 / 4.4 komutlarını JB 4.3 ile Nexus 7'de test ettim ve servis çağrısı bağlantısı 33 i32 1 bağlantısı açıldı.

@JoshHolland bir hata olmuş olmalı. Tamir ettiğin için teşekkürler!
Léo Lam,

USBTethering için doğru cevap budur. WifiTethering için olsa işe yaramaz. API bunun için açık bırakılmadı ...
Kristopher

Tabii ki umursamıyorum;) bağlantı için teşekkürler.
Léo Lam

1
CM14.1 (7.1) 'de Jelly Bean komutu çalışıyor
christoph

7

Kullanarak oldukça kötü bir yöntem var, adb shell input tapbağlama ve değiştirme için koordinatları al

adb shell input tap <x> <y>

Veya radyoyu kullanarak etkinleştirmek için gezin adb shell input keyevent. Sadece bir göz at.

adb shell input 

Yine bu, belirli bir cihazla sınırlandırılmıştır.


Bunları bir araya getirmek, ekranın kilidinin açılması durumunda bu benim için çalışıyor adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". SO'da önemli olayların bir listesini buldum .
redbmk

1
Herhangi birinin bunu test etmek ve / veya cihazı için değiştirmek istemesi durumunda, bunu buraya göndereceğim.
Nexus 5x'inin

1
@redbmk - Yararlı senaryo için teşekkürler. Bir için Galaxy A5 2017 önemli dizisidir: $ {inputKey} DPAD_DOWN; duraklama, $; $ {inputKey} DPAD_DOWN; duraklama, $; $ {inputKey} ENTER . Ayrıca, pause = "sleep 0.3" 'un iyi çalıştığını buldum .
P.Windridge

Yukarıdaki dizilimde, $ {inputKey} DPAD_DOWN; olan MTP'yi etkinleştirme hakkında açılan onaylamayı reddetmek için ilk tuşa basmamı unuttum. duraklama, $; $ {inputKey} DPAD_DOWN; duraklama, $; $ {inputKey} ENTER; .
P.Windridge

6

Aşağıdaki setpropkomutu deneyin :

setprop sys.usb.config rndis,adb

2
Bu ihtiyaç duyulanın sadece bir kısmı. Bu, örneğin dnsmasq'ı başlatmayacak.
kroot

2

Windows yerine zamanaşımı komutunu kullanmak yerine, önce ekranı uyandırın ve yalnızca bir kez basın. Telefonumda internet bağlantısı etkinleştirilmiş iki kez aşağı.

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

serviceSamsung cihazımda bu yöntem benim için işe yaramadı. Yine de ağ arayüzünü doğrudan yapılandırarak nasıl yapılacağını öğrendim. İşte USB bağlantısı için bir Linux makinesi ve USB bağlantılı bir köklü Android cihazı kuran bir betik. Bu, DNS veya NAT maskesini oluşturmaz, ancak cihazı 192.168.42.129'da erişilebilir hale getirmek için yeterlidir:

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

Yönlendirmeyi etkinleştirmek için (yani PC’den İnternet’e Android cihaz üzerinden Internet’e bağlanın), soruma bakın ve buradaki cevabı burada bulabilirsiniz .


0

bu cihazdan bağımsızdır (USB bağlantısı arasında geçiş yapar)

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.