Androidを組み込み機器に採用するかどうか、意思決定の技術的根拠を確かにするスキルが必要です。ソフトウエアの大まかな構造をつかみ、Androidの最新動向、APIなど広く目配りすることが欠かせません。
→「Embedded Android for Beginners(Android基礎講座)」連載一覧
前回は、Androidの応用範囲とその可能性を紹介しました。他にも、Androidを適用することでより使いやすくなったり、便利になる例はたくさんあります。ただし、適用しにくい例もあります。無理に使って残念な結果に終わることもあるのです。
悪い結果が出てしまうことを防ぐには、タイミングやコストなどを見定めるビジネスセンスも大切ですが、意思決定の技術的根拠を確かにするスキルが必要です。今回は、Android導入を検討するには、どのようなスキルを身につけておくべきかを考えます。
まずは、Androidの大まかな構造をつかむ必要があります。図1はAndroidプログラム開発者向け公式WebサイトにあるAndroidの大まかな構造を示したものです。どのような機能があるのかを把握しておきましょう。
そして図1の「コアライブラリ」にどのようなAPI(Android API)があるのかということもつかんでおきたいところです。公式ドキュメント(図2)をさらっと眺めて、Android APIを利用するとどんなことができるのかを覚えておくとよいでしょう。Androidは膨大な数のAPIを持っていますので、浅く広くという気持ちでドキュメントを読む程度で十分です。この時点で、APIの細かい使い方まで覚える必要はありません。
あらかじめAndroidが備えている機能や、Android APIの概要を知っておくと、自分の手掛ける機器にAndroidを適用できるかどうか素早く判断できます。そして、前回説明したようにAndroidが内蔵するOSはLinuxなので、デバイスドライバソフトウエアは比較的簡単に調達できます。Linuxで利用できるドライバソフトウエアにどんなものがあるのかを調べておくのもよいでしょう。
Androidの最新情報に目を光らせておくことも大切です。例えば、2010年5月に登場したAndroidの最新バージョン(2010年9月現在)である「Android 2.2」から、Androidの仮想マシン「Dalvik」に新たな機能が加わりました。
従来のDalvikでは、アーキテクチャから独立した中間言語の形になっているプログラムを仮想マシンが解釈しながら実行する「インタプリタ」という方式でプログラムを実行していました。それが、Android 2.2のDalvikからは、中間言語のプログラムを実行時に機械語に翻訳する「JIT(Just In Time)コンパイル」という機能が加わりました。プログラムをJITコンパイルしてしまえば、実際のマシンが理解できる機械語のプログラムを直接実行するので、仮想マシンがプログラムを解釈実行するよりも実行時間が短くなります。
JITコンパイルの機能を備えていない従来のDalvikは、プログラムの処理が遅いという評判が立っていました。そのため、処理速度を高めるべくAndroidのNDK(Native Development Kit)を利用している開発者が目につきます。NDKを使うと、Java言語で作ったのでは処理が遅いプログラムをC/C++言語で作ることが可能になります。ただし、Javaと違って、C/C++言語を使ってプログラムを作るときは、細心の注意を払わないと、リセットなどの深刻な問題を引き起こすプログラムが簡単にできてしまいます。プログラムの品質が下がるのです。
DalvikのJITコンパイラを使うことでプログラムの処理速度が自動的に高まる現在では、NDKを高速化のために使用すべきではありません。例えば新しい周辺機器や、C/C++言語で作られた特別なライブラリを使用する際に、それらとアプリケーション層とをつなぎ合わせるために使用されるべきです。このような判断も、Java/Androidの様々な情報に触れていればこそ下せるようになるのです。
Androidを正しく理解するには、UNIXの知識が欠かせません。Androidの基盤となっているOSであるLinuxは、UNIXによく似せてあるOSです。POSIXという共通のAPIを使用でき、シェルのコマンドもほとんど同じものが使えます。
プログラム実行に深く関わる「シグナル」などの仕組みも、UNIXとLinuxの両方に共通するものです。このようなソフトウエアにおける基本的な仕組みを正しく理解し、活用できれば、プログラムを作る際にも正しく設計できます。問題が発生したときは、正しい知識が問題を収束させてくれます。開発者に正しい知識があるのとないのとでは、最終製品の品質に大きな差ができます。正しい知識を身に付けていないと、問題が発生したときに収束させることができず、最終製品までたどり着かないということもあります。
UNIXの知識はAndroidのアプリケーション開発言語であるJava言語にも関係します。Javaはサン・マイクロシステムズが生み出したソフトウエア実行環境であり、Java言語はそのプログラミング言語です。BSD UNIXの開発メンバーであるBill Joy氏が創業メンバーに名前を連ねているように、サン・マイクロシステムズはUNIXと切っても切れない縁のある会社です。Sun OSはBSD UNIXの発展形であり、Javaの開発にもBSD UnixやSun OSの開発メンバーが深く関わっています。
Javaのリファレンス実装は、基盤となるOSとしてUNIXを想定しており、Java APIをよく見ると、POSIX APIを薄いJava APIでくるんで(ラップして)あるだけの「ラッパーAPI」が少なくありません。プロセスなどのUNIXの仕組みを想定したAPIもあります。つまり、JavaにはUNIXの設計思想が色濃く反映されているのです。AndroidはDalvikという独自設計の仮想マシンを採用してはいますが、アプリケーション開発のためのプログラミング言語としてはJava言語を採用しており、コアとなるJava APIもJava互換のものを用意しています。
Androidでプログラムを開発するには、Java言語やC/C++言語の知識がもちろん必要になります。しかし、プログラミング言語に関する表面的な知識はよい教科書があれば短期間で覚えられるものです。
技術者の経歴書には必ず習得した言語が記載してありますが、実はこの情報はまったく役に立たないと言っても過言ではありません。いくらJavaを使ってきた経験が長くても、他人が設計したプログラムのメソッドの中身を作るだけの仕事を延々と続けてきただけでは、Javaについてごくわずかな知識しか身に付きません。
逆に、Javaの経験がなくても、UNIXサーバの管理業務でスクリプト言語を多用してきた技術者は、そこで得たUNIXの知識をAndroidでも生かせるかもしれません。ちなみに、多くのスクリプト言語もUNIXに由来しています。
技術者が本当に身に付けなければならないのは、先に説明したようなOSの構造や概念に関する知識と経験であり、それを生かした適切な手法の選択こそが「技術センス」と言えます。
組み込み機器へのAndroid導入を考えるなら、ソフトウエアのことだけでなくハードウエアのことも理解しておく必要があります。ただし、ハードウエア設計に関わるのでなければ、ハードウエアの深い知識は必要ありません。大まかな知識で十分です。
組み込み機器にもいろいろあり、4ビットマイコンを搭載したごく小さなものから、高性能な32ビットプロセッサを搭載した機器までさまざまです。Androidを導入できる組み込み機器を考えると、性能的な観点から、まず32ビット以上のプロセッサということになります。
組み込み機器にAndroidを搭載して、何らかのサービスを展開する場合、最低限の情報としてCPUの種類とその動作周波数、RAMの量、ROMの種類と量、周辺機能の種類くらいをつかんでおけばよいでしょう。
単純にAndroidを組み込み機器で動作させることを考えた場合、プロセッサはARM11であればまず問題ありません。ARM9ならば、遅いと感じることが多くなりますが、そこそこ動くという感じでしょう。ARM以外のプロセッサでは、DalvikのJITコンパイル機能を利用できず、インタプリタ動作になってしまうので遅くなります。ただし、これはオープンソース版の話で、商用のJITコンパイラ付きDalvikはさまざまなCPUに対応しています。
組み込み機器ではリソースの制約が厳しいので、効率の悪いプログラムを作ってしまうと、簡単に露見してしまうということにも注意しましょう。
Androidはオープンソースのソフトウエアプラットフォームです。ソフトウエア開発にも統合開発環境「Eclipse」(図3)や、バージョン管理システム「Git」など、オープンソースソフトウエアを利用します。使い方に独特なところがあるソフトウエアもありますので、Androidでソフトウエア開発を考えているなら、日ごろからオープンソースソフトウエアを利用してその使い方に慣れておくとよいでしょう。
そして、オープンソースソフトウエアを利用するときは、ソフトウエアのセキュリティ対策や品質については自分で責任を負わなければいけません。新バージョンのリリーススケジュールを常に気にしておく必要がありますが、機器を製品として仕上げるには、新バージョンを追い求めるのではなく、セキュリティ対策や品質を保証することを優先させなければいけません。
Androidと競合するようなソフトウエアプラットフォームとの比較情報と動向も押さえておきたいところです。Androidへの乗り換えを考えている顧客は、競合するプラットフォームと比較したがるからです。コストや期間などを総合的に考えると、Androidを使わない方がよい場合もあるのです。Qtなど旧来のウィンドウシステムとLinuxを組み合せたプラットフォームは、消費メモリや実行効率の点でAndroidより有利です。しかし、プログラムの作りやすさにおいてはAndroidが圧倒的に優位です。対象となるアプリケーションのためにはどちらが良いのか、よく吟味して考える必要があります。
また、Androidと直接競合するものではありませんが、現在はアドビシステムズが開発した「Flash」技術にも注目するとよいでしょう。Android 2.2でFlashが使えるようになりました。アップルはiPhoneやiPadでFlashが動作することを嫌ったため、iPhoneやiPad向けのFlashは登場する見込みもなくなりました。
FlashがiPhoneやiPadでは動作する見込みがなく、Androidでは動作するということを考えると、面白い機能に見えてきます。Flashは既存コンテンツも開発者も多いので、上手く活用すれば大きな付加価値を生み出せるでしょう。
金山二郎(かなやま じろう)氏
株式会社イーフロー統括部長。Java黎明(れいめい)期から組み込みJavaを専門に活動している。10年以上の経験に基づく技術とアイデアを、最近はAndroidプログラムの開発で活用している。
Copyright © ITmedia, Inc. All Rights Reserved.