• Android默认只支持一个网卡。

Mobile/Ethernet/Wi-Fi不能同时存在。

但是,linux是可以同时支持多网卡存在的。

  • 如何在Android上实现多网卡

-  去掉Android Framework中只允许一个网卡存在的逻辑

可以通过修改网卡的优先级,再加上把AndroidFW中关掉低优先级的网卡的代码注释掉来实现。当前还有其他方法来实现,比如让AndroidFW不监听linux的指定种类的网卡事件,也可以避免AndroidFW关闭该种类的网卡。

- 为AndroidFramework没有支持的另外的网卡,配置路由规则(ip rule/ ip route)

  • 路由规则简介
  1. android route表number和name的对应的文件路径

/data/misc/net/rt-tables

    2. ip rule

Linux是在内核2.1开始采用策略性路由机制的

输入ip rule可以看到当前的策略

[email protected]:~/super_repo/super-repo$ ip rule0:      from all lookup local 32766:  from all lookup main 32767:  from all lookup default 

ip rule的第一列为路由策略的优先级,0为最小,32767最大。所以,图示的最有效的策略为第一条,内容大概是,从所有ip的网络访问,都去main路由表里面去找路由。

英文版,来自main ip-rule

Priority: 0, Selector: match anything, Action: lookup routing table local              (ID 255).  The local table is a special routing table containing high              priority control routes for local and broadcast addresses.              Rule 0 is special. It cannot be deleted or overridden.

3. ip route

Android, 在/data/misc/net/rt-tables里面,可以android route表number和name对应关系。

Ubuntu, 在/etc/iproute2/rt_tables中可以看到对应的关系。

[email protected]:~/super_repo/super-repo$ cat /etc/iproute2/rt_tables ## reserved values#255     local254     main253     default0       unspec## local##1      inr.ruhep

我们看到系统启动以后,默认有3张路由表,local/main/default, 分别的number为255/254/253

表255 本地路由表(Local table) 本地接口地址,广播地址,已及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。

表254 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如route)所添加的路由都会加到这个表。一般是普通的路由。

The main table is the normal routing table containing all
              non-policy routes. This rule may be deleted and/or overridden with other
              ones by the administrator.

表253 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。The default table is empty(这句话是从man ip-rule找到的)

查看指定route表的命令(可以确认,254号表名为main, 输出内容一样)

[email protected]:~/super_repo/super-repo$ ip route list table 254default via 192.168.0.1 dev enp0s3  proto static  metric 100 169.254.0.0/16 dev enp0s3  scope link  metric 1000 172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown 192.168.0.0/24 dev enp0s3  proto kernel  scope link  src 192.168.0.105  metric 100 [email protected]:~/super_repo/super-repo$ [email protected]:~/super_repo/super-repo$ [email protected]:~/super_repo/super-repo$ ip route list table maindefault via 192.168.0.1 dev enp0s3  proto static  metric 100 169.254.0.0/16 dev enp0s3  scope link  metric 1000 172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown 192.168.0.0/24 dev enp0s3  proto kernel  scope link  src 192.168.0.105  metric 100 

4. 为Android网卡添加路由规则

linux网络数据传输时,选择路由的步骤分为两步:

第一步,通过ip rule选择路由表;第二步,在路由表中,选择合适的路由项来作为自己的路由。

因此,配置多网卡路由也有两种方法,分别是通过ip rule和ip route

- ip rule

ip route add to 192.168.2.0/24 table main // 来自 192.168.2.0的数据包,使用 main 路由表中的路由规则

- ip route

ip route add 192.168.43.0/24 dev wlan0 proto static scope link table eth0 // 多网卡,如果当前Android framework的网络是eth0,那么使用的路由表是Ethernet的路由表,Wi-Fi网卡为Android Framework没有识别的另外一个网卡。因此,将发往Wi-Fi网卡的路由规则,加入到名为eth0的路由表中。

如何查看此时的Wi-Fi网卡的路由规则

ip route list table main

192.168.43.0/24 dev wlan0 proto kernel scope link src 192.168.43.3

注:

通过ifconfig eth0 192.168.1.100会将eth0相关的路由项加入main路由表中。但是,默认情况下,系统没有路由策略来使用main路由表。所以,需要添加路由策略来使用mian路由表,或者将该路由项加入其他正在被使用的路由表中。

Android FW会为正在使用的网卡,添加对应的路由策略,可以在netd的代码中查看到相应的逻辑。

更多相关文章

  1. Android代码混淆之混淆规则
  2. android 操作路由表
  3. Android 开发 UI 规则
  4. android 资源ID规则
  5. android 资源文件命名规则 drawable mipmap一样的
  6. 关于Android中drawable必知的一些规则
  7. Android智能手机搜索不到路由器无线信号怎么办?
  8. Android 开发之关于 drawable 你必须知道的规则
  9. Android Market排名算法及规则

随机推荐

  1. android 自定义接听电话时报错:java.lang.
  2. RXJava
  3. Android多线程机制和Handler的使用
  4. Starting : Intent{...} Error type 3...
  5. Android的手势操作识别
  6. [Accessibility] Missing contentDescrip
  7. 【Android】getDimension,getDimensionPi
  8. Android显式intent和隐式intent
  9. Android开发--Intent-filter属性详解 (转
  10. 获取手机的mac地址