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
Is it possible to USB tether an android device using adb through the terminal?
提问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 devices
I 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-server
adb 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-server
adb 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 1
turns on USB tethering.
adb shell su -c service call connectivity 34 i32 1
打开 USB 网络共享。
adb shell su -c service call connectivity 34 i32 0
turns off USB tethering.
adb shell su -c service call connectivity 34 i32 0
关闭 USB 网络共享。
For other Android versions replace 34
with the following setUsbTethering
calling codes per Android version:
对于其他 Android 版本34
,setUsbTethering
每个 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 1
to turn USB Tethering ON
adb shell su -c service call connectivity 30 i32 1
打开 USB 网络共享
adb shell su -c service call connectivity 30 i32 0
to 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 callerPkg
and 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 sleep
with timeout -t
.
对于 Windows,只需替换sleep
为timeout -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 service
method 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"
- Enable:
- 启用开发者模式(默认情况下可能处于活动状态)
- 搜索“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"
- 使能够: