Android系统中如何添加USB网络共享

类别

需求

索引类别

USB网络共享

问题描述

平台是RT1296,在Android系统中已经有支持USB网络共享,但相应的产品系统中还未开启USB网络共享,那么这个时候就需要添加USB网络共享的一些配置,使得产品支持此功能。(以下是个人的一些理解,如有错误,请各位大佬多多指教)

代码关联

对应的代码修改部分如下:

①对应内核中添加配置(系统中添加USB网络驱动)

@@ -837,3 +837,6 @@ CONFIG_ZRAM=yCONFIG_ZRAM_LZ4_COMPRESS=yCONFIG_ZSMALLOC=y# CONFIG_ZSMALLOC_STAT is not set
+CONFIG_USB_USBNET=y
+CONFIG_USB_IPHETH=y
+CONFIG_USB_NET_RNDIS_HOST=y

②在init.rc中增加两个针对usb0的配置服务,才能让framework配置得了usb0网卡(服务是是USB网络共享的核心)

@@ -134,3 +134,16 @@ on property:persist.iso.state=unmounted
#在开机启动的时候会发送一个bootcomplete广播,接收广播后启动scdetect、rootshellserviceon property:dev.bootcomplete=1start scdetectstart rootshellservice
#启动usb网络分配dhcp
+service dhcpcd_usb0 /system/bin/dhcpcd -ABDKL -f/system/etc/dhcpcd/dhcpcd.conf
+    class main
+    disabled
+    oneshot
+    seclabel u:r:dhcp:s0
#启动usb网络分配ip
+service iprenew_usb0 /system/bin/dhcpcd -n
+    class main
+    disabled
+    oneshot
+    seclabel u:r:dhcp:s0

③对应Android源码,frameworks中添加配置(这边主要是讲述网络是如何启动的,是选择那个网络)

/frameworks/base/core/res/res/values/config.xml <bool name="config_enableMonitorInputSource">true</bool>
-    <string translatable="false" name="config_ethernet_iface_regex">eth\\d</string>
+    <string translatable="false" name="config_ethernet_iface_regex">eth\\d|usb\\d</string>

上面的作用是提供两种网络的方式,一种是以太网络,一种是走usb共享

    /frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.javapublic synchronized void start(Context context, Handler target) {Log.i(TAG, "monitoring start");// The services we use.IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);mNMService = INetworkManagementService.Stub.asInterface(b);mEthernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);//在这里就获取上面设定config_ethernet_iface_regex的值mIfaceMatch = context.getResources().getString(com.android.internal.R.string.config_ethernet_iface_regex);// Create and register our NetworkFactory.mFactory = new LocalNetworkFactory(NETWORK_TYPE, context, target.getLooper());mFactory.setCapabilityFilter(mNetworkCapabilities);mFactory.setScoreFilter(-1); // this set high when we have an ifacemFactory.register();mContext = context;// Start tracking interface change events.mInterfaceObserver = new InterfaceObserver();try {mNMService.registerObserver(mInterfaceObserver);} catch (RemoteException e) {Log.e(TAG, "Could not register InterfaceObserver " + e);}// If an Ethernet interface is already connected, start tracking that.// Otherwise, the first Ethernet interface to appear will be tracked.try {final String[] ifaces = mNMService.listInterfaces();for (String iface : ifaces) {synchronized(this) {//在这里判断是采用哪个网络if (maybeTrackInterface(iface)) { // We have our interface. Track it.// Note: if the interface already has link (e.g., if we// crashed and got restarted while it was running),// we need to fake a link up notification so we start// configuring it. Since we're already holding the lock,// any real link up/down notification will only arrive// after we've done this.if (mNMService.getInterfaceConfig(iface).hasFlag("running")) {updateInterfaceState(iface, true);}break;}}}****}}//在这边可以选择是走那个网络是eth还是usb         private boolean maybeTrackInterface(String iface) {// If we don't already have an interface, and if this interface matches// our regex, start tracking it.if (!iface.matches(mIfaceMatch) || isTrackingInterface())return false;if(UbusRpc.isOpenWrt() && !UbusRpc.isOttWifi()){if(!iface.equals("eth9"))return false;} else if(!iface.equals(SystemProperties.get("net.eth.iface", "eth0"))){return false;}Log.d(TAG, "Started tracking interface " + iface);setInterfaceUp(iface);return true;}

④最后在设置一个属性值:setprop net.eth.iface usb0/eth0 (usb0强制网络走手机USB网络共享)

应用层发送一个广播,这样就可以自由的切换是使用USB还是以太网。

 Intent intent = new Intent("rtk.intent.action.SET_ETH_IFACE");intent.putExtra("EXTRA_ETH_IFACE"," usb0/eth0 ");sendBroadcast(intent);

对应frameworks的接收应用发送的广播代码:

/frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.javaprivate final BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if("rtk.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();synchronized (mIpConfiguration) {mTracker.stop(); //重启网络,即调用第③步的startmTracker.start(mContext, mHandler); }}}};

如果没有效果,请排查一下/sys/class/net/中是否有新生成一个usb0的节点,如果没有生成的话排查第①第②步是否正常开启。

知识拓展

参考资料:https://blog.csdn.net/tankai19880619/article/details/44559419?_t=t

改进建议

若有错误请指正,悉心接受大佬的指点 谢谢 ! v

工作记录。。。。。

Android系统中如何添加USB网络共享相关推荐

  1. Android设备如何支持iPhone usb网络共享

    一般情况下如果iPhone连接到Android机器上,在Android平台硬件支持MFI芯片 + 软件支持Carplay协议才能正常通信.通信走NCM驱动cdc_ncm -> usbnet de ...

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

    Android系统需要支持Android手机通过usb共享过来的网络需要修改以下代码 1.修改内核,添加这几项内核驱动,kernel驱动默认有源码,我们只需配置上就行 +CONFIG_USB_USBN ...

  3. Android usb网络共享开关

    Android7.0 usb网络共享开关 涉及的文件: packages\apps\Settings\src\com\android\settings\TetherSettings.java pack ...

  4. android usb共享代码,让Android手机具有USB网络共享功能,可以通过USB连接到Internet...

    第0章: 什么是USB网络共享功能 最近漫游Windows Phone的世界时,最新鲜的感觉之一就是诺基亚Lumia手机具有有趣的USB绑定功能,该功能使您的手机可以通过USB电缆连接到计算机,您可以 ...

  5. Android手机通过USB网络共享限速

    在 Android上都有USB网络共享的功能,可以直接在手机上通过USB口使用电脑端的网络,有些手机叫"USB绑定",有些手机叫"网络共享". 简单说明一下US ...

  6. 在Android系统中添加一款新铃声

    想在Android系统中添加铃声,可以通过adb push 的方法,但如果要多次修改系统,每次push进去就显得太费劲了,这里有个简单的方法,就是把铃声编译进android 的system.img文件 ...

  7. 向Android系统中添加模块及产品流程

     添加Android模块  一.基础知识: (1)在Android系统中,编译都是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称: (2)为了将模块编译到Android系统中,每个模块都需 ...

  8. android 8 usb 未连接网络,让安卓手机拥有USB网络共享功能通过USB连上网络

    第零章:什么是USB网络共享功能 最近在Windows Phone的世界里漫游了一圈,其中一个很新鲜的感受就是诺基亚Lumia手机有一个很有意思的USB网络共享功能,该功能能让你的手机只要通过USB数 ...

  9. 如何使用ADB或者shell打开Android的usb网络共享

    现在手机不把usb插在电脑上(usb网络共享)这个开关是灰色的不能打开 插上之后可以使用adb命令: #可能的值'mtp', 'ptp', 'rndis', 'midi', 'none' adb sh ...

最新文章

  1. Thinking in java中关于Exception的一道面试题.
  2. 浅谈Redis和Hbase
  3. 使用自定义UISlider控制View亮度
  4. 通用兄弟元素选择器 E ~ F
  5. Java工程中引用Base64编码解码小记
  6. shell学习笔记--自我总结
  7. 软件项目组织管理(九)项目人力资源管理
  8. 计算机设备报废流程图,报废流程图.ppt
  9. e3 v3服务器芯片组,请问e3 1231 v3搭配下面哪款主板性价比最高?最适合?为什么?
  10. 人间不值得?250000条数据分析李诞是不是被骂火的
  11. 转:python的内置对象
  12. [POI2004]GRA
  13. Android 里的adb命令
  14. MAC 外接键盘卡顿处理
  15. 注意力机制论文:CCNet: Criss-Cross Attention for Semantic Segmentation及其PyTorch实现
  16. blowfish java_blowfish加密算法
  17. 开题报告:基于java医院在线预约挂号系统 毕业设计论文开题报告模板
  18. 编写Java脚本统计工程代码总行数
  19. 嵌入式软件的调试工具
  20. 金融财务英译汉常用词怎样翻译

热门文章

  1. node 图片加水印
  2. E. XOR Triangle 数位dp
  3. 基于pointnet的3D物体分类和分割检测(复现不出来你直接敲我家门)
  4. tx2 1804 soure list
  5. 1.4_8 Axure RP 9 for mac 高保真原型图 - 案例7 【旋转的唱片5】进度条计时器 关联
  6. 看数字化转型标杆招商银行,如何借助校招抢夺金融科技人才?牛客独家大揭秘!
  7. (Java版)颈椎病治疗最近云海学长一直对着电脑改bug, 颈椎不舒服, 希望各位小伙伴帮云海学长治治提供一张图片, 将图片旋转后再发给云海学长, 这样学长看图的时候就需要歪着脖子, 时间久了,
  8. android 通过wifi调用打印机
  9. 如何用一简单的CSS制作响应式HTML网页
  10. 二级python多少分过_计算机二级考什么?计算机二级考试多少分及格?