Có thể kích hoạt cài đặt Android USB Tethering của Android từ dòng lệnh không?


23

Tôi muốn kích hoạt "kết nối USB" từ trong tập lệnh bash, vậy có khả năng chạy một dòng lệnh adb shellđể thay đổi một số cài đặt Android không?

Chỉnh sửa1 :

Lệnh sau mở các cài đặt cần thiết nhưng không thay đổi bất cứ điều gì một mình:

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

Tôi đã tìm thấy tên hành động TetherSinstall từ

aapt dump xmltree com.android.settings.apk AndroidManifest.xml | less +/ether

Điều đó thật tuyệt. Tôi đã cố gắng tìm các lệnh khác đang thực hiện aapt dump xmltree com.android.settings.apk AndroidManifest.xmlnhưng điều đó không hoạt động trên điện thoại của tôi (không tìm thấy aapt). Làm thế nào tôi có thể thấy một danh sách các cài đặt có sẵn?
George Profenza


Cảm ơn! Tôi đã tìm thấy aapt trong thư mục công cụ xây dựng. Tôi có thể chạy nó bây giờ. Tôi dường như không thể tìm thấy com.android.sinstall.apk. Tôi đã thử: find / -name 'com.android.settings.apk'trên điện thoại, nhưng không có gì xuất hiện :( Bạn có thể vui lòng cho tôi biết nơi tôi có thể tìm thấy com.android.sinstall.apk không?
George Profenza

Câu trả lời:


14

Chạy lệnh sau với quyền root sẽ kích hoạt tính năng chia sẻ kết nối qua USB:

  • service call connectivity 32 i32 1 trên Ice Cream Sandwich (4.0)
  • service call connectivity 33 i32 1 trên Jelly Bean (4.1 đến 4.3)
  • service call connectivity 34 i32 1 trên KitKat (4.4)
  • service call connectivity 30 i32 1 trên Lollipop (5.0)
  • service call connectivity 31 i32 1trên Lollipop (5.1) theo câu trả lời của Firelord
  • service call connectivity 30 i32 1trên Marshmallow (6.0), chưa được kiểm tra
  • service call connectivity 41 i32 1 trên Samsung Marshmallow (6.0)
  • service call connectivity 33 i32 1 trên Nougat (7.0)
  • service call connectivity 39 i32 1 trên Samsung Nougat (7.0)

Số đầu tiên bạn thấy trong các lệnh là setUsbTethering()số của phương thức (số IConnectivityManager.aidlnày phụ thuộc vào phiên bản Android và không tồn tại trên Gingerbread).

(Mẹo: để kiểm tra tệp này cho một phiên bản Android cụ thể, chọn chi nhánh thích hợp.)

Vì vậy, những gì lệnh này thực hiện là gọi setUsbTethering()và vượt qua 1 (bật tính năng chia sẻ kết nối qua USB) hoặc 0 (để tắt nó).

Để biết thêm thông tin, hãy xem câu hỏi liên quan này trên Stack Overflow .


Nếu bạn đang bật tính năng chia sẻ kết nối qua USB như một phần của thiết lập kết nối ngược USB, setprop sys.usb.config rndis,adbthì quá đủ để rndis0thiết lập giao diện.


1
Nhìn vào nhánh phát hành jb, int setUsbTethering (boolean enable); có vẻ là phương pháp thứ 33, không phải thứ 34. Ngoài ra, tôi đã thử nghiệm cả hai lệnh 4.1 / 4.2 và 4.3 / 4.4 trên Nexus 7 với JB 4.3 và kết nối cuộc gọi dịch vụ 33 i32 1 bật tính năng chia sẻ kết nối.

@JoshHolland hẳn là một sai lầm. Cảm ơn đã sửa nó!
Léo Lam

Đây là câu trả lời đúng cho USBTethering. Nó sẽ không hoạt động cho WifiTethering. API đã không bị bỏ ngỏ cho điều đó ...
Kristopher

Tất nhiên tôi sẽ không phiền;) cảm ơn vì liên kết.
Léo Lam

1
trên CM14.1 (7.1) lệnh Jelly Bean hoạt động
christoph

7

Có một phương pháp khá tệ khi sử dụng adb shell input tap, Lấy tọa độ để bật tính năng buộc và thay thế

adb shell input tap <x> <y>

Hoặc điều hướng để bật radio bằng cách sử dụng adb shell input keyevent. Chỉ cần nhìn vào,

adb shell input 

Một lần nữa điều này giới hạn trong một thiết bị cụ thể.


Kết hợp tất cả lại với nhau, điều này hoạt động với tôi nếu màn hình được mở khóa : adb shell "am start -n com.android.settings/.TetherSettings; input keyevent KEYCODE_DPAD_UP; input keyevent KEYCODE_ENTER". Tôi tìm thấy một danh sách các sự kiện quan trọng trên SO.
redbmk

1
Trong trường hợp bất cứ ai muốn kiểm tra điều này và / hoặc sửa đổi nó cho thiết bị của họ, tôi sẽ đăng nó ở đây. Tôi đã viết một đoạn script nhỏ để bật tính năng chia sẻ cho nexus 5x của mình (cần được mở khóa) và nối nó với udev để tự động làm điều đó khi tôi cắm nó vào
redbmk

1
@redbmk - cảm ơn vì kịch bản hữu ích. Đối với Galaxy A5 2017 , chuỗi khóa là: $ {inputKey} DPAD_DOWN; $ tạm dừng; $ {inputKey} DPAD_DOWN; $ tạm dừng; $ {inputKey} ENTER . Ngoài ra tôi thấy rằng tạm dừng = "ngủ 0,3" hoạt động tốt.
P.Windridge

Trong trình tự trên, tôi đã quên các lần nhấn phím ban đầu để loại bỏ xác nhận bật lên về việc bật MTP, đó là $ {inputKey} DPAD_DOWN; $ tạm dừng; $ {inputKey} DPAD_DOWN; $ tạm dừng; $ {inputKey} ENTER; .
P.Windridge

6

Hãy thử setproplệnh dưới đây:

setprop sys.usb.config rndis,adb

2
Đây chỉ là một phần của những gì cần thiết. Điều này sẽ không bắt đầu dnsmasq chẳng hạn.
kroot

2

Được sửa đổi để sử dụng lệnh hết thời gian của windows thay vì ngủ, đánh thức màn hình trước và chỉ nhấn xuống một lần. Hai lần kích hoạt tính năng chia sẻ kết nối wifi trên điện thoại của tôi.

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

1

Các servicephương pháp không làm việc cho tôi trên điện thoại Samsung của tôi. Tôi đã tìm ra cách để làm điều đó bằng cách cấu hình trực tiếp giao diện mạng. Dưới đây là tập lệnh thiết lập máy Linux và thiết bị Android đã được kết nối USB để kết nối USB. Điều này không thiết lập giả mạo DNS hoặc NAT, nhưng đủ để làm cho thiết bị có thể truy cập tại 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

Để bật chuyển tiếp (nghĩa là kết nối với Internet từ PC thông qua thiết bị Android), hãy xem câu hỏi và câu trả lời của tôi ở đây .


0

đây là thiết bị độc lập (bật tắt tính năng chia sẻ kết nối qua 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.