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網絡共享、以太網共享,還有藍牙網絡共享,以及最常用的熱點,都是網絡共享的方式。