Android Runtime

 次いで,アプリケーションの実行環境「Android Runtime」を解説する。Android Runtimeは,仮想マシン「Dalvik VM」と,基本的なAPIを提供するコア・ライブラリで構成される。

 Androidのすべてのアプリケーションは,Dalvik VM上で動作する(図4)。Dalvik VMは,Java VMと同様,メモリー管理をガベージ・コレクタ*が担当している。開発者がメモリーの確保と解放を明示的に実行しないでも,メモリー・リークによる深刻なシステム破壊を防いでいる。

* 【ガベージ・コレクタ】 メモリー上の不要な領域を回収してメモリー領域を広げるプロセス。
図4 Dalvik VMの動き
図4 Dalvik VMの動き
[画像のクリックで拡大表示]

 加えて,JavaからC/C++を呼び出すAPIのJNI(Java Native Interface)にも対応している。CやC++で書かれたネイティブのコードが実行可能となっている。

 Dalvik VMのアーキテクチャは,“レジスタ・ベース”を採用している。レジスタ・ベースは,CPU内部のレジスタにデータを格納して演算処理を実行する。一方,Java VMは“スタック・ベース”である。スタック・ベースは,一時的なデータ格納領域(スタック)にデータを格納して演算処理を実行する。仮想マシン(VM)の場合,スタックは主メモリー上に確保される。

 演算処理に主メモリー上のスタックが介在するスタック・ベースと比較して,CPU内部のレジスタのみで実行するレジスタ・ベースのアーキテクチャは,より高速に動作する。また,メモリー上にスタックを確保しないのでメモリーのフットプリント(動作に必要なメモリー量)が小さいとされる。 

 Dalvik VMが実行するのは,「Dalvik Executable(DEX)」と呼ばれる独自形式のバイナリ・プログラムだ。通常,レジスタ・ベースのバイナリは,スタック・ベースのバイナリに比べて容量が大きくなる。しかし,DEXでは,重複による無駄を極力減らし,Java VMのクラス・ファイルよりも小さいバイナリを実現している*1。重複を減らすために,内部的にクラス名,変数名やメソッド名をJavaバイト・コードのように文字列としてではなく,一意の名前(シンボル)に変換して管理している。

*1 Dalvik VMやDEXの最適化の詳細については下記の動画(英語)が詳しい。 http://www.youtube.com/watch?v=_KBvHqLSAHY&hl=ja

 開発者はDEXの作成を意識しないでよい。アプリケーション開発では,Javaのクラス・ファイル(.class)を作成するが,Androidが提供している開発ツール「dx変換ツール」で,Javaのクラス・ファイルからDEXに自動で変換する。 コア・ライブラリは,Java 1.5 SEと互換性を持つライブラリだ。アプリケーション開発者は,Java言語での開発と同じ感覚でコア・ライブラリを扱える。