您现在的位置是:首页 >技术教程 >Android12系统上支持Android手机的usb网络共享网站首页技术教程
Android12系统上支持Android手机的usb网络共享
简介Android12系统上支持Android手机的usb网络共享
Android系统需要支持Android手机通过usb共享过来的网络需要修改以下代码
1.修改内核,添加这几项内核驱动,kernel驱动默认有源码,我们只需配置上就行
+CONFIG_USB_USBNET=y
+CONFIG_USB_IPHETH=y
+CONFIG_USB_NET_RNDIS_HOST=y
2.需要修改dhcp服务,增加usb网络节点的添加,如下:
--- a/device/rockchip/common/rootdir/init.rockchip.rc
+++ b/device/rockchip/common/rootdir/init.rockchip.rc
@@ -65,6 +65,11 @@ service dhcpcd_eth0 /system/bin/dhcpcd -aABDKL
disabled
oneshot
+service dhcpcd_usb0 /system/bin/dhcpcd -aABDKL
+ class late_start
+ disabled
+ oneshot
+
service iprenew_wlan0 /system/bin/dhcpcd -n
class main
disabled
@@ -75,6 +80,11 @@ service iprenew_eth0 /system/bin/dhcpcd -n
disabled
oneshot
+service iprenew_usb0 /system/bin/dhcpcd -n
+ class late_start
+ disabled
+ oneshot
+
service iprenew_p2p /system/bin/dhcpcd -n
class main
disabled
3.android系统默认只会给eth wlan,移动网络节点去分配ip地址,所以我们需要去适配usb驱动生成的usb0网络节点。
这里有两种办法,1).一种就是修改驱动直接让usb网络驱动生成eth网络节点,但这样会影响以太网的功能,
2)第二就是我们修改framework,通过广播告诉,系统我们切到usb共享网络,需要给usb0分配ip地址。这个时候以太网就不能使用了
我们产品需要以太网功能,所以使用第二种,做一个动态切换的功能,修改如下:
--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
@@ -27,9 +27,15 @@ import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.RemoteException;
+import android.os.SystemProperties;
import android.provider.Settings;
import android.util.Log;
import android.util.PrintWriterPrinter;
+//wade add
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+
import com.android.internal.util.IndentingPrintWriter;
@@ -72,13 +78,18 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
== PackageManager.PERMISSION_GRANTED;
}
+
public void start() {
Log.i(TAG, "Starting Ethernet service");
+ IntentFilter intentFilter = new IntentFilter(); //创建IntentFilter实例
+ intentFilter.addAction("rgb.intent.action.SET_ETH_IFACE"); //接收网络状态广播
+ Receiver mIntentReceiver = new Receiver();
+ mContext.registerReceiver(mIntentReceiver,intentFilter);//注册广播
HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
-
+
mTracker = new EthernetTracker(mContext, mHandler);
mTracker.start();
@@ -262,4 +273,27 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
mHandler.dump(new PrintWriterPrinter(pw), "EthernetServiceImpl");
pw.decreaseIndent();
}
+
+ public class Receiver extends BroadcastReceiver{
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if("rgb.intent.action.SET_ETH_IFACE".equals(action)){
+ String iface = intent.getStringExtra("EXTRA_ETH_IFACE");
+ if(iface==null) iface="eth0";
+ SystemProperties.set("net.eth.iface", iface);
+ Log.i(TAG, "restart EthernetNetworkFactory");
+ //enforceConnectivityInternalPermission();
+ enforceAccessPermission();
+ // mTracker.stop();
+ //重启网络,即调用start
+ mTracker.start();
+ //}
+ }
+ }
+ }
+
+
+
+
}
--- a/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
+++ b/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
@@ -41,6 +41,8 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.net.util.NetdService;
+//wade add
+import android.os.SystemProperties;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
@@ -419,6 +421,10 @@ final class EthernetTracker {
mDefaultInterface = iface;
}
+ iface = SystemProperties.get("net.eth.iface", "eth0");
+
+ Log.i(TAG, "wade maybeTrackInterface: " + iface);
+
if (mIpConfigForDefaultInterface != null) {
updateIpConfiguration(iface, mIpConfigForDefaultInterface);
mIpConfigForDefaultInterface = null;
apk这边需要添加发送光广播的代码如下:
Intent intent = new Intent("rgb.intent.action.SET_ETH_IFACE");
intent.putExtra("EXTRA_ETH_IFACE","usb0");
sendBroadcast(intent);
这样就可以动态的切到usb0网络,如下:
注意:以上只针对android手机的usb网络共享有效。苹果手机需要另做适配
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。