2013年12月8日日曜日

AndroidでWiFiストレージ接続中でも3G/LTE経由でインターネット通信ができるようにする【root】


moyashiさんがiOSでやってたのをAndroidでもやってみる。

ひとりぶろぐ - FlashAirが、PQI Air Cardが使いやすくなる!WiFiストレージ接続中でも3G/LTE経由でインターネット通信ができるようにするiOSのWiFi設定


WiFi接続時でも3G/LTE接続を維持させる


Android、少なくとも今回試したNexus5はWiFi接続をすると3G/LTEインターフェースrmnet0がDownとなる。
これではWiFiストレージに接続しつつ3G/LTE通信をする事が出来ませんので先ずはこれをなんとかする。

確認方法はadb shellなどでnetcfgと叩けばOK


logcatを見た感じ、このあたりの制御しているのはConnectivityService.javaなのが分かった。

ConnectivityService.java
こいつのhandleConnectを弄ってWiFi接続しても3G/LTEを切断しないようにする。
ビルドするの面倒くさいのでsmali書き換えた。

services.odexの中の
ConnectivityServices.smali
    .line 2265
    invoke-direct {p0, v1}, Lcom/android/server/ConnectivityService;->isNewNetTypePreferredOverCurrentNetType(I)Z

    move-result v5

    const/4 v5, 0x0
    if-eqz v5, :cond_69
    #if-eqz v5, :cond_6a

    .line 2267
    iget-object v5, p0, Lcom/android/server/ConnectivityService;->mNetTrackers:[Landroid/net/NetworkStateTracker;

    iget v6, p0, Lcom/android/server/ConnectivityService;->mActiveDefaultNetwork:I

    aget-object v2, v5, v6

    .line 2270
    .local v2, "otherNet":Landroid/net/NetworkStateTracker;
    new-instance v5, Ljava/lang/StringBuilder;

これでWiFiと3G/LTEの両立が出来るようになる。

Defaultgatewayの変更


shell@hammerhead:/ $ busybox route
busybox route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
default         10.3.1.162      0.0.0.0         UG    0      0        0 rmnet0
10.3.1.160      *               255.255.255.252 U     0      0        0 rmnet0
10.3.1.162      *               255.255.255.255 UH    0      0        0 rmnet0
126.211.134.30  10.3.1.162      255.255.255.255 UGH   0      0        0 rmnet0
126.211.134.62  10.3.1.162      255.255.255.255 UGH   0      0        0 rmnet0
173.194.126.135 10.3.1.162      255.255.255.255 UGH   0      0        0 rmnet0
192.168.1.0     *               255.255.255.0   U     0      0        0 wlan0
192.168.1.1     *               255.255.255.255 UH    0      0        0 wlan0

こんな感じになってしまうので、

#busybox route del default gateway 192.168.1.1

って感じでWiFi側のゲートウェイを消してやる。

いちいちこんなの手動で打ち込むの頭悪いので自動化する。
Llama - Location Profiles
Locale Execute Plug-in

LlamaでWiFi接続をトリガーにし、 Locale Execute Plug-inで上記コマンドを実行するようにした。

問題点


  1. TaskerでWiFiの切り替わりをトリガーにするイベントがうまく動かなくなる。
  2. WiFi切断すると3G/LTE通信が出来なくなる。

1.はLLamaならうまく動いてるのでまぁいいかなと…
2.は一度モバイルデータをOFFにしてからONにしてやると通信出来るようになる。
WiFi切断したタイミングでモバイルデータOFF、ONするように自動化させて対応させてるけどなんだかなぁ感すごい。
2.は気のせいだったようだ…

あと、WiFiストレージ繋いだ際のDNSを8.8.8.8にしておいた方がいいかもね。


とりあえず出来たよ!な感じなのでもっといい感じに実装してくれる人が現れるのを待ちます。