web-dev-qa-db-ja.com

端末からadbを使用してAndroidデバイスをUSBテザリングすることは可能ですか?

私はいくつかのテストを設定していますが、USBで接続して構成するには、かなりの数の電話が必要になります。テザーされた後は、希望どおりに構成することに成功しましたが、コンピューターを(再)起動したり、テストバンクを移動したりするたびに、メニューをナビゲートして電話をテザーするのは非常に面倒です。 。私は現在、cyanogenmodv10.1.0を実行しているNexusS電話を使用していますが、テストバンクはSamsung GalaxyS4と手元にあるいくつかのNexusS電話が混在している可能性があります。

これをbashスクリプトとして実行したいのですが、スクリプトから発生する可能性のある問題を取り除くために、最初にコマンドライン(Ubuntu 13.04)で機能させようとしています。自分でスクリプト化できるはずですが、bashスクリプトで答えるのが簡単な場合はやってください。デバイス(adb -s $deviceID Shell)にシェルして実行してみました:

setprop sys.usb.config rndis,adb

これにより、すぐにデバイスシェルから追い出され、デバイスにアクセスできなくなります。 adb devicesを実行すると、電話が「??????????権限なし」と表示されます。その時点で、USBケーブルを取り出してから再度接続し、再起動する必要があります。 adb kill-serveradb start-serverのadbサーバー。電話にアクセスして必要な構成変更を行うことができないため、これは機能しません。

私はググってみましたが、実りあるものを見つけることができませんでした。助言がありますか?

11
turbo

setpropで値を変更するには、rootが必要です。私は、rndisドライバーのないMac OSを使用しているため、USBテザリングの方法をテストできませんでした。別の方法として、接続サービス(_adb Shell service list_)がある場合:

次のコマンドは、Android 4.3でConnectivityManager.setUsbTethering(boolean enable)を呼び出します。

_adb Shell su -c service call connectivity 34 i32 1_はUSBテザリングをオンにします。

_adb Shell su -c service call connectivity 34 i32 0_はUSBテザリングをオフにします。

その他のAndroidバージョンでは、_34_を次のsetUsbTethering呼び出しコードに置き換えますAndroidバージョン:

_4.4.4: 34
5.1.0: 30
6.0.1: 30
7.0.0: 33
_

Android 5.0+(Lollipop、Marshmallow)の場合:

adb Shell su -c service call connectivity 30 i32 1USBテザリングをオンにするには

adb Shell su -c service call connectivity 30 i32 0USBテザリングをオフにします

これにはrootが必要であることに注意してください。

6
user1972814

受け入れられた回答のコマンドはOreoでは機能しません。これは、追加のパラメーターcallerPkgが必要であり、そこにランダムなテキストを配置すると機能するためです。

int setUsbTethering(boolean enable, String callerPkg);

したがって、8.0/8.1 Oreoの場合:

service call connectivity 34 i32 1 s16 text-USBテザリングをオンにします

service call connectivity 34 i32 0 s16 text-USBテザリングをオフにします

それは私のために働きますAndroid Pie with

service call connectivity 33 i32 1 s16 text-USBテザリングをオンにします

service call connectivity 33 i32 0 s16 text-USBテザリングをオフにします

5
James Hunt

https://github.com/medvid/Android-tether/blob/master/tether#L8 のように、入力をスクリプト化して設定アプリを起動し、チェックボックスをオンにすることもできます。

これが私のスクリプトです(リンクとほとんど同じですが、少し変更されています):

adb Shell am force-stop com.Android.settings
adb Shell input keyevent 3 # Home
sleep 2
adb Shell am start -a Android.intent.action.MAIN -n com.Android.settings/.TetherSettings
sleep 2
adb Shell input keyevent 19 # Up
adb Shell input keyevent 20 # Down
adb Shell input keyevent 66 # Enter
sleep 2
adb Shell input keyevent 3 # Home

Windowsの場合は、sleeptimeout -tに置き換えるだけです。

Android Pie(9)(Googleの設定アプリ(Pixel Experience ROMを実行);​​他の設定アプリで動作するかどうかを確認できません)を実行しているOnePlus3Tでは正常に動作します)

3
22samuelk

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
1

Fairphone OpenOSを搭載したFairphone2(デフォルトではインストールされない「Androidwithout Google」バージョン)の場合、次のことを行う必要があります。

  • 開発者モードを有効にします(デフォルトでアクティブになっている場合があります)
  • 「root」の設定を検索し、ADBのルートアクセスを有効にします
  • Bashコマンドを引用符で囲み、サービスコード31を使用します:
    • 有効にする:adb Shell su -c "service call connectivity 31 i32 1"
    • 無効にする:adb Shell su -c "service call connectivity 31 i32 0"
0
Jack Miller