Androidアプリ開発における端末多様性の問題 (1)

Android端末が色々出回ってきて端末の多様性が幅広く=差異が大きくなってきている昨今、開発者からの問題提起から外部からのFUDまで、色々と話題に上ることが多くなってきました。
どうであれ話題になるのは良いことなのですが、割合としてFUDの方が圧倒的に多いので、FUDしてる方々がいかに馬鹿であり知ったかで語っているかをdisってみたり、本当はどのような問題が存在するのかを挙げてみたり、その上で実際に互換性の高いAndroidアプリを作るにはどうするのが良さそうかまとめてみたり、そういうことをしてみようかと思います。
一度に書くと長いので、気が向いた時にちょこちょこ書いていきます。
そんなに高度な話をするつもりはないです。
まず基本的なとこ。


■端末ごとにAndroidバージョンがバラバラ問題
Androidのバージョンは大きく分けて1.5以下と1.6以上の2つに分けられます。
●問題のあるケース
互換性に問題が出るのは1.5と1.6の間です。
1.5では最大でHVGA解像度までしか対応しておらず、1.6で多解像度対応の処理が色々追加されたため、1.5向け(SDK3)で作ったアプリを1.6以上の端末で動かすのはあまり勧められません。
●問題のないケース
一方、1.6以上は重大な互換性問題を引き起こすAPI変更は行われておらず、というか基本的なAPIにはバグフィックスや機能追加以外に手が加わっていないので、1.6向け(SDK4)で作ったアプリは2.2まで問題なく動作します。
API仕様上はともかく実態としてどうなんだよというと、実用上2.2は1.6の完全上位互換OSと考えて差し支えないでしょう。アドレス帳の処理だけ変更があったという話がありますのでそこだけ注意が必要ですが、そこ以外で「1.6で動いていたのに2.xで不具合が出る」ケースは少なくとも俺は聞いたことありません。
1.6以降の上位互換性は他のスマートフォン向けOSと比べても高い水準であると言っていいと思います。
■解像度がバラバラなので困る問題
Android1.6~2.2は大ざっぱに言ってQVGA・HVGA・VGAの3つの基本的な解像度と、そこから派生したWVGAやFWVGAなどのワイド系解像度がサポートされます。他にも、WQVGAなんて貧乏くさいワイド解像度とか、もっと中途半端な解像度とか、dpi的にはHVGA並なのに画面がでかいデバイスなんてのも有りです。
解像度の問題については2種類あり、ピクセルサイズが違う=dpiが異なるという問題と、画面の縦横比=アスペクト比が違うという問題の、2つがあります。
●dpi違いへの対応
dpiについては具体的にはQVGA/HVGA/VGAに対応してldpi/mdpi/hdpiと3つに分かれています。
端末自身のdpiは各端末が管理しており、アプリ側では画面レイアウト時にフォントサイズとか画像サイズとか指定する時に一律「mdpi換算で何ピクセルか」という単位を使うだけで、あとは端末の方で自分の画面サイズに合わせて変換してくれます。
単純拡大ではないのでフォントなどは綺麗にスムージングされます。ビットマップはお任せで拡大させてもいいし、手元で綺麗に拡大した画像を解像度3種類で用意しておけば勝手に使い分けてくれます。
とても簡単です。
●アス比違いへの対応
アスペクト比違いについてはある程度設計時点で考慮しておく必要があります。
基本的なやり方としては、レイアウト時に非ワイド系の画面を想定してレイアウトしておき、ワイド系の時は「余白があったらこの部分の表示領域を大きくする」といった指定をしておいて帳尻を合わせるのが簡単です。指定さえしておけば帳尻合わせは端末側で勝手にやってくれます。
画面サイズに合わせてもっと複雑な再レイアウトをしたいということであれば自力で頑張ることももちろん可能です。
ともかく、尺が足りない時もしくは尺が余った時にどうやって帳尻を合わせたいか、というビジョンを設計段階で持っておくことが大切です。一般アプリなら簡単ですが、ゲームだとどこをどう伸縮するかはセンスが問われるでしょう。
対応方針を決めてしまえば実装そのものは簡単です。
●実例
参考までに拙作の(黒歴史)アプリをQVGA/HVGA/FWVGAで表示させたSSを貼っておきます。この例は単純なものですが、真ん中のリスト部分で緩衝されて帳尻が合っているのが分かると思います。
これらは全てdpiに合わせた自動拡大・縮小と、「尺が余ったらリストに全部回せ」という指定だけで、解像度ごとに個別の対応なんかは一切していません。 もちろんWVGAのDesireやNexusOneでも動作していますし、怪しい解像度の怪しい中華タブレットでも動作している……らしい?です。

qvga1hvga1

fwvga1
■気が向けば書くかもしれない次回以降
・端末ごとの検証大変じゃね?
・マルチタッチとかキーボードの有無とかどうするの
・縦長端末と横長端末
OpenGLはサンプルコード触った程度で管轄外につきあまり触れる気ないです。
●余談
ところで俺がこの件を書こうと思うきっかけになったTweetDeckの件ですが、やっぱり飛ばしだったっぽいですね。デマの出所はどこなんだか。
上記拙作(黒歴史)アプリも「Android1.6以上でAndroidMarketが公式に搭載されたデバイス」であれば95%は動く自信があります。いやこの条件なら100%動作でもおかしくないか。
動作報告で見かけたデバイスはROM違いを除くとして多分20種弱くらいだと思いますが、今のところ「機種依存」の問題が出たことはないです。snapdragonの高速動作で再現性が上がる(ARM11でも再現するが再現性が低い)といったバグがあった程度ですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です