2013年8月25日日曜日

iOS開発とAndroid開発の比較

iOS開発 vs. Android開発

という記事を読んで面白かったので、両端末開発が可能な(しかし最近は.NETが面白いので仕事以上では触っていない。iOS7についても少し調べる時間を作らないと…)自分も何か書いてみる。

iOS開発


最初に覚えることは多い。Objective-C、Cocoa Touch API。一般的な入門書で扱っている知識はここまでだけど、iOS Developerを名乗るのであれば、blocksやGCDなどモダンな知識、MRCやObj-C2.0以前のKVO、KVCなどレガシーな知識、Cocoa Touchの土台であるCore系技術についても習得する必要がある。

Core Imageは現状ではiOS端末で実用的な動作を実現できないのでどうでもいいとして、最低限Core GraphicsとCore Animationは覚えたい。Core Dataを覚えればフレームワークの性能を引き出し、iCloudとの連携についても取り計らってくれるのだけど、Core Dataフレームワークを理解するのは結構しんどいので、業務上で使うときには、FMDB経由でSQLiteを使うという方法が安牌かもしれない。

まあとにかく覚えることは多いけど、言語として面白いのでそれほど苦にならなかった。上の記事ではドキュメントの質が低いとあるけれど、確かにiOSのドキュメントはあまり整備されないのでバージョンがバラバラなドキュメントが入り乱れていて、困るときもあるのだけれど、Class Referenceに関して言えばAndroid DevelperのJava Docよりも充実していると思う。Discussionに何度助けられたことか。

ネイティブレベルの英語力があれば、読めるドキュメントの幅も広がるのでまた見えるものが違うのかもしれない。

Interface Builderはデザイナーとしては使えない(特にUIAppearanceが実行時にしか反映されないのは厳しい)けど、「オブジェクトを配置して相関を定義してシリアライズするもの」として割り切れば、「使い物にならない」と切り捨てるほどでもないと思う。ただ4インチ対応が必要になって以降、Auto Layout関連の挙動が直感的じゃないので、ひどく使いにくくなったのは事実。

Android開発


Javaの知識がある程度(Effective Javaが読める程度)あれば、Androidフレームワークを齧りながらでも開発ができるので敷居は低い。

しかしiOSのように低レベルフレームワークにアクセスすることができないのは致命的な弱点でもあって、例えばAndroidにはCore Textに相当するような低レベルで高品質なテキストレンダリングエンジンがないので、Androidの電子書籍アプリは端末によって見栄えの違いが生じたり、動作がもっさりしていたりと総じて質が低くなってしまっている。

「Androidといえばフラグメンテーション(断片化)問題」と思い込んでいる人が多いけれど、実際のところ多画面、多バージョン対応用向けの機能は充実していて、リソース分岐や9patchを駆使することができれば、遥かに多種多様なデバイスに対応しなければならないWebサイトよりも、ずっとずっと楽だと思う。

この辺り、Androidフレームワークを理解した上でそれに合わせて多画面でも動作するアプリケーションを作る、というやり方をせずに、固定サイズの画面に向けた既存のデザインをAndroidに流用しようとするから無理が出るだけじゃないのかなぁと思っている。

Androidの画面作りは、Webの画面作りに似たところがあって、まずボタンなどのコンポーネント見栄えをThemeリソース(CSSに相当)で定義して、それをXMLで定義していくというボトムアップなアプローチが向いている。GUIのレイアウトエディタは実際の編集に使うのではなく、実機出力のプレビューとして使う方がいい。Android Studioで実用的な速度で使えるようになったけど、XMLでの書き方を覚えた方が効率的なビューを作れる。

そういえば昔はエミュレータでしか階層ビューワが使えなくて、そのためだけにエミュレータを使っていたのだけど、今では実機でも使えるようになったので久しくエミュレータを起動していない。

長期的視点


Androidは2から4でまるで別物のように生まれ変わったけど、開発者視点ではJDK7への対応が異様に遅かったり(そういえばGAEもなぜかJDK7対応は異様に遅かった)や、JUnitはいまだに3で書かないといけないし、進化はのんびりしている。

それでいて、バックポートライブラリが提供されるため、4系で新規に追加された機能群を2系に対応することができる。遅すぎる感はあるものの、ようやくAction Barも対応されました。

このためAndroid 2.3で作成したアプリを4で動かすこともできるし、4向けAPIであるAsyncTaskLoaderやActionBarを利用したアプリを作っても、2系でも起動することができる。

対するiOSはバージョンが変わる度にAPIの内部仕様が目ぐるましく変化し、言語の構文や規則までもが変わるといったことがままにある。このためiOSの開発者で居続けるためには、常に最新の情報にアップデートしていく必要がある。

「ユーザーの端末もほとんどが最新のものに切り替わっていくので、iOSにはフラグメンテーションの問題はない」みたいな話を良く聞くけど、それは環境などによる。iOS4以前に作られたレガシーなフレームワークを利用したいときもあるし、流行り始めたiOS4時代のAPIで書かれたアプリをiOS6~7に対応せよというメンテナンス案件やら、サポートするリスクリターン考えずにiOS4からの対応にせよという命令も多いので。

このため長期的な保守については、現時点ではAndroidの方が圧倒的に楽だと思う。もっともiOSも成熟期に入り、今後マルチタスク化などの大きなパラダイムシフトはないと思うし、XCode5でテスト環境が充実していくという話もあるので、今後の見通しは分からないけれど。

0 件のコメント:

コメントを投稿