Thursday, March 11, 2010

Nexus One(Android携帯)の時刻同期のしくみ

ここ最近Nexus Oneの時計がずれるという話題があったのです。
それはCyanogenMod-5.0.4.1というカスタムロムに採用されいている2.6.33カーネルが原因だということが判明してます。(詳細はくろぺんさんが書かれています)

しかしながら、単純にカーネルのせいでずれるにしてもずれっぱなしとはなんとも解せない話でありまして、時刻同期のしくみを調べましたのでまとめることにします。
ちなみに、遅れるのはカーネルクロックだけで、デバイスクロックは遅れていないので、再起動時にカーネルがデバイスが取得する時に元に戻ります。(カーネルは起動時に物理デバイスから一度だけ時刻を取得し、以降は自前のロジックで時を刻む)

結論から申し上げまするに、Nexus One,あるいはHTCのAndroid携帯,もしくはAndroid携帯全般について言えば、NTP(SNTP)を使った時刻同期のしくみは用意されていません。(Nexus One, HT-03Aで確認)
つまりは、WiFiのみで運用している場合、時刻同期の手段がありません。
もっというなれば、SBM(少くとも黒SIM)で運用している場合も時刻同期の手段がありません。

勘違いされがちなのが、設定にある「日付と時刻」の「自動(ネットワーク自動設定)」というもの。
これはNTPなどインターネット経由での時刻同期のしくみではありません。携帯電話のネットワークで流れている時刻情報を元に時刻設定するもので、日本の場合、SBMはこれに対応していません。(NITZというらしい)
(仮にNTP機能だとしたら、NTPサーバを設定する項目がないのもおかしな話です)
実際のところ、docomoのSIMを差してこの機能を有効にすれば時刻同期はされます。OFFにして、時計をずらし、再びOにすると修正されるのがわかります。(no-SIMやSBMのSIMでは修正されない)
※ 実はiPhoneにも同様の機能がありますが、販売しているSBMで対応していないため、日本向けのiPhoneでは設定自体が表示されないようになっています。
ただし、この機能も端末起動時あるいは機内モードからの復帰時にしか時刻を取得しません。(トグルで調整されてるように見えるのはデバイスクロックと時刻取得時の差分をカーネルクロックに再適用しているだけっぽい)

さらに勘違いの元になっている /system/etc/gps.conf というファイル。
このファイルの中にはNTP_SERVER=north-america.pool.ntp.org などと記載されており、いかにもNTPで時刻あわせをしているかのように見えますが違います。
じゃぁこれはなんなのかと言われれば、GPSの原理の話になるんですが、かいつまんで言うとGPSってのは衛星から光の速さで送られてくる、衛星に搭載された原子時計の時刻情報と、それを受けとった地表での時刻情報を比較して衛星との距離を割りだし、位置を特定するというテクノロジらしい。(詳細)
つまり、地表での正確な時刻を知らなければ正しく測位できませんが、その時刻のためのNTPサーバを設定するファイルなのです。
Androidではこの時刻をデバイスクロックあるいはカーネルクロックには適用せず、GPSハードウェアへ知らせているだけです。(ちなみに4時間に一回問い合せており、失敗した場合は5分間隔でリトライしてます(ハードコード))
実際のところ、詳しくないのでよくわかりませんが、カーネルクロックと同期してないだけで、デバイスクロックは同期されているのかもしれません。(GPSデバイスがクロックソースなのかも)

そんなわけで、Nexus OneあるいはHT-03AなどたいしてカスタマイズされていないAndroid端末では、時刻同期の手段は携帯キャリアを使うしかないと思われます。

追記: 現在はNTPクライアントアプリがいくつかあります。

No comments: