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

7

12

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.

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:

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.

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

Unpeg answered 26/11, 2013 at 20:7 Comment(1)
duplicate of android.stackexchange.com/questions/29954/…Threaten
T
20

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):

The following commands call ConnectivityManager.setUsbTethering(boolean enable) in 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 0 turns off USB tethering.

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

4.4.4: 34
5.1.0: 30
6.0.1: 30
7.0.0: 33
Turenne answered 21/6, 2014 at 21:40 Comment(3)
For reference, this only works on Android 4.x (more likely, only specific versions). The number "34" is the method number in the list of methods in IConnectivityManager.aidlBaillieu
For reference, RNDIS seems to be the same as USB, but it depends on what device you are using. It was RNDIS for the nexus s and USB for the galaxy s4. Unfortunately I no longer work on this project so I can't test your solution, but it seems that it would work so I have accepted your answer.Unpeg
This only works on Android 4.3 and 4.4.Expiry
S
10

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

int setUsbTethering(boolean enable, String callerPkg);

So, for 8.0 / 8.1 Oreo:

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

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

It works for me Android Pie with

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

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

Selenodont answered 29/8, 2018 at 10:1 Comment(0)
G
7

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.

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.

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)

Greater answered 24/11, 2018 at 15:15 Comment(0)
C
6

For Android 5.0+ (Lollipop, Marshmallow) use:

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

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

Keep in mind that this requires root.

Christianize answered 22/12, 2015 at 15:50 Comment(2)
Where is it documented?Klipspringer
Use "service list" and "dumpsys activity services" in adb to get a overview of services your device is aware of. From here on its either Google or browsing through the (AOSP) source code since non of this is "officially" documented as far as i know.Christianize
M
2

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:

#!/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
Myrwyn answered 16/2, 2018 at 14:54 Comment(0)
F
0

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

  • 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"
Finnegan answered 1/6, 2017 at 6:5 Comment(0)
R
0

Android 4.2 Jelly bean:

adb shell su -c service call connectivity 33 i32 1

Rotenone answered 18/9, 2020 at 5:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.