わたしがAndroidを気に入っている理由
業務で携帯電話やスマートフォン向けのソフトウェアを製造する機会が多かったのですが、いまひとつ気に入ったアプリケーション実行環境・開発環境がありませんでした。ちょうど、Linuxを搭載した携帯電話向けのアプリケーションを開発するプロジェクトが終盤に差し掛かったころに、Androidが発表されました。
当初、Javaでアプリケーションが開発できると聞き、「PDAにJ2MEを載せてアプリケーションを実行することと大差ないプラットホームではないか」とみくびっていました1。
ところが、顧客の担当者から、Zaurusに載せて実際に動作するAndroidを見せてもらって、いい意味で裏切られました。そしてAndroidに興味を持つようになり、お蔵入りが決定していたプロトタイプをAndroidへ移植して、Android Developer Challengeに出場できないか、顧客の担当者に相談したこともありました。結局、出場しませんでしたが、いつかAndroidで動作するアプリケーションを作成するプロジェクトに加わりたいと思うようになりました2。
昨年、ようやくAndroidでソフトウェアを製造するプロジェクトを担当することになり、実際にプログラミングする機会を得られました。特に JITコンパイラが追加されてパフォーマンスが向上した2.2がリリースされてからは、携帯電話やスマートフォンに興味のないわたしでも、所有してもいいかなと思うようになってきました。
そこで、わたしがAndroidを気に入っている理由は次のとおりです。
#1 開発環境が無償で入手できる
Symbian向けのアプリケーションをC++で作成したことがあります。当時、コンパイラとしては、Visual C++、C++ BuilderX、または、CodeWarrior for Symbian OSのいずれかが必要でした。たまたま、別件でわたしの作業用PCにVisual C++ 6.0をインストールしてあったので、新たにコンパイラを購入することはありませんでしたが、個人でアプリケーションを開発することを考えた場合、SDKと最も親和性の高いCodeWarrior for Symbian OSはとても高価ですし、すでに.NET Frameworkでシステム開発が行われていましたので、いまさらVisual C++ 6.0を購入するのは無駄な投資のように見え、とても敷居が高いと感じました。
Androidの場合はインターネットに接続できる環境があれば、無償で開発環境が入手できます。アプリケーションを作成するためのハードルがとても低いことは魅力的です。
#2 JNI
従来の携帯電話向けJavaアプリケーションは、CLDCと採用するプロファイルで提供されるAPIを呼び出すことしかできませんでした。何か新しいことを始めるとき、独自にAPIを拡張できないことが足枷になってしまいます。また、VMで実行するとボトルネックになる部分をネイティブ化することもできませんでした。
AndroidではAndroid NDKが用意されていて、これらを解決できます。多少は制限があると思いますが、従来の携帯電話向けJavaアプリケーションの開発に比べると、自由度が高いことがうれしいです。
#3 アプリケーションサイズ
携帯電話向けJavaアプリケーションを作成していた当時は、movaとFOMAが混在していて、アプリケーションはどちらの端末でも動作できなければなりませんでした。特にmova機はアプリケーションサイズが最大で30Kbyteでしたので、ソースコードレビューで無駄なコードを取り除いた上でさらに難読化ツールを利用し、アプリケーションサイズを削る作業が必要でした。
今まで、何気なくAndroidアプリケーションを作ってきましたが、アプリケーションサイズに悩まされたことはありません。もっとも、これはAndroidがリソースに余裕のあるスマートフォンをターゲットにしたOSだからかもしれません。
#4 ソースコードが公開されている
SymbianのAPIに不具合(だと思う)3を発見したことがあったのですが、当時はソースコードが公開されておらず、原因の特定(呼び出し方の問題か、APIのバグなのか)ができず、対症療法的な対応で回避せざるを得ませんでした。顧客への報告もなんとも煮え切らない内容となりましたし、歯がゆい思いをしました。
Androidはソースコードが公開されていて、環境さえ整えられればビルドすることもできます。実装方法を調査したり、もし、不備があれば修正できるのは魅力的です。Android 1.5のブラウザのソースコードを調査して、WebView上で文字列選択を開始するときに呼び出すWebView.emulateShiftHeld ()
4を見つけられて、実装できないと思っていた機能を実現することができました。
さらに、公開されているほとんどのソースコードがApache Licenseなので、改修してもソースコードの公開をする必要がありません。携帯端末メーカーはAndroidを採用しやすいと思います。
#5 OSがLinuxである
学生時代からUNIX処理系に慣れていましたし、就職してからもLinuxをターゲットにしたアプリケーション開発していたので、それなりに知識があります。AndroidがカーネルにLinuxを採用しているおかげでノウハウが流用できることが、怠惰なわたしにはうれしいところです。
Androidは携帯端末向けにカスタマイズしてあるにせよ、Linuxなので、オープンソースで公開されているソフトウェアを移植できるため、いろいろな可能性を感じます。
この夏、Android VNC ServerをNexus Oneで実行できるようにする作業を行いましたが、このAndroid VNC ServerはLibVNCServerを利用して実装されていましたし、期待どおり動作しない問題をLinux Input Subsystemで解決できました。
#6 Javaでアプリケーションを開発できる
かつて、わたしがLinuxを搭載した携帯電話向けにネイティブ・アプリケーションを作成していたとき、GUIを実装するために利用できるライブラリは、Xlib、ひと昔前のGTK+(1.2ぐらいだったかな)でした。実験にはあまり本質的ではないアプリケーションの作成でしたので、ササッと作ってしまいたかったのですが、かなり苦労しました。
当時でもVisual Basic 6.0や.NET Frameworkを使って、比較的簡単にGUIを持つアプリケーションを作成することができていましたので、通常、フレームワークが隠してくれる煩わらわしさを自分で実装する必要があり、うんざりしてしまいました。
Androidでは使い慣れたJavaでプログラムを書くことができるし、VMのおかげでメモリに対して神経質になりすぎずに済みます。また、AWTやSwingを使わずにGUIを作成できることも気に入っています。
終わりに
今のように簡単にLinuxがPCにインストールできなかったころは、Linuxがわたしのおもちゃでした……。動作実績リストを見ながらPCを自作したり、カーネルを最適化したり、ウインドウマネージャに凝ってみたり……簡単にインストールできるようになってしまって冷めてしまいましたが、Androidで再びおもちゃを手に入れた心境です。
現在、顧客から借用しているNexus Oneはルート化してあって、権限を気にせずアプリケーションを実行できるのですが、電波法の問題で3Gが利用できません。残念です。日本でも3Gが使える開発端末……Android Dev Phone 2の後継機が出ることを期待しているのですが、いつになることやら……当面、職場のNexus Oneでガマンです。
1 当時、携帯電話向けJavaアプリケーションの性能問題に手を焼いていたので、Javaに偏見を持っていました。
2 自宅のPCは、当時も今もEclipseやエミュレータを動かすには非力なので、自宅でのアプリケーション開発は諦めています。そろそろ買い換えたいのですけど、他の誘惑に負けてしまい、いまだに買い換えられていません。
3 Symbian OS 7.0でTUriParser16::Parse()の引数にhttp://][
のような不正なURLを与えたときKUriUtilsErrInvalidUriが返却することを期待していたのですが、パニックUSER 10が発生しました。
4 API Level 8から公開されました。