Android は、さまざまなデバイスとフォーム ファクタ用に作成された、Linux ベースのオープンソース ソフトウェア スタックです。図 1 に、Android プラットフォームの主なコンポーネントを示します。

図 1. Android ソフトウェア スタック。
Linux カーネル
Android プラットフォームの基盤は Linux カーネルです。たとえば、Android ランタイム(ART)は、基本機能(スレッド化や低レベルのメモリ管理など)について Linux カーネルに依存しています。
Linux カーネルを使用すると、Android は主要なセキュリティ機能を活用でき、デバイス メーカーはよく知られたカーネル用のハードウェア ドライバを開発できます。
Hardware Abstraction Layer(HAL)
Hardware Abstraction Layer(HAL)は、デバイスのハードウェア機能を上���レベルの Java API フレームワークに公開するための標準インターフェースを提供します。HAL は複数のライブラリ モジュールで構成され、各ライブラリ モジュールには、カメラや Bluetooth モジュールなど、特定の種類のハードウェア コンポーネント用のインターフェースが実装されています。フレームワーク API がデバイス ハードウェアにアクセスするための呼び出しを行うと、Android システムはそのハードウェア コンポーネントのライブラリ モジュールを読み込みます。
Android ランタイム
Android バージョン 5.0(API レベル 21)以降を搭載しているデバイスの場合、各アプリは独自のプロセスと、独自の Android ランタイム(ART)のインスタンスで実行されます。ART は、Dalvik Executable 形式(DEX)ファイルを実行することにより、低メモリデバイスで複数の仮想マシンを実行するように書き込まれます。DEX は、Android 用に設計されたバイトコード形式であり、メモリ使用量を最小限に抑えるよう最適化されています。d8
などのビルドツールは、Java ソースを Android プラットフォームで実行可能な DEX バイトコードにコンパイルします。
ART の主な特長は次のとおりです。
- 事前(AOT)コンパイルとジャストインタイム(JIT)コンパイル
- 最適化されたガベージ コレクション(GC)
- Android 9(API レベル 28)以降の場合、アプリ パッケージの DEX ファイルを、よりコンパクトなマシンコードに変換する
- デバッグ サポートの強化(専用のサンプリング プロファイラ、詳細な診断例外とクラッシュ レポート、特定のフィールドをモニタリングするためのウォッチポイントの設定機能など)
Android 5.0(API レベル 21)より前のバージョンでは、Dalvik が Android ランタイムでした。ART でアプリが正常に動作する場合は Dalvik でも動作しますが、その逆は当てはまらない場合があります。
Android には、Java API フレームワークが使用する Java 8 言語機能など、Java プログラミング言語のほとんどの機能を提供する基本的なランタイム ライブラリのセットも含まれています。
ネイティブ C/C++ ライブラリ
ART や HAL などの主要な Android システム コンポーネントとサービスの多くは、C や C++ で記述されたネイティブ ライブラリを必要とするネイティブ コードからビルドされています。Android プラットフォームには、これらのネイティブ ライブラリの一部をアプリに公開するための Java フレームワーク API が用意されています。たとえば、Android フレームワークの Java OpenGL API を介して OpenGL ES にアクセスすると、2D および 3D グラフィックの描画と操作のサポートを追加することができます。
C または C++ コードを必要とするアプリを開発している場合は、Android NDK を使用して、こうしたネイティブ プラットフォーム ライブラリの一部にネイティブ コードから直接アクセスできます。
Java API フレームワーク
Android OS の機能セット全体は、Java 言語で記述された API を介して利用できます。次のような主要なモジュラー システム コンポーネントやサービスの再利用を簡素化できるため、これらの API は Android アプリの作成に必要な構成要素となっています。
- リスト、グリッド、テキスト ボックス、ボタン、さらには埋め込み可能なウェブブラウザなど、アプリの UI を構築するために使用できる機能豊富で拡張可能なビューシステム
- リソース マネージャー: ローカライズされた文字列、グラフィック、レイアウト ファイルなど、コード以外のリソースへのアクセスを提供します。
- 通知マネージャー: すべてのアプリでステータスバーにカスタム アラートを表示できるようになります。
- アプリのライフサイクルを管理し、共通のナビゲーション バックスタックを提供するアクティビティ マネージャー
- アプリが他のアプリ(連絡帳アプリなど)のデータにアクセスしたり、独自のデータを共有したりできるようにするコンテンツ プロバイダ
デベロッパーは、Android システムアプリが使用するのと同じフレームワーク API のすべてにアクセスできます。
システムアプリ
Android には、メール、SMS メッセージ、カレンダー、インターネット ブラウジング、連絡先などの主要アプリのセットが用意されています。プラットフォームに含まれるアプリは、ユーザーがインストールしたアプリに対して特別なステータスを持つわけではありません。そのため、サードパーティ アプリをユーザーのデフォルトのウェブブラウザ、SMS メッセンジャー、さらにはデフォルトのキーボードにすることができます。ただし、システムの設定アプリなど、一部の例外が適用されます。
システムアプリは、ユーザー向けのアプリとして機能し、デベロッパーが独自のアプリからアクセスできる主要な機能を提供します。たとえば、アプリで SMS メッセージを配信する場合、その機能を自身で構築する必要はありません。代わりに、インストール済みの SMS アプリのいずれかを呼び出して、指定した受信者にメッセージを配信できます。