2013-11-26 36 views
10

我设置了一些测试,它会要求手机的数量得体是USB绑定和配置。我已经成功地配置它们的方式,我想一旦被束缚,但是这将是非常乏味的通过导航菜单,每一次我(重新)启动我的电脑或移动测试银行系绳手机。我目前使用的Nexus S的手机上运行的CyanogenMod v10.1.0,但是测试的银行将可能是三星Galaxy S4与为数不多的Nexus S的手机我手头上有可能混合。是否有可能通过终端使用adb连接android设备?

我想这样做的bash脚本,但我想要得到它在命令行中运行(Ubuntu的13.04),第一,以去除可能来自脚本问题。我应该可以自己处理成脚本,但如果提供答案作为bash脚本很简单,请做。我试着脱壳到设备(adb -s $deviceID shell)和运行:

setprop sys.usb.config rndis,adb 

这及时踢我出设备外壳和设备不再使用。如果我运行adb devices,我将手机视为“??????????无权限”,此时我必须拔出USB电缆,然后重新插入电话,并重新启动adb服务器,并使用adb kill-serveradb start-server。这是行不通的,因为我无法访问手机来进行我需要的配置更改。

我搜索了一下,但一直无法找到任何有成效的东西。有什么建议么?

回答

15

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

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

adb shell su -c service call connectivity 34 i32 1开启USB绑定。

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

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

仅供参考,这仅适用于Android 4.x(更可能,仅限特定版本)。数字“34”是IConnectivityManager.aidl中方法列表中的方法编号。 –

+0

作为参考,RNDIS似乎与USB相同,但它取决于您使用的是什么设备。这是RNDIS的星系s和USB的星系s4。不幸的是,我不再在这个项目上工作,所以我无法测试你的解决方案,但似乎它会工作,所以我已经接受你的答案。 – turbo

+2

[这只适用于Android 4.3和4.4](http://android.stackexchange.com/a/98775/51426)。 –

5

对于Android 5.0以上版本(棒棒糖,棉花糖)使用:

adb shell su -c service call connectivity 30 i32 1打开USB圈养ON

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

adb shell su -c service call connectivity 30 i32 0将USB绑定关闭

请记住,这需要根。

+0

它在哪里记录? – deFreitas

+1

使用adb中的“服务列表”和“dumpsys活动服务”来了解设备所了解的服务概览。从这里开始Google或浏览(AOSP)源代码,因为据我所知,这不是“正式”记录的。 – user1972814

+1

@deFreitas,阅读http://stackoverflow.com/q/20227326/1778421 –

0

对于Fairphone 2 Fairphone开放式操作系统(与“机器人没有谷歌”版本,这是不是默认安装的),你需要:

  • 启用开发模式(可以被默认actived)
  • 搜索设置为“根”,使亚行
  • 在引号中输入bash命令,并使用服务代码31根访问:
    • 启用:adb shell su -c "service call connectivity 31 i32 1"
    • 禁用:adb shell su -c "service call connectivity 31 i32 0"
0

service方法不适合我,我的三星设备上工作。不过,我想通过直接配置网络接口来实现。这是一个脚本,它为USB共享设置了一台Linux机器和一个USB连接的固定的Android设备。这不会设置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" "[email protected]")" 
} 

function adb_su() { 
    local quoted 
    quoted="$(printf " %q" "[email protected]")" 
    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 
相关问题