Android はさまざまな端末やフォーム ファクタのために作られた、オープンソースかつ、Linux ベースのソフトウェア スタックです。Android プラットフォームの主なコンポーネントを図に示します。

図 1. Android ソフトウェア スタック
Linux Kernel
Android プラットフォームの基盤は Linux kernel です。例えばAndroid ランタイム(ART)は、スレッドや低レベルのメモリの管理などの基本機能を Linux kernel に依存しています。
Linux kernel を使うことで、Android は主要なセキュリティ機能を活用でき、端末メーカーは有名なカーネル向けのハードウェア ドライバを開発できます。
Hardware Abstraction Layer(HAL)
HAL(Hardware Abstraction Layer)の標準インターフェースにより、端末のハードウェア機能はハイレベルの Java API フレームワークに対応できます。HAL は複数のライブラリ モジュールで構成され、それぞれが特定のタイプのハードウェア コンポーネントに対応するインターフェースを提供しています。たとえば、カメラや Bluetooth モジュールなどです。フレームワーク API が端末ハードウェアにアクセスを要求すると、Android システムがそのハードウェア コンポーネントのライブラリ モジュールを読み込みます。
Android ランタイム
Android バージョン 5.0(API レベル 21)以降の端末では、それぞれのアプリが独自のAndroid ランタイム(ART)のインスタンスを使用して、独自のプロセスで実行されます。DEX ファイルを実行すると、低メモリ端末上で複数の仮想マシンを走らせるために ART が書き込まれます。DEX ファイルは、Android 専用に設計されたバイトコード形式のファイルで、メモリ フットプリントが最小限になるよう最適化されています。Jack などのツールチェーンを作成して、Java ソースを Android プラットフォームで動かせる DEX バイトコードにコンパイルします。
ART の主な機能を幾つかご紹介します。
- Ahead-of-time(AOT)と just-in-time(JIT)コンパイル
- 最適化されたガベージ コレクション(GC)
- Android 9(API レベル 28)以降における、アプリ パッケージの Dalvik Executable 形式(DEX)ファイルの、よりコンパクトなマシンコードへの変換
- より優れたデバッグ サポート。専用のサンプリング プロファイラ、詳細な診断用の例外処理、障害レポート、特定の項目をモニターするためにウオッチポイントを設定する機能など。
Android バージョン 5.0(API レベル 21)以前は、Dalvik が Android ランタイムの役割を担っていました。アプリが ART 上で問題なく動いていれば、Dalvik でも動くはずですが、その逆は動くとは限りません。
Android には Java 8 の言語機能など Java API フレームワークが使用する Java プログラミング言語の機能をほぼすべて網羅する主要なランタイム ライブラリがあります。
ネイティブ C/C++ 言語 ライブラリ
ART や HAL などの主要な Android システム コンポーネントやサービスの多くは、C 言語や C++ 言語で書かれたネイティブ ライブラリを要求するネイティブコードで構築されています。Android プラットフォームは、こうしたネイティブ ライブラリの機能をアプリに使ってもらうために Java フレームワーク API を提供しています。例えば、アプリで 2D/3D グラフィックの描画や操作を行えるようにサポートを追加するには、Android フレームワークの Java OpenGL API を経由して、OpenGL ES にアクセスします。
C 言語や C++ 言語コードが必要なアプリを開発している場合は、Android NDK を使うとネイティブ コードから直接ネイティブ プラットフォーム ライブラリにアクセスできます。
Java API フレームワーク
Java 言語で書かれた API を利用すると、Android OS の機能をすべて使うことができます。これらの API は主要なモジュラーシステム コンポーネントやサービスの再利用を簡略化し、以下のものを含む Android アプリの作成に必要なビルディング ブロックを構成します。
- 高機能で拡張可能な View System。リスト、グリッド、テキスト ボックス、ボタン、埋め込み可能なウェブブラウザなどが含まれ、アプリの UI 作成に利用できます。
- Resource Manager。ローカライズした文字列、グラフィック、レイアウト ファイルなどのコードではないリソースへのアクセスを可能にします。
- Notification Manager。すべてのアプリがステータスバーにカスタム アラートを表示できるようにします。
- Activity Manager。アプリのライフサイクルを管理し、共通のナビゲーション バックスタックを提供します。
- Content Providers。アプリが連絡先アプリなど、他のアプリのデータにアクセスしたり、独自のデータを共有したりできるようにします。
デベロッパーは Android システム アプリが使用するのとまったく同じ framework API をすべて利用できます。
システムアプリ
Android には E メール、SMS メッセージ、カレンダー、インターネットのブラウジング、連絡先など、一連の主要なアプリが搭載されています。プラットフォームに含まれているアプリは、ユーザーが自らインストールしたアプリに比べて特別であるわけではありません。そのため、サードパーティのアプリをユーザーのデフォルトのウェブブラウザ、SMS メッセージ、デフォルトのキーボードすることが可能です(システム設定アプリなどいくつか例外はあります)。
システムアプリは、ユーザーにとってのアプリ機能に加え、デベロッパーが自身のアプリからアクセスできる主要機能を提供します。例えば、自身のアプリで SMS メッセージを送りたい場合、その機能を自らビルドする必要はありません。代わりにすでにインストールされている SMS アプリを呼び出せば、指定した相手にメッセージを送信できます。