前言
在某些情況下,android測試機是需要隔絕外部網絡環境,但是有需要可以連接內網,因此近日將研究下了android如何通過usb共享上網以及如何去除wifi、藍牙、數據等功能。
各個通信模塊
wifi模塊
HAL層
/frameworks/opt/net/wifi/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp
驅動層
/frameworks/opt/net/wifi/service/jni/com_android_server_wifi_nan_WifiNanNative.cpp
藍牙模塊
HAL層
/system/bt/btcore/src/hal_util.cc
驅動層
/kernel/lge/hammerhead/drivers/bluetooth/
NFC模塊
/system/nfc/halimpl/bcm2079x/nfc_nci.c
僞造網絡連接狀態
/frameworks/base/core/java/android/net/ConnectivityManager.java
ublic NetworkInfo getActiveNetworkInfo() {
NetworkInfo result = null;
try {
result = mService.getActiveNetworkInfo();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
//~~~ Forge result
if(result ==null){
result = new NetworkInfo(1,0,"WIFI","");
result.setExtraInfo("Test");
result.setIsAvailable(true);
}
//~~~
return result;
}
手機adb shell命令實現配置
1、USBTether開啓USB網絡共享
service call connectivity 33 i32 1
調用connectivity
服務的int setUsbTethering(boolean enable)
33
表示在文件IConnectivityManager.aidl
中是第33
個api函數;i32
表示int32
;1
表示true
;
在android不同版本下命令如下,8.0後該函數參數個數改變,具體還需分析源碼:
service call connectivity 32 i32 1 on Ice Cream Sandwich (4.0)
service call connectivity 33 i32 1 on Jelly Bean (4.1 to 4.3)
service call connectivity 34 i32 1 on KitKat (4.4)
service call connectivity 30 i32 1 on Lollipop (5.0)
service call connectivity 31 i32 1 on Lollipop (5.1)
service call connectivity 30 i32 1 on Marshmallow (6.0), untested
service call connectivity 41 i32 1 on Samsung Marshmallow (6.0)
service call connectivity 33 i32 1 on Nougat (7.0)
service call connectivity 39 i32 1 on Samsung Nougat (7.0)
2、配置ip
ifconfig rndis0 192.168.137.101 netmask 255.255.255.0 up
3、創建新接口
ndc network create 1
4、修改接口
先把rndis0從老接口移除,不確定是否一定99,可以通過下個命令的日誌來看
ndc network interface remove 99 rndis0
5、配置路由
創建路由表,網關根據自己實際設置
ndc network route add 1 rndis0 0.0.0.0/0 192.168.137.1
6、指定DNS
ndc resolver setnetdns 1 localdomain 192.168.102.81 192.168.102.82
7、指定缺省的網絡接口
ndc network default set 1