bash 是否可以通过终端使用 adb 连接安卓设备?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20226924/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 08:46:59  来源:igfitidea点击:

Is it possible to USB tether an android device using adb through the terminal?

androidbashubuntuadbtethering

提问by turbo

I'm setting up some tests and it will require a decent number of phones to be usb tethered and configured. I've been successful in configuring them the way I want to once they have been tethered, however it would be quite tedious to tether the phones through navigating the menus, each and every time I (re)start my computer or move the test bank. I am currently using Nexus S phones running cyanogenmod v10.1.0, however the test bank will likely be Samsung Galaxy S4's possibly mixed with the few Nexus S phones I have on hand.

我正在设置一些测试,它需要相当数量的手机进行 USB 连接和配置。我已经成功地以我想要的方式配置它们,一旦它们被绑定,但是每次我(重新)启动我的计算机或移动测试库时,通过导航菜单来绑定手机会非常乏味. 我目前正在使用运行 cyanogenmod v10.1.0 的 Nexus S 手机,但是测试库可能是三星 Galaxy S4 可能与我手头的少数 Nexus S 手机混合在一起。

I want to do this as a bash script, but I'm trying to get it work at the command line (Ubuntu 13.04) first so as to remove issues that could come from scripting. I should be able to handle making it into a script myself, but if it's simple to provide an answer as bash script, please do. I tried shelling into the device (adb -s $deviceID shell) and running:

我想将其作为 bash 脚本来执行,但我试图首先在命令行(Ubuntu 13.04)上运行它,以消除可能来自脚本的问题。我应该能够自己将其制作成脚本,但是如果以 bash 脚本的形式提供答案很简单,请这样做。我尝试进入设备 ( adb -s $deviceID shell) 并运行:

setprop sys.usb.config rndis,adb

This promptly kicks me out of the device shell and the device is no longer accessible. If I run an adb devicesI see the phone as "?????????? No Permissions" at which point I have to take the USB cable out and then plug it in again, and also restart the adb server with adb kill-serveradb start-server. This will not work because I cannot access the phone to make the configuration changes that I need.

这会立即将我踢出设备外壳,并且无法再访问该设备。如果我运行一个,adb devices我会看到手机为“?????????? 无权限”,此时我必须取出 USB 电缆,然后再次插入,并使用adb kill-serveradb start-server. 这将不起作用,因为我无法访问电话以进行所需的配置更改。

I've googled around but have been unable to find anything fruitful. Any suggestions?

我用谷歌搜索,但一直找不到任何富有成果的东西。有什么建议?

回答by PRNDL Development Studios

Must have root to change values with setprop, and I am on a Mac OS without a rndis driver so I could not test your method of USB tethering. Another way, if you have the connectivity service (adb shell service list):

必须有 root 才能使用 更改值setprop,而且我使用的是没有 rndis 驱动程序的 Mac OS,因此我无法测试您的 USB 共享方法。另一种方式,如果您有连接服务 ( adb shell service list):

The following commands call ConnectivityManager.setUsbTethering(boolean enable)in Android 4.3:

以下命令ConnectivityManager.setUsbTethering(boolean enable)在 Android 4.3 中调用:

adb shell su -c service call connectivity 34 i32 1turns on USB tethering.

adb shell su -c service call connectivity 34 i32 1打开 USB 网络共享。

adb shell su -c service call connectivity 34 i32 0turns off USB tethering.

adb shell su -c service call connectivity 34 i32 0关闭 USB 网络共享。

For other Android versions replace 34with the following setUsbTetheringcalling codes per Android version:

对于其他 Android 版本34setUsbTethering每个 Android版本替换为以下调用代码:

4.4.4: 34
5.1.0: 30
6.0.1: 30
7.0.0: 33

回答by user1972814

For Android 5.0+ (Lollipop, Marshmallow) use:

对于 Android 5.0+(棒棒糖、棉花糖),请使用:

adb shell su -c service call connectivity 30 i32 1to turn USB Tethering ON

adb shell su -c service call connectivity 30 i32 1打开 USB 网络共享

adb shell su -c service call connectivity 30 i32 0to turn USB Tethering OFF

adb shell su -c service call connectivity 30 i32 0关闭 USB 网络共享

Keep in mind that this requires root.

请记住,这需要root。

回答by James Hunt

Commands in accepted answer not work on Oreo because now should be additional parameter callerPkgand if put there some random text it works.

接受答案中的命令不适用于奥利奥,因为现在应该是附加参数callerPkg,如果在那里放一些随机文本,它就可以工作。

int setUsbTethering(boolean enable, String callerPkg);

int setUsbTethering(boolean enable, String callerPkg);

So, for 8.0 / 8.1 Oreo:

因此,对于 8.0 / 8.1 奥利奥:

service call connectivity 34 i32 1 s16 text- turn USB tethering ON

service call connectivity 34 i32 1 s16 text- 打开 USB 网络共享

service call connectivity 34 i32 0 s16 text- turn USB tethering OFF

service call connectivity 34 i32 0 s16 text- 关闭 USB 网络共享

It works for me Android Pie with

它适用于我的 Android Pie

service call connectivity 33 i32 1 s16 text- turn USB tethering ON

service call connectivity 33 i32 1 s16 text- 打开 USB 网络共享

service call connectivity 33 i32 0 s16 text- turn USB tethering OFF

service call connectivity 33 i32 0 s16 text- 关闭 USB 网络共享

回答by 22samuelk

You can also script the inputs to start the Settings app and tick the checkbox, like in https://github.com/medvid/android-tether/blob/master/tether#L83.

您还可以编写输入脚本以启动“设置”应用程序并勾选复选框,例如https://github.com/medvid/android-tether/blob/master/tether#L83

Here's my script (pretty much the same as in the link, but slightly adapted):

这是我的脚本(与链接中的几乎相同,但略有调整):

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

For Windows, just replace sleepwith timeout -t.

对于 Windows,只需替换sleeptimeout -t.

Works fine for my OnePlus 3T running Android Pie (9) (with Google's Settings app (running the Pixel Experience ROM); can't verify if it works with other Settings apps or not)

适用于我的运行 Android Pie (9) 的 OnePlus 3T(使用 Google 的设置应用程序(运行 Pixel Experience ROM);无法验证它是否适用于其他设置应用程序)

回答by Vladimir Panteleev

The servicemethod did not work for me on my Samsung device. I figured out how to do it by configuring the network interface directly, though. Here is a script that sets up a Linux machine and a USB-connected rooted Android device for USB tethering. This does not set up DNS or NAT masquerading, but is sufficient to make the device accessible at 192.168.42.129:

service方法在我的三星设备上对我不起作用。不过,我想出了如何通过直接配置网络接口来做到这一点。这是一个脚本,用于设置 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=
    product=
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=""
    local if=""
    local ip=""
    local table=""
    local cmdq="" # Query command
    local cmdx="" # 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

回答by Hyman Miller

For Fairphone 2 with Fairphone Open OS (the "Android without Google" version, which is not installed by default) you need to:

对于带有 Fairphone Open OS(默认未安装的“Android without Google”版本)的 Fairphone 2,您需要:

  • Enable Developer mode (may be actived by default)
  • Search setting for "root" and enable root access for ADB
  • Enter bash command in quotes and use service code 31:
    • Enable: adb shell su -c "service call connectivity 31 i32 1"
    • Disable: adb shell su -c "service call connectivity 31 i32 0"
  • 启用开发者模式(默认情况下可能处于活动状态)
  • 搜索“root”设置并为 ADB 启用 root 访问权限
  • 在引号中输入 bash 命令并使用服务代码 31:
    • 使能够: adb shell su -c "service call connectivity 31 i32 1"
    • 禁用: adb shell su -c "service call connectivity 31 i32 0"