2011年4月24日日曜日

Androidの抱えるバージョン格差問題

 先月から、毎日のようにAndroidのソースをさまよい歩く日々が続いています。何かアプリを作ろうという訳ではなくて、目的は専らトラブルシューティング。

 何件か問題を解決していく過程でわかったのは、Androidは既にリリースしたバージョンに対するバグフィックスが殆どなされないという事でした。開発の先端バージョンでは、解決可能なバグは修正されているのですが、旧バージョンのブランチにマージされないのです。Froyoで修正された問題はEclairにはマージされませんし、Gingerbreadで修正された問題はEclair,Froyoにマージされません。最新バージョン以外では、修正の恩恵を受けられないのです。Androidのリリースエンジニアリングについて完全に把握しているわけでは無いので、もしかすると私が誤解しているのかもしれません。リリースブランチなど存在せず、masterブランチにタグが打たれているだけのようにも思えます。そう思えるほど、旧バージョンのサポートは手薄です。まさに「放置」と呼ぶにふさわしい状況。具体的な例は挙げられないのですが、リセットに至るようなレベルのバグでも放置です。

 問題の原因を発見して解決方法を考え、それが最近のバージョンで修正されている事実を初めて知った時の脱力感は忘れられません。それ以来、問題解決の手法は、リポジトリの履歴を辿って、既に修正がcommitされていないか探すところから始めるようになりました。そして、このやり方で複数の問題が解決されつつあります。

 未だにEclair,Froyoなどという旧バージョンを相手に開発している体制に問題があると言われればそれまでかも知れません。対象の開発スピードが速いのだから、もっとスピーディーに追従すべきというのは正論でしょう。ですが、Androidの公開リポジトリを見ると、「そっちもバージョン上げないの?」と言いたくなる問題が存在します。
 実はAndroidには、バグ修正のリリース間格差だけでなく、同じリリースの中でもexternalの下は数年前の旧バージョンのまま放置という、モジュール間格差が存在します。お陰で、カーネルの更新にexternalが追いつかず、externalの下のコマンドが使っている旧APIがカーネルから削除されるという問題まで生じています。これは、Androidのバージョンを上げても解決されません。むしろ、Androidのバージョンを上げるとカーネルのバージョンが進むので、静かに進行していた問題が顕在化します。Googleがカーネル以外を含んだ全体をきちんとサポートしていればいいのですが、それが期待できれば苦労はしません。

 旧バージョンに居残っても、新バージョンに進んでも問題にぶち当たるのがAndroidです。とは言っても、新バージョンへの移行は当然の流れですし、全体的に見れば新しい方が解決すべき問題は減る傾向にあるので、前へ進んでいく以外の選択はありません。