Android usb网络共享详解_usb tethering
Android usb网络共享详解
文章目录
- Android usb网络共享详解
-
- 一、前言
- 二、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 availableUsbRegexs = connManager.getTetherableUsbRegexs();
所以显示USB网络开关,但是无法打开USB网络开关的情况,一般是应用判断USB网络共享不支持的情况;
有可能是系统USB未开启或者未连接电脑adb的情况或者其他异常情况。
如果显示原生Settings中不显示USB网络共享开关咋搞?
这种情况估计要分享一下Settings 代码中,USB 网络共享开关显示控制代码了。
三、Settings 中USB网络共享代码的部分代码
1、Settings\\res\\xml\\tether_prefs.xml
USB网络共享的xml布局文件代码
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;//网络共享的管理者 @VisibleForTesting void setupTetherPreference() { mUsbTether = (RestrictedSwitchPreference)findPreference(KEY_USB_TETHER_SETTINGS); } @Override public 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 available = connManager.getTetherableUsbRegexs(); if (!available.isEmpty()) { // 启用 USB 网络共享 connManager.startTethering( ConnectivityManager.TETHERING_USB, true, // 持久化设置 new ConnectivityManager.OnStartTetheringCallback() { @Override public void onTetheringStarted() { Log.d(\"Tethering\", \"USB 网络共享已启动\"); } @Override public 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:a2 inet addr:192.141.1.57 Bcast:192.141.3.255 Mask:255.255.252.0 inet6 addr: fe80::9643:193:1d0:f652/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX 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.g1 inet addr:192.168.146.152 Bcast:192.168.146.255 Mask:255.255.255.0 inet6 addr: fe80::68d8:b3ff:fe8e:bd90/64 Scope: Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX 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 tethered = connManager.getTetheredIfaces();
电脑成功连接USB网络分享后,adb是会断开的,adb devices 是没有设备列表的。
关闭USB网络共享后,才能正常adb devices 看到adb 列表设备。
5、调试与故障排除
(1)查看网络接口
adb shell ifconfigadb shell ifconfig -a# 查找类似 rndis0 或 usb0 的接口
(2) 检查网络共享状态
adb shell dumpsys connectivity | grep Tethering
(3)日志分析
adb logcat | grep -E \"Usb|Tethering|Connectivity\"
4、手动启用(Root 设备)
adb shellsusvc 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 executable1|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网络共享、以太网共享,还有蓝牙网络共享,以及最常用的热点,都是网络共享的方式。