您现在的位置是:首页 >技术教程 >Android12系统上支持Android手机的usb网络共享网站首页技术教程

Android12系统上支持Android手机的usb网络共享

hxHardway 2024-07-04 11:18:00
简介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网络共享有效。苹果手机需要另做适配

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。