当前位置: 首页 > article >正文

Android usb网络共享详解

Android usb网络共享详解

文章目录

  • Android usb网络共享详解
    • 一、前言
    • 二、USB网络共享使用的前提
      • 1、Android设备支持adb 并且打开usb开关
      • 2、原生Settings能看到USB网络共享开关
      • 3、代码中检测USB网络共享是否支持
    • 三、Settings 中USB网络共享代码的部分代码
      • 1、Settings\res\xml\tether_prefs.xml
      • 2、TetherSettings.java
    • 四、Android USB 网络共享相关类
      • 1、USB网络共享核心组件
      • 2、开启USB网络共享的代码
      • 3、 **网络接口**节点
      • 4、USB网络共享开启成功后的ifconfig显示
      • 5、调试与故障排除
        • (1)查看网络接口
        • (2) **检查网络共享状态**
        • (3)日志分析
      • 4、手动启用(Root 设备)
    • 三、其他
      • 1、USB网络共享小结
      • 2、Android14 以太网共享功能 相关代码简介
  • ps: 现在走的每一步,都在为未来积蓄力量,别停下,向前跑,光芒终会与你相遇!

一、前言

Android USB网络共享? 很多人可能都没用过或者开发过。

下面简单介绍一下,以后可能用到呢。

Android USB 网络共享(USB Tethering):允许设备通过 USB 连接将移动网络或 Wi-Fi 网络共享给其他设备(如电脑)使用。

这一功能涉及底层网络协议、USB 通信和系统服务等多个层面。

简单的说:

USB网络共享功能就是Android设备连接电脑后打开网络共享开关,能让电脑使用Android设备的网络。

本文只是介绍一下基础面的知识,对于系统相关适配代码不做深入研究。

很多系统默认是支持这个功能USB网络共享功能的,但是也有些系统不显示这个共享功能,

或者显示这个功能但是无法点击开启,这是为啥呢?

二、USB网络共享使用的前提

1、Android设备支持adb 并且打开usb开关

笔记本连接adb 后能看到 adb devices 设备。

2、原生Settings能看到USB网络共享开关

路径:设置 → 网络和互联网 → 热点和网络共享 → USB 网络共享
若选项存在且可启用,则设备支持.

3、代码中检测USB网络共享是否支持

ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 检查是否支持 USB 网络共享
boolean isSupported = connManager.isTetheringSupported();// 获取可用的 USB 网络共享接口
List<String> availableUsbRegexs = connManager.getTetherableUsbRegexs();

所以显示USB网络开关,但是无法打开USB网络开关的情况,一般是应用判断USB网络共享不支持的情况;

有可能是系统USB未开启或者未连接电脑adb的情况或者其他异常情况。

如果显示原生Settings中不显示USB网络共享开关咋搞?

这种情况估计要分享一下Settings 代码中,USB 网络共享开关显示控制代码了。

三、Settings 中USB网络共享代码的部分代码

1、Settings\res\xml\tether_prefs.xml

USB网络共享的xml布局文件代码

 <com.android.settingslib.PrimarySwitchPreferenceandroid:key="wifi_tether" // 热点共享android:title="@string/wifi_hotspot_checkbox_text"android:summary="@string/wifi_hotspot_off_subtext"android:fragment="com.android.settings.wifi.tether.WifiTetherSettings"settings:allowDividerAbove="true"settings:maxLines="2"/><com.android.settingslib.RestrictedSwitchPreferenceandroid:key="usb_tether_settings" //-----》usb网络共享android:title="@string/usb_tethering_button_text"android:summary="@string/usb_tethering_subtext"settings:keywords="@string/keywords_hotspot_tethering" /><SwitchPreferenceandroid:key="enable_bluetooth_tethering" //蓝牙网络共享android:title="@string/bluetooth_tether_checkbox_text"android:summary="@string/bluetooth_tethering_subtext"settings:keywords="@string/keywords_hotspot_tethering" />

2、TetherSettings.java

布局控制的具体代码:

Settings\src\com\android\settings\network\tether\TetherSettings.java

public class TetherSettings extends RestrictedSettingsFragment {static final String KEY_USB_TETHER_SETTINGS = "usb_tether_settings";RestrictedSwitchPreference mUsbTether; //usb网络共享TetheringManager mTm;//网络共享的管理者@VisibleForTestingvoid setupTetherPreference() {mUsbTether = (RestrictedSwitchPreference)findPreference(KEY_USB_TETHER_SETTINGS);}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);...mUsbRegexs = mTm.getTetherableUsbRegexs();final boolean usbAvailable = mUsbRegexs.length != 0;if (!usbAvailable || Utils.isMonkeyRunning()) {getPreferenceScreen().removePreference(mUsbTether); //这里会移除USB网络共享选项}//普通应用也能查,一般为 false//Utils.isMonkeyRunning() --> ActivityManager.isUserAMonkey();}...
}

判断系统是否支持usb网络分享:

   public boolean isCanUsbShare() {TetheringManager tetheringManager = (TetheringManager) context.getSystemService(Context.TETHERING_SERVICE);String[] listTetherableUsbRegexs =  tetheringManager.getTetherableUsbRegexs();LogUtil.debugInform("listTetherableUsbRegexs = " + listTetherableUsbRegexs.length);ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);LogUtil.debugInform("isUserAMonkey() = " + activityManager.isUserAMonkey());if (listTetherableUsbRegexs.length <= 0 || activityManager.isUserAMonkey()) {return false}return true;}

上面可以看到如果系统可用的USB网络节点小于等于0就会不显示USB网络共享开关;

可以直接把 removePreference(mUsbTether) 的地方注释,就会一直显示 USB网络共享开关;

但是能不能打开又是需要具体情况具体分析了。

四、Android USB 网络共享相关类

1、USB网络共享核心组件

UsbManager:管理 USB 设备连接
TetheringManager:控制网络共享功能
Clatd:6to4 转换守护进程(处理 IPv6/IPv4 转换)
DnsProxy:DNS 代理服务
netd:网络守护进程,管理网络接口和路由

2、开启USB网络共享的代码

// 需要 android.permission.MODIFY_NETWORK_SETTINGS 权限public void enableUsbTethering(Context context) {ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 检查是否支持 USB 网络共享if (connManager.isTetheringSupported()) {try {// 获取可用的网络共享接口List<String> available = connManager.getTetherableUsbRegexs();if (!available.isEmpty()) {// 启用 USB 网络共享connManager.startTethering(ConnectivityManager.TETHERING_USB,true, // 持久化设置new ConnectivityManager.OnStartTetheringCallback() {@Overridepublic void onTetheringStarted() {Log.d("Tethering", "USB 网络共享已启动");}@Overridepublic void onTetheringFailed() {Log.e("Tethering", "USB 网络共享启动失败");}});}} catch (Exception e) {e.printStackTrace();}}
}

3、 网络接口节点

Android 设备:通常为 rndis0usb0,通过ifconfig可以看到节点信息。

4、USB网络共享开启成功后的ifconfig显示

# ifconfig//wifi节点信息:
wlan0     Link encap:Ethernet  HWaddr 54:78:c9:14:65:a2inet addr:192.141.1.57  Bcast:192.141.3.255  Mask:255.255.252.0 inet6 addr: fe80::9643:193:1d0:f652/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:107803 errors:0 dropped:431 overruns:0 frame:0 TX packets:10688 errors:0 dropped:163 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:152613737 TX bytes:1329876 //USB网络节点信息:
rndis0    Link encap:Ethernet  HWaddr 6a:d8:b3:8e:bd:90  Driver configfs-gadget.g1inet addr:192.168.146.152  Bcast:192.168.146.255  Mask:255.255.255.0 inet6 addr: fe80::68d8:b3ff:fe8e:bd90/64 Scope: LinkUP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:4180 errors:0 dropped:4 overruns:0 frame:0 TX packets:4336 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:667865 TX bytes:4169392 console:/ # 

未开启USB网络共享功能前,ifconfig是看不到rndis0节点的。

但是在如果ifconfig -a 都看不到rndis0,有可能就是底层未加载USB网络共享节点,就不会显示USB网络共享选项。

代码查看USB网络共享节点连接情况;

// 获取网络共享状态
boolean isTethering = connManager.isTetheringActive(ConnectivityManager.TETHERING_USB);// 获取已连接的网络共享设备
List<String> tethered = connManager.getTetheredIfaces();

电脑成功连接USB网络分享后,adb是会断开的,adb devices 是没有设备列表的。

关闭USB网络共享后,才能正常adb devices 看到adb 列表设备。

5、调试与故障排除

(1)查看网络接口
adb shell ifconfig
adb shell ifconfig -a
# 查找类似 rndis0 或 usb0 的接口
(2) 检查网络共享状态
adb shell dumpsys connectivity | grep Tethering
(3)日志分析
adb logcat | grep -E "Usb|Tethering|Connectivity"

4、手动启用(Root 设备)

adb shell
su
svc usb setFunctions rndis,adb  # 设置 USB 功能为 RNDIS+ADB

不一定有用,因为大部分系统不支持这个命令:

console:/ # svc usb setFunctions rndis,adb 
CANNOT LINK EXECUTABLE "app_process": library "libnativeloader.so" not found: needed by main executable
1|console:/ # 

三、其他

1、USB网络共享小结

(1)打开网络共享需要先连接电脑adb
(2)打开USB网络共享路径:设置 → 网络和互联网 → 热点和网络共享 → USB 网络共享
(3)USB网络共享打开成功后能在ifconfig查看到分享的ip路由信息
(4)如果USB网络共享选项不显示,有可能就是ifconfig -a 看不到 `rndis0` 或 `usb0`
(5)如果USB网络共享选项无法点击开启,有可能是未连接adb或者usb未打开
(6)打开USB网络共享后,adb是会关闭的,不能同时开启。

2、Android14 以太网共享功能 相关代码简介

Android 的以太网共享功能是啥?
其实就是 Android设备接入一个网线后,再接入电脑,电脑就可以分配到到一个ip;
这里的Android 设备就相当于一个路由器。
如果Android设备可以正常上网,那么电脑也是可以上网的;

Android 的以太网共享功能简单的说就是把Android设备的网络通过网线的形式共享给其他设备。

原文链接:https://blog.csdn.net/wenzhi20102321/article/details/141533109

除了USB网络共享、以太网共享,还有蓝牙网络共享,以及最常用的热点,都是网络共享的方式。

ps: 现在走的每一步,都在为未来积蓄力量,别停下,向前跑,光芒终会与你相遇!

相关文章:

Android usb网络共享详解

Android usb网络共享详解 文章目录 Android usb网络共享详解一、前言二、USB网络共享使用的前提1、Android设备支持adb 并且打开usb开关2、原生Settings能看到USB网络共享开关3、代码中检测USB网络共享是否支持 三、Settings 中USB网络共享代码的部分代码1、Settings\res\xml\t…...

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

mysql高可用MHA&#xff08;Master High Availability&#xff09;方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置&#xff08;以 node1 为例&#xff09;3. 初始化集群4. 部署MySQL Route…...

Web 架构之会话保持深度解析

文章目录 一、引言二、会话保持的基本概念2.1 什么是会话2.2 为什么需要会话保持 三、会话保持的常见实现方式3.1 基于客户端的会话保持3.1.1 Cookie 方式3.1.2 URL 重写方式 3.2 基于服务器端的会话保持3.2.1 负载均衡器会话保持3.2.2 会话共享 四、会话保持可能遇到的问题及解…...

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果&#xff1a; 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案&#xff0c;支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …...

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第二维度,第三维度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第1 维度,第二维度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 这行代码的作用是创建一个与 prompt_embedding[:, :, 0] 形状相同且所有元素都为 1 的张量,它用于初始化…...

Rust入门之高级Trait

Rust入门之高级Trait - 本文源码 引言 前面学习了迭代器&#xff08;Iterators&#xff09;&#xff0c;Iterator源码中就用到了关联类型的功能。关联类型就属于高级trait的内容&#xff0c;这次我们学习一下高级trait&#xff0c;了解关联类型等知识。关联类型看似和泛型相…...

从 Set、Map 到 WeakSet、WeakMap 的进阶之旅

在 ES5 时代&#xff0c;JavaScript 的数据结构主要依赖于两种类型&#xff1a;数组和对象。然而&#xff0c;随着应用规模的增长和复杂性上升&#xff0c;传统的数据结构越来越难以满足开发需求。比如&#xff0c;需要一个能自动去重的集合、一个支持任意类型键名的字典、一个…...

TTL (Time-To-Live) 解析

文章目录 TTL (Time-To-Live) 解析&#xff1a;网络与Java中的应用一、TTL的定义二、TTL在网络中的应用1. **路由和数据包的生命周期**2. **DNS中的TTL**3. **防止环路** 三、TTL在Java中的应用1. **缓存管理**2. **Java中的ThreadLocal**3. **网络通信中的TTL** 四、TTL的注意…...

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载

一、前言 搞定了实时预览后&#xff0c;另一个功能就是录像回放&#xff0c;录像回放和视频点播功能完全一致&#xff0c;唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间&#xff0c;因为是录像文件&#xff0c;所以有这个时间&#xff0c;而实时视频预览这个对应…...

季报中的FPGA行业:U型反转,春江水暖

上周Lattice,AMD两大厂商相继发布2025 Q1季报,尽管恢复速度各异,但同时传递出FPGA行业整体回暖的复苏信号。 5月5日,Lattice交出了“勉强及格”的答卷,报告季度营收1亿2000万,与华尔街的预期基本相符。 对于这家聚焦在中小规模器件的领先厂商而言,按照其CEO的预期,长…...

嵌入式机器学习平台Edge Impulse图像分类 – 快速入门

陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能&#xff1a; Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…...

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dir import jsonpathclass Data:def __init__(self,keyNone,file_name"test_datas.yaml"):file_path os…...

ARMV8 RK3399 u-boot TPL启动流程分析 --start.S

上电后运行的第一支文件&#xff1a;arch/arm/cpu/armv8/start.S CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK1 #include <asm/arch/boot0.h> 跳转到 arch/arm/include/asm/arch-rockchip/boot0.h CONFIG_SPL_BUILD1 b 1f ROCKCHIP_EARLYRETURN_TO_BROMno TINY_FRAMEWORKno …...

zst-2001 上午题-历年真题 计算机网络(16个内容)

网络设备 计算机网络 - 第1题 ac 计算机网络 - 第2题 d 计算机网络 - 第3题 集线器不能隔离广播域和冲突域&#xff0c;所以集线器就1个广播域和冲突域 交换机就是那么的炫&#xff0c;可以隔离冲突域&#xff0c;有4给冲突域&#xff0c;但不能隔离广播域&#xf…...

使用termius连接腾讯云服务器

使用termius连接腾讯云服务器 1.下载termius termius官网 安装配置教程 这里安装的window版本> 默认安装到C盘&#xff0c;不建议修改路径 可以选择谷歌登录&#xff0c;也可以不登录&#xff0c;软件是免费的&#xff0c;试用的是付费版本&#xff0c;不需要点 2.配置 这里…...

redis 命令大全整理

http://doc.redisfans.com/ 原网址 Redis 命令分类 Key(键) Key(键)命令 exists/del/keys/type/scanobject/move/dump/migratettl/pttl/persist/expireat/pexpireat/expire/pexpirerename/renamenxsort/randomkey/restoreexists 语法:exists key [key ...] 检查一个或多…...

实景三维建模软件应用场景(众趣科技实景三维建模)

实景三维建模软件应用场景概述 实景三维建模软件&#xff0c;作为数字化时代的重要工具&#xff0c;不仅能够真实、立体、时序化地反映和表达物理世界&#xff0c;还为国家的基础设施建设和数字化发展提供了有力的支撑。 在测绘与地理信息领域&#xff0c;实景三维建模软件是构…...

Mac M系列 安装 jadx-gui

安装 Homebrew在终端中执行以下命令&#xff08;需管理员密码&#xff09;&#xff1a; 安装 Homebrew&#xff08;官方源&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"国内用户可用镜像源加速&…...

软考 系统架构设计师系列知识点之杂项集萃(56)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;55&#xff09; 第91题 商业智能关注如何从业务数据中提取有用的信息&#xff0c;然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立&#xff08;&#xff09;、数据分…...

Ubuntu20.04 搭建Kubernetes 1.28版本集群

环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补&#xff1a;输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法&#xff1a;mv [选项]... 源文件/目录 目标文件/目录 …...

RAG之大规模解析 PDF 文档全流程实战

PDF 文档在商业、学术和政府领域无处不在,蕴含着大量宝贵信息。然而,从 PDF 中提取结构化数据却面临着独特的挑战,尤其是在处理数千甚至数百万个文档时。本指南探讨了大规模解析 PDF 的策略和工具。 PDF解析挑战 PDF 的设计初衷是为了提供一致的视觉呈现,而非数据提取。这…...

vue-ganttastic甘特图label标签横向滚动固定方法

这个甘特图之前插件里&#xff0c;没有找到能固定label标签在屏幕上的办法&#xff0c;用css各种办法都没有实现&#xff0c;所以我我直接手写定位&#xff0c;用js监听滚动条滚动的距离&#xff0c;然后同步移动甘特图label标签&#xff0c;造成一种定位的错觉&#xff0c;以下…...

AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件

这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是&#xff1a; 定义了一个loadFile函数&#xff0c;模拟异步加载PDF文件的操作使用Promise对象封装异步操作&#xff0c;提供成功(resolve)和失败(reject)两种状态通过…...

MySQL 8.0 OCP 1Z0-908 题目解析(2)

题目005 Choose two. Which two actions can obtain information about deadlocks? □ A) Run the SHOW ENGINE INNODB MUTEX command from the mysql client. □ B) Enable the innodb_status_output_locks global parameter. □ C) Enable the innodb_print_all_deadlock…...

【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件

问题场景&#xff1a; 提示&#xff1a;ipa是用于苹果设备安装的软件包资源 设备&#xff1a;iphone 13(未越狱) 安装包类型&#xff1a;ipa包 调试工具&#xff1a;hbuilderx 问题描述 提要&#xff1a;ios包无法安装 uniapp导出ios包无法安装 相信有小伙伴跟我一样&…...

【嵌入模型与向量数据库】

目录 一、什么是向量&#xff1f; 二、为什么需要向量数据库&#xff1f; 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 &#x1f50d; 示例任务&#xff1a;…...

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发

文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包&#xff0c;旨在加速 Nvidia GPU 上的计算密…...

基于策略的强化学习方法之策略梯度(Policy Gradient)详解

在前文中&#xff0c;我们已经深入探讨了Q-Learning、SARSA、DQN这三种基于值函数的强化学习方法。这些方法通过学习状态值函数或动作值函数来做出决策&#xff0c;从而实现智能体与环境的交互。 策略梯度是一种强化学习算法&#xff0c;它直接对策略进行建模和优化&#xff0c…...

1.Redis-key的基本命令

&#xff08;一&#xff09;Redis的基本类型 String&#xff0c;List&#xff0c;Set&#xff0c;Hash&#xff0c;Zset 三种特殊类型&#xff1a;geospatial&#xff08;地理空间数据&#xff09;、hyperloglog[基数估算&#xff08;去重计数&#xff09;]、bitmaps(位图&…...