連載
» 2011年04月28日 16時26分 UPDATE

Embedded Android for Beginners(Android基礎講座):第10回 どうやってAndroidに移行するか (2/3)

[金山二郎(イーフロー),EE Times Japan]

 さて、既存の組み込み機器でQtを使っていたとして、どのようにAndroid化していくかを考えなければいけません。最初に失敗例を取り上げましょう。QtではC++でコードを記述するため、既存のC/C++実装を、構造をなるべく保持しつつJava化するアプローチを採った例です。

 この手法にはさまざまな欠点があります。UIがAndroidのものとは異なってしまい、C/C++のフレームワークが残るために、Androidと無理やりつなぎ込む形になります。例えば、一般にAndroidやJavaではポーリングの代わりにイベントドリブンというシステムが用意されています。ポーリングとは、他の複数のプログラムやデバイスに対して一定間隔ごとに順番に問い合わせる手法、イベントドリブンとは、何らかのアクションが起ったとき、プログラムに送られてくる信号に応じて処理する手法です。システム側はイベントドリブンなのに上位層でポーリングし、その差異を吸収する層をわざわざ構築して間に挟むといった具合です(図3)。

ALT 図3 LinuxベースからAndroidベースへの間違った移行例 図に示した実装でも動作するが、ポーリングとイベントドリブンが共存しているため、実行時の無駄が非常に多くなる。

 この他、C/C++で多用するいわゆるポインタ渡しを忠実に再現しようとして、実アドレスを保持するためのクラスを作り、Javaの層でポインタ演算まで行うような実装もいまだに見かけることがあります。しかし、ポインタ演算という概念そのものはJavaにはありません。このような場合には再設計が必要です。さらに、文字列処理用のAPIが用意されているのに、自前で操作するようなC/C++の実装を一生懸命Java化しているような例も見られます。システムが実装を持っているかどうかを、まず第一に確認すべきです。

 C/C++で記述されたネイティブアプリケーションをよく調べてみると、ネイティブ実装のまま、Java APIを介してアクセスできる形に容易に修正可能な場合がよくあります。多くの部分が少ない労力でAPI化できるとしたら、そのようなアプリケーションの設計は優れていると言って間違いありません。Javaへの移行以前に、ネイティブアプリケションの段階でコンポーネント化を進め、移行しやすい状態にすることをお勧めします。このような修正が加わっていれば、Javaアプリケーション本体はネイティブアプリケーションを利用する小さな実装で済みます(図4)。定義したJava APIはそのままにして、ネイティブライブラリをJava化できればいわゆるpure Javaアプリケーションになります。修正しやすく、拡張性に優れた実装です。このような作業は以下で紹介するJava化のステップで行うこともできます。

ALT 図4 LinuxベースからAndroidベースへの正しい移行例 アプリケーションをコンポーネントに分解し、API層(下)とアプリケーション層(上)として再設計することで、システムに余計な負荷が掛からない適切な構成にできた。

 なお、Linuxの場合に限らず、Androidに変更したことでシステム全体の負荷のバランスが変わります。組み込み機器では限られたハードウェアリソースを最大限に活用するためにさまざまな最適化が施されていますが、Android化した場合には、これまでの最適化が有効かどうか確認しなければなりません。あるものは取り除く必要があり、新たな最適化を導入しなければならないこともあるでしょう。

Javaからの移行とJavaへの移行

 Javaを生み出したSun MicrosystemsがOracleによる買収に合意したのは、2009年4月20日でした。その10日後、Android 1.5が発表されます。既に「Androidケータイ」は世に出ており、2009年11月にはAndroid 2.0を搭載したMotorolaの「Droid」の販売が始まりました。多くの問題を抱えつつも、これからAndroidが大きなムーブメントに成長することを誰もが確信していました。

 一方のJavaはと言えば、携帯電話機で本格的な商用化に既に至っていました。しかし、Androidによる置き換えには対抗できず、携帯電話機からBlu-ray Discプレーヤーやデジタルテレビに適用分野を移しています。Javaはシステム全体を定義した環境ではありません。Java認証さえ通るのであれば、どのようなOS上で動作させても構いません。ただし、Java APIそのものがUNIXなどの各種OSに共通のAPIを定めたPOSIXを強くイメージして作られているために、UNIX以外のOSにJavaを搭載するためには少なからぬ苦労を伴いました。

 Javaベースのソフトウェア構成を図5に示します。実はほとんどのJava搭載組み込み機器は、Javaベースと言うよりはJava「も」搭載しているシステムです。Javaはネイティブアプリケーションの1つであり、Javaが動作しているときもあれば、他のネイティブアプリケーションが動作しているときもある、という具合です。携帯電話機にJavaが載り始めたころ、あるメーカーの方がJavaを理解する際に、「Javaは1つのネイティブアプリケーション、JavaアプリケーションはJavaのデータ」として、ネイティブアプリケーションとJavaアプリケーションを区別していました。

ALT 図5 Javaベースのソフトウェア構成 Linuxの場合と似ているが、Javaがネイティブアプリケーションの1つとして扱われている。

 図5のような構成からAndoridに移行するとき、ネイティブアプリケーションとJavaアプリケーションをそれぞれ移行します。ネイティブアプリケーションの場合はLinuxからの移行で紹介した手法と同じです。Javaの場合は、当然既にJava化されていますから、これをAndroidのフレームワークに合わせれば良いことになります。Javaではなく、LISPやSmalltalkなど他の言語の環境が使用されている場合には、無理にJava化するのではなく、ライブラリ化あるいはサービス化し、APIを介してアプリケーションから使う形にするべきでしょう。

 Javaからの移行の他に、Javaへの移行も手法の1つとして覚えておいて損はありません。Androidはとにかくスケールの大きいシステムですから、突然移行するわけにはいかない場合も多いでしょう。そのような場合には、まずJavaベースのシステムに移行しておくという手もあります。マイグレーションステップを踏むことで、ソフトウェアの改善を小刻みに進めることができます。例えばApacheのオープンソースJava実装であるApache Harmonyは互換性が高くApacheのアプリケーションのほとんどが動作します。ライセンスはApache License 2.0ですから、商用利用でき、不要なAPIを削除するような修正も自由です。OSGi AllianceのようなJava対応のアプリケーションフレームワークを載せることで、アプリケーションのインストールなどの機能も追加できます*1)

*1)イーフローは、JITなどのサポートや個別カスタマイズが可能な組み込み機器向け複合サービスプラットフォーム「Hyperdroid」を製品化しており、Javaへの移行対象として利用できる。

Copyright© 2014 ITmedia, Inc. All Rights Reserved.

All material on this site Copyright © 2005 - 2014 ITmedia Inc. All rights reserved.
This site contains articles under license from UBM Electronics, a division of United Business Media LLC.