Androidシステムはwifiと4 gを同時に使用してインターネットに接続します

6323 ワード

バージョン情報:android 5.1.1 Linux version 3.10.49
需要:4 gで外部ネットワークにアクセスし、wifiで内部ネットワークにアクセスします.Androidシステムのデフォルトでは、wifiがネットワークに接続されると、4 gのデータリンクが強制的に切断されますが、実際にはwifiと4 gが同時にインターネットを利用する必要があります.この要求を満たすために、androidのネットワーク管理メカニズムを修正する必要があります.まずwifi接続を実現する際、4 gのデータリンクが強制的に切断されないようにする:frameworks/base/services/core/java/com/android/server/connectivity Servicesを変更する.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がネットワークに接続され、4 gのデータリンクが強制的に切断されることはありません.  $ 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-Irmnet_data0 www.baidu.comはpingが通じることを発見して、この時wifiと4 gはすべてすでにインターネットに接続したことを説明します.APPプログラムはsetProcessDefaultNetworkでプロセスとnetworkをバインドして特定のネットワークにアクセスできます.しかし、私たちの要求は1つのAPPのあるデータがwifiのあるデータが4 gを歩くことであり、APPとあるnetworkがバインドされることを望んでいない.これはデフォルトで4 gを歩いてインターネットを利用することであり、イントラネットipにアクセスするにはwifiを歩くことである.すなわち、システムを変更するwifiよりも4 gの優先度を優先させ、route ruleを変更してイントラネットipにアクセスする場合、wifiを歩く.システムを変更して4 gの優先度をwifi:android 5より優れている.1はネットワークスコアに基づいてネットワークの優先度を評価し、デフォルトではwifiのスコアは4 gより高い.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;
}

4 gネットワークのスコアを強制的に150に変更することで、wifiネットワークのスコアよりも常に大きいことを確保することができます.システムを更新します.ping www.baidu.comはpingで通じることができて、この時システムが優先的に4 gネットワークを歩くことを説明します(wifi APと外網が切れます).ping 192.168.10.1は通じません.
route ruleを変更するには:
デフォルトroute rule:ip rule 0:from all lookup local 10000:from all fwmark 0 xc 0000/0 xd 0000 lookup 99 00:from all fwmark 0 x 10063/0 x 1 fffflookup 97 130 00:from allfwmark 0 x 10064/0 x 1 fflookup 1022 130 00:from allfwmark 0 x 10064/0 x 1 fffflookup 1022 130 00:from allfwmark 0 x 10065/x 10065/x 1 fffflookup 1005 140000:from all oif wlan 0 lookup 1022 200 00:from all oooofall oif oif ooif oooooooofall ooif oooooormnet_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 wlan 0 pref 100修正後route rule:0:from alllookup local 100:from allto 192.168.10.0/24 lookup 1022 10000:from allfwmark 0 xc 000 0 0 0 0/0 xd 0000 lookup 99 00:from all fwmark 0 x 10063/0 x 10063/0 x 1 fff lookup 97 00:from all fwmark 0 x 10064/0 x 10064/0 fflookup 1022 00:130 00:130 00 from all fwmark 0 x 10064/0 x 1 fflookup 1022 00:130 00 00:130 00 00 from all fwmark 0 x 10065/0 x 1 ffff 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を変更する権限がある.