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网络共享有效。苹果手机需要另做适配

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值