版本信息
android5.1.1
Linux version 3.10.49

需求:通过4g访问外网,同时通过wifi访问内网。
 android系统默认情况下,wifi连网时,4g数据链接会被强制断开,但实际有需要wifi和4g同时上网,为了满足这个要求,需要修改android的网络管理机制。
 首先实现wifi连网时,不让4g数据链接被强制断开:
 修改  frameworks/base/services/core/java/com/android/server/ConnectivityService.java

private void teardownUnneededNetwork(NetworkAgentInfo nai) {for (int i = 0; i < nai.networkRequests.size(); i++) {NetworkRequest nr = nai.networkRequests.valueAt(i);// Ignore listening requests.if (!isRequest(nr)) continue;loge("Dead network still had at least " + nr);break;}//nai.asyncChannel.disconnect();}
把nai.asyncChannel.disconnect(); 行mark掉。

  这样wifi连网,4g数据链接不会被强制断开了。
  $ netcfg
rmnet0 UP 0.0.0.0/0 0x00000041 00:00:00:00:00:00
r_rmnet_data8 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data5 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data6 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data4 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data3 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data2 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
r_rmnet_data0 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data4 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data2 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data3 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data0 UP 10.66.94.93/30 0x00000041 00:00:00:00:00:00
rmnet_data7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data5 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet_data6 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
wlan0 UP 192.168.10.10/24 0x00001043 34:87:3d:31:e4:77
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
p2p0 UP 0.0.0.0/0 0x00001003 36:87:3d:31:e4:77
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
dummy0 DOWN 0.0.0.0/0 0x00000082 d6:d1:38:38:ed:c8

  但此时,网络访问默认还是走wifi通道,把wifi AP与外网断开,ping下192.168.10.1可以ping通,但www.baidu.com会发现ping不通,
  指定network,再ping
  ping -I rmnet_data0 www.baidu.com  
  会发现可以ping通,说明此时wifi和4g都已经连上网了。
  APP程序可以通过setProcessDefaultNetwork把进程和network绑定来访问特定网络。但我们的要求是一个APP有的数据走wifi有的数据走4g,不希望APP和某个network绑定,这样就是要求默认走4g上网,访问内网ip则走wifi.即修改系统让4g的优先级优于wifi,修改route rule,使得访问内网ip时,则走wifi. 
  
  修改系统让4g的优先级优于wifi:
  
 android5.1是依据网络评分来评定网络的优先级,默认情况下,wifi的评分比4g高。可以修改
  frameworks/base/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
“`

private int getCurrentScore(boolean pretendValidated) {// TODO: We may want to refactor this into a NetworkScore class that takes a base score from// the NetworkAgent and signals from the NetworkAgent and uses those signals to modify the// score.  The NetworkScore class would provide a nice place to centralize score constants// so they are not scattered about the transports.

      if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
     return 150;
}

    int score = currentScore;if (isCneWqeEnabled) return score;if (!everValidated && !pretendValidated) score -= UNVALIDATED_SCORE_PENALTY;if (score < 0) score = 0;if (networkMisc.explicitlySelected) score = EXPLICITLY_SELECTED_NETWORK_SCORE;return score;
}

把4g网络评分强制改为150,这样可以确保总是大于wifi网络的评分。
更新系统,ping www.baidu.com可以ping通,说明此时系统优先走4g网络(wifi AP与外网断开)。 ping 192.168.10.1 不通。

修改route rule:

查看默认route rule:
ip rule
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup 99
13000: from all fwmark 0x10063/0x1ffff lookup 97
13000: from all fwmark 0x10064/0x1ffff lookup 1022
13000: from all fwmark 0x10065/0x1ffff lookup 1005
14000: from all oif wlan0 lookup 1022
14000: from all oif rmnet_data0 lookup 1005
15000: from all fwmark 0x0/0x10000 lookup 99
16000: from all fwmark 0x0/0x10000 lookup 98
17000: from all fwmark 0x0/0x10000 lookup 97
19000: from all fwmark 0x64/0x1ffff lookup 1022
19000: from all fwmark 0x65/0x1ffff lookup 1005
22000: from all fwmark 0x0/0xffff lookup 1005
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable

尝试添加一条route rule:
ip rule add to 192.168.10.0/24 table wlan0 pref 100
修改后route rule:
0: from all lookup local
100: from all to 192.168.10.0/24 lookup 1022
10000: from all fwmark 0xc0000/0xd0000 lookup 99
13000: from all fwmark 0x10063/0x1ffff lookup 97
13000: from all fwmark 0x10064/0x1ffff lookup 1022
13000: from all fwmark 0x10065/0x1ffff lookup 1005
14000: from all oif wlan0 lookup 1022
14000: from all oif rmnet_data0 lookup 1005
15000: from all fwmark 0x0/0x10000 lookup 99
16000: from all fwmark 0x0/0x10000 lookup 98
17000: from all fwmark 0x0/0x10000 lookup 97
19000: from all fwmark 0x64/0x1ffff lookup 1022
19000: from all fwmark 0x65/0x1ffff lookup 1005
22000: from all fwmark 0x0/0xffff lookup 1005
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable

这样就可以直接ping 通192.168.10.1了。
 
APP程序没有修改route rule的权限,我们想让系统在wifi连接AP后自动添加需要的一条route rule.
可以修改netd (system/netd/server/),netd有权限修改route rule.

android系统同时使用wifi和4g上网相关推荐

  1. android 手机同时使用wifi 和数据流量(3G/4G...)

    Android手机同时使用Wi-Fi和数据流量 大家都知道,当手机成功连接到Wi-Fi热点以后,手机所产生的上网流量都是通过Wi-Fi来传输的,而手机的移动流量会被禁用.但是,我们现在有特殊的业务需求 ...

  2. Android手机同时使用Wi-Fi和数据流量

    Android手机同时使用Wi-Fi和数据流量 大家都知道,当手机成功连接到Wi-Fi热点以后,手机所产生的上网流量都是通过Wi-Fi来传输的,而手机的移动流量会被禁用.但是,我们现在有特殊的业务需求 ...

  3. 屏蔽Android系统的WIFI功能 关闭Android系统的实体按键

    屏蔽Android系统的WIFI功能: 1.要root手机  2.安装re管理器 3.进入手机内存/system/bin/wpa_supplicant(文件无后缀). 4.re管理器改成读写模式后, ...

  4. Android 系统,Wifi连接后,显示wifi已连接但无法访问网络。

    7.1系统8.0系统,Wifi连接后,显示wifi已连接但无法访问网络. 原因: 连接wifi后,会访问google服务器,由于国内访问不了,所以会显示"wifi已连接,但无法访问网络&qu ...

  5. 如何直接打开android系统的wifi设置页面,防止intent劫持

    在android的app开发中,经常会遇到需要跳转至系统设置页面的需求.但是当你使用以下代码时: 如 Intent intent =  new Intent(Settings.ACTION_WIFI_ ...

  6. ADB命令指令控制Android系统的WIFI连接开启/关闭状态

    Android系统的usb调试已开启,连接电脑(有ADB环境) 1.在cmd中,进入shell指令模式 adb shell 2.进入ROOT指令模式 su 3. 打开WIFI指令 svc wifi e ...

  7. Android系统连接WIFI显示网络连接受限

    问题描述 使用Android设备打开设置,选择WIFI输入正确密码连接,会显示已连接,无网络,然后变成网络连接受限,实际可以使用此WIFI进行上网. 问题分析异常Log D NetworkMonito ...

  8. win10系统连接wifi后可以上网但是显示【无Internet,安全】解决 and Maple初始化失败问题

    win1系统笔记本电脑连接wifi后,下面的网络图标显示的是小地球[无Internet,安全],但是可以正常使用浏览器.微信等软件.之前一直有这个问题,但是既然电脑可以正常使用,就没管它. 后来使用M ...

  9. iperf android使用方法,FW: 使用Iperf工具测试android系统网络wifi的吞吐量wifithrougput...

    1 windows 上测试网路吞吐量工具 对于window测试网络吞吐量的工具 iperf windows版测试软件. 针对wifi性能进行测试. 操作举例: 1)TCP测试 服务器执行:#iperf ...

  10. 如何提升android系统,Android系统智能手机如何提升上网速度

    怎样才能保证使用的Android系统智能手机保持良好的上网速度呢?是重启手机?其实简单的重启并不能拥有很好的效果,在重启之前,我们还需要采取一些其它措施才能让Android智能手机在重启后上网更快,下 ...

最新文章

  1. 7个问题,直击管理的本质
  2. 剑指offer:第一个只出现一次的字符
  3. 三种方法实现CSS三栏布局
  4. php phpunit selenium,phpunit+selenium环境筹建
  5. flask那啥 pycharm专业版提供的模板
  6. apicloud使用指南
  7. Linux服务部署之NTP时间服务器
  8. 新型智能芯片防伪印章设备_思格特智能印章管理系统成功签约山东问童动力设备公司...
  9. java八大基本类型介绍
  10. 手写哈希(实现简单的加数、查询)
  11. 44.用Tornado实现web界面爬虫
  12. Bypass功能depletion mode
  13. Anaconda安装python模块
  14. html中css层叠样式表(行内样式,内嵌式,外部式)
  15. 学习记录476@linux硬盘分区
  16. Typora也能做思维导图?做笔记的又一个绝佳选择?
  17. Android WebView播放flash(判断是否安装flash插件)
  18. Fiddler is trying to download some required files to continue with the installation之解决方法
  19. Android9 HWbinder使用-注册service流程解析
  20. 我想去远方,我想出去走走,我想到处看看!!

热门文章

  1. 怎么给win10进行分区?
  2. 【python】Python学到什么程度可以面试工作
  3. 搭建安装kubesphere平台——在 Linux 上以 All-in-One 模式,附安装步骤—{全篇踩坑排坑记} kubernetes:k8s
  4. HCIA-Cloud Computing华为云计算IA认证笔记
  5. 浙江大学公开课《王阳明心学》
  6. 2020年重磅喜讯!热烈祝贺王家林大咖大数据经典传奇著作《Spark大数据商业实战三部曲》 畅销书籍第二版 清华大学出版社发行上市! 前浪致 Spark + AI 后浪
  7. 使用Diskgenius将U盘分区,分为启动盘和文件存储两大功能详解
  8. html oa 表单,OA表单制作(致远)
  9. 国内域名国内服务器,不备案解决80端口不开放方法
  10. 微信推送封面尺寸_微信公众号封面图、正文配图尺寸如何?如何选择、制作?...