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 设备:通常为 rndis0
或 usb0
,通过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(Master High Availability)方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置(以 node1 为例)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
实现效果 效果: 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案,支持手动微调实现像素级精准裁剪 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 - 本文源码 引言 前面学习了迭代器(Iterators),Iterator源码中就用到了关联类型的功能。关联类型就属于高级trait的内容,这次我们学习一下高级trait,了解关联类型等知识。关联类型看似和泛型相…...
从 Set、Map 到 WeakSet、WeakMap 的进阶之旅
在 ES5 时代,JavaScript 的数据结构主要依赖于两种类型:数组和对象。然而,随着应用规模的增长和复杂性上升,传统的数据结构越来越难以满足开发需求。比如,需要一个能自动去重的集合、一个支持任意类型键名的字典、一个…...
TTL (Time-To-Live) 解析
文章目录 TTL (Time-To-Live) 解析:网络与Java中的应用一、TTL的定义二、TTL在网络中的应用1. **路由和数据包的生命周期**2. **DNS中的TTL**3. **防止环路** 三、TTL在Java中的应用1. **缓存管理**2. **Java中的ThreadLocal**3. **网络通信中的TTL** 四、TTL的注意…...

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载
一、前言 搞定了实时预览后,另一个功能就是录像回放,录像回放和视频点播功能完全一致,唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间,因为是录像文件,所以有这个时间,而实时视频预览这个对应…...

季报中的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/ 适用于任何边缘设备的人工智能: 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
上电后运行的第一支文件: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题 集线器不能隔离广播域和冲突域,所以集线器就1个广播域和冲突域 交换机就是那么的炫,可以隔离冲突域,有4给冲突域,但不能隔离广播域…...

使用termius连接腾讯云服务器
使用termius连接腾讯云服务器 1.下载termius termius官网 安装配置教程 这里安装的window版本> 默认安装到C盘,不建议修改路径 可以选择谷歌登录,也可以不登录,软件是免费的,试用的是付费版本,不需要点 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 ...] 检查一个或多…...

实景三维建模软件应用场景(众趣科技实景三维建模)
实景三维建模软件应用场景概述 实景三维建模软件,作为数字化时代的重要工具,不仅能够真实、立体、时序化地反映和表达物理世界,还为国家的基础设施建设和数字化发展提供了有力的支撑。 在测绘与地理信息领域,实景三维建模软件是构…...
Mac M系列 安装 jadx-gui
安装 Homebrew在终端中执行以下命令(需管理员密码): 安装 Homebrew(官方源) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"国内用户可用镜像源加速&…...
软考 系统架构设计师系列知识点之杂项集萃(56)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(55) 第91题 商业智能关注如何从业务数据中提取有用的信息,然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立()、数据分…...
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指令 补:输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳: 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法:mv [选项]... 源文件/目录 目标文件/目录 …...
RAG之大规模解析 PDF 文档全流程实战
PDF 文档在商业、学术和政府领域无处不在,蕴含着大量宝贵信息。然而,从 PDF 中提取结构化数据却面临着独特的挑战,尤其是在处理数千甚至数百万个文档时。本指南探讨了大规模解析 PDF 的策略和工具。 PDF解析挑战 PDF 的设计初衷是为了提供一致的视觉呈现,而非数据提取。这…...
vue-ganttastic甘特图label标签横向滚动固定方法
这个甘特图之前插件里,没有找到能固定label标签在屏幕上的办法,用css各种办法都没有实现,所以我我直接手写定位,用js监听滚动条滚动的距离,然后同步移动甘特图label标签,造成一种定位的错觉,以下…...
AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件
这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是: 定义了一个loadFile函数,模拟异步加载PDF文件的操作使用Promise对象封装异步操作,提供成功(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文件
问题场景: 提示:ipa是用于苹果设备安装的软件包资源 设备:iphone 13(未越狱) 安装包类型:ipa包 调试工具:hbuilderx 问题描述 提要:ios包无法安装 uniapp导出ios包无法安装 相信有小伙伴跟我一样&…...

【嵌入模型与向量数据库】
目录 一、什么是向量? 二、为什么需要向量数据库? 三、向量数据库的特点 四、常见的向量数据库产品 FAISS 支持的索引类型 vs 相似度 五、常见向量相似度方法对比 六、应该用哪种 七、向量数据库的核心逻辑 🔍 示例任务:…...

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包,旨在加速 Nvidia GPU 上的计算密…...

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

1.Redis-key的基本命令
(一)Redis的基本类型 String,List,Set,Hash,Zset 三种特殊类型:geospatial(地理空间数据)、hyperloglog[基数估算(去重计数)]、bitmaps(位图&…...