2011/05/03

Androidの逆USBテザリング時に通信しないアプリが存在する理由

正確にはWiFi/3GがOFF、USBテザリングONのときに通信しないアプリが存在する理由。

私が使用している K-9 Mail、NewsRob、ついっぷるは逆USBテザリング時に自動同期しない。Android Marketでアプリをダウンロードできない。
その理由について考えた。

Android SDKのConnectivityManagerから、ネットワーク接続の状態を取得できる。
ConnectivityManagerが認識する接続の種類を挙げる。

TYPE_MOBILE
TYPE_WIFI
TYPE_WIMAX
TYPE_BLUETOOTH (非公開, 2.3.3から)
TYPE_DUMMY (非公開,2.3.3から)
TYPE_ETHERNET (非公開,2.3.3から)
(Sub Type) TYPE_MOBILE_DUN
(Sub Type) TYPE_MOBILE_HIPRI
(Sub Type) TYPE_MOBILE_MMS
(Sub Type) TYPE_MOBILE_SUPL

この中にUSBテザリングはない。
AndroidのUSBテザリングはUSB => WiFi/3G の方向での通信だけを想定していると思われるため、テザリング中であるか否かはAndroid端末内からの通信ができるかどうかと関係ない、ということなのだろう。

2.3.3で追加されているTYPE_BLUETOOTH, TYPE_DUMMY, TYPE_ETHERNETは@hideが記述されていて、Android SDKには非公開となっている。コミットログには

  Add some network types that OEM's are asking for.
  Adding them hidden so that if OEM's are rolling their
  own at least they can use the same values.
  Will mark them unhidden in a future sdk release.

と記述されていたので、企業からリクエストがあって追加した将来の互換性を保つための値で、わからないがTYPE_ETHERNETはEthernetインターフェースを装備したデバイスに使うのだと思う。Androidが動くNet Bookとか?

定期的にデータを取得するようなアプリは、ConnectivityManagerから接続状態を見て、未接続状態のときはデータを取得しない処理が実装されていることが多いと思われる。それが、アプリのお作法として適切だ。
したがって、WiFi/Mobile Data Connection/WiMAXが全て未接続であれば、USBテザリングのON/OFFには関係なく未接続状態だと判断されるだろう。
オープンソースであるK-9 Mailのソースを確認したらメールを同期する条件として、少なくとも全ての接続タイプのうち1つでもState.CONNECTEDであることが含まれていた。

なお、ConnectivityManagerでチェックせずに通信を開始するような機能は使用できる。
ついっぷるでは、「ネットワークに接続されていません」とメッセージは出ていても、手動で更新ができる。


#追記 5/5
ConnectivityManagerで接続状態を確認していることだけが理由ではなかった。
K-9 Mailはメール送受信用のサービスが常時動作しているが、常に走っているわけではなくネットワークが切断状態のときはサスペンドするようになっている。再び起動するのは ConnectivityManager.CONNECTIVITY_ACTION の Intent が通知されたときだ。
電力消費を抑えるための工夫だろうと思う。実験したところ、Android Marketについても同様のことが言える。

逆USBテザリングでメール待ち受けができるCyanogenModパッチを作って検証したら上手く動いた。

0 件のコメント:

コメントを投稿