Est-il possible d'activer le paramètre Android «USB Tethering» à partir de la ligne de commande?

23

Je voudrais activer le "partage de connexion USB" à partir d'un script bash, est-il donc possible d'exécuter une ligne de commande avec adb shellpour modifier certains paramètres Android?

Edit1 :

La commande suivante ouvre les paramètres nécessaires mais ne modifie rien seul:

am start -n com.android.settings/.TetherSettings

J'ai trouvé le nom de l'action TetherSettings dans

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether
Gilles Quenot
la source
C'est vraiment cool. J'ai essayé de trouver d'autres commandes aapt dump xmltree com.android.settings.apk AndroidManifest.xmlmais cela n'a pas fonctionné sur mon téléphone (aapt introuvable). Comment puis-je voir une liste des paramètres disponibles?
George Profenza
elinux.org/Android_aapt
Gilles Quenot
Merci! J'ai trouvé aapt dans le dossier build-tools. Je peux l'exécuter maintenant. Je n'arrive pas à trouver com.android.settings.apk. J'ai essayé: find / -name 'com.android.settings.apk'au téléphone, mais rien ne s'est produit :( Pouvez-vous s'il vous plaît me faire savoir où je peux trouver com.android.settings.apk?
George Profenza

Réponses:

14

L'exécution de la commande suivante en tant que root devrait permettre le partage de connexion USB:

  • service call connectivity 32 i32 1 sur Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 sur Jelly Bean (4.1 à 4.3)
  • service call connectivity 34 i32 1 sur KitKat (4.4)
  • service call connectivity 30 i32 1 sur Lollipop (5.0)
  • service call connectivity 31 i32 1sur Lollipop (5.1) selon une réponse de Firelord
  • service call connectivity 30 i32 1sur Marshmallow (6.0), non testé
  • service call connectivity 41 i32 1 sur Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 sur Nougat (7.0)
  • service call connectivity 39 i32 1 sur Samsung Nougat (7.0)

Le premier nombre que vous voyez dans les commandes est le setUsbTethering()numéro de la méthode IConnectivityManager.aidl(cela dépend de la version d'Android et n'existe pas sur Gingerbread).

(Astuce: pour vérifier ce fichier pour une version Android particulière, sélectionnez la branche appropriée.)

Donc, cette commande fait appel setUsbTethering()et passe soit 1 (activer le partage de connexion USB) soit 0 (pour le désactiver).

Pour plus d'informations, consultez cette question connexe sur le débordement de pile .


Si vous activez le partage de connexion USB dans le cadre d'une configuration de partage de connexion inversée USB, cela setprop sys.usb.config rndis,adbdevrait être plus que suffisant pour rndis0configurer l' interface.

Léo Lam
la source
1
En regardant la branche jb-release, int setUsbTethering (boolean enable); semble être la 33e méthode, pas la 34e. En outre, j'ai testé les commandes 4.1 / 4.2 et 4.3 / 4.4 sur un Nexus 7 avec JB 4.3 et la connectivité des appels de service 33 i32 1 active le partage de connexion.
@JoshHolland a dû être une erreur. Merci de l'avoir réparé!
Léo Lam
C'est la bonne réponse pour USBTethering. Cela ne fonctionnera pas pour WifiTethering cependant. L'API n'a pas été laissée ouverte pour ça ...
Kristopher
Bien sûr, cela ne me dérangerait pas;) merci pour le lien.
Léo Lam
1
sur CM14.1 (7.1) la commande Jelly Bean fonctionne
christoph
7

Il y a une assez mauvaise méthode à l'aide de adb shell input tap, obtenir les coordonnées pour activer le partage de connexion et le remplacer

adb shell input tap <x> <y>

Ou naviguez pour activer la radio en utilisant adb shell input keyevent. Jetez un oeil à,

adb shell input 

Encore une fois, cela se limite à un appareil particulier.

Rilwan
la source
La combinaison de tout cela ensemble, cela fonctionne pour moi si l'écran est déverrouillé: adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". J'ai trouvé une liste d'événements clés sur SO.
redbmk
1
Au cas où quelqu'un voudrait tester cela et / ou le modifier pour son appareil, je posterai ceci ici. J'ai écrit un petit script pour activer le partage de connexion pour mon Nexus 5x (doit être déverrouillé) et je l'ai connecté à udev pour le faire automatiquement lorsque je le branche
redbmk
1
@redbmk - merci pour le script utile. Pour un Galaxy A5 2017, la séquence de touches est: $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} ENTER . J'ai aussi trouvé que pause = "sleep 0.3" fonctionne bien.
P.Windridge
Dans la séquence ci-dessus, j'avais oublié d'appuyer sur les touches initiales pour ignorer la confirmation contextuelle d'activation de MTP, qui est $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} DPAD_DOWN; $ pause; $ {inputKey} ENTER; .
P.Windridge
6

Essayez la setpropcommande ci-dessous:

setprop sys.usb.config rndis,adb
user29787
la source
2
Ce n'est qu'une partie de ce qui est nécessaire. Cela ne démarrera pas dnsmasq par exemple.
kroot
2

Modifié pour utiliser la commande de délai d'expiration de Windows au lieu de dormir, réveiller d'abord l'écran et n'appuyer qu'une seule fois. Deux fois le partage de connexion Wi-Fi activé sur mon téléphone.

adb shell input keyevent KEYCODE_WAKEUP && adb shell am start -n com.android.settings/.TetherSettings && adb shell input keyevent KEYCODE_DPAD_DOWN && adb shell input keyevent KEYCODE_ENTER && timeout 2 && adb shell input keyevent KEYCODE_BACK
idkaaa
la source
1

La serviceméthode n'a pas fonctionné pour moi sur mon appareil Samsung. Cependant, j'ai compris comment le faire en configurant directement l'interface réseau. Voici un script qui configure une machine Linux et un appareil Android rooté connecté par USB pour le partage de connexion USB. Cela ne configure pas le masquage DNS ou NAT, mais est suffisant pour rendre le périphérique accessible au 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

Pour activer le transfert (c'est-à-dire se connecter à Internet à partir du PC via le périphérique Android), voir ma question et réponse ici .

Vladimir Panteleev
la source
0

ceci est indépendant de l'appareil (bascule le partage de connexion USB)

adb shell am start -n com.android.settings/.TetherSettings && adb shell input keyevent 20 && adb shell input keyevent 20 && adb shell input keyevent KEYCODE_ENTER && sleep 2 && adb shell input keyevent 4
Zibri
la source