カーネルとライブラリ、ランタイムはほとんどがC言語またはC++で記述されているが、2021年から新規コードのデフォルト言語をRustにしており[39]、2022年12月現在では新規コードのRustの占める割合が21%に達している[39]。アプリケーションとアプリケーション・フレームワークは、Google独自に構築した仮想マシンであるDalvik仮想マシンまたはAndroid Runtime(ART)上の「Java Platform, Standard Edition(Java SE)のサブセット+Android拡張」環境で記述する[40]。プリインストールされたアプリ、エンドユーザーが後からインストールするアプリを問わず、共通の仮想マシンおよびフレームワークを使用する。 Googleが公式サポートしているCPUはARM(ARMv5以降)、MIPS、x86である。ARM以外の環境はAndroid 2.3から対応した。端末シェアの多くはARMv7とARMv8が占めているが、日本においては2014年3月に大手家電量販店のビックカメラが自社ブランド製品としてIntel Atom搭載のタブレットを発売[41]するなど、x86による製品もあった。 ChromeOSにはAndroidアプリケーションの実行環境としてAndroid Runtime for Chrome(ARC)が搭載されており、x86ベースやARMベースのCPUを搭載するChromebook端末上でAndroidアプリケーションを動作させることもできる。 Microsoft Windows 11では、専用のAndroidサブシステム(Windows Subsystem for Android:WSA)をインストールすることで、x86ベースやARMベースのCPUを搭載するWindows PC上にて、Amazon Appstore経由で入手したAndroidアプリケーションを動作させることもできる[42]。 Androidアプリケーションのパッケージ(APK)には、各種プロセッサのアーキテクチャ固有命令を含むネイティブライブラリを複数含めることができる。エミュレーションにより、x64プロセッサ上でARM32/ARM64ネイティブライブラリのみを含むAndroidアプリケーションを動作させることもできるが、オーバーヘッドを伴う。 AndroidのカーネルではLinuxカーネルに独自パッチ[1]
対応CPU
カーネルが望まれています。
ACK 5.4より前は各プロセッサーベンダー毎にACKを派生したベンダーカーネルがあり[44]、製品メーカーは製品毎にベンダーカーネル派生のプロダクトカーネルを用意していた[44]が、ACK 5.4以降は外部モジュールを読み込むためのカーネルモジュールインターフェース(KMI)を提供する汎用カーネルイメージ(GKI)となり[44]、各プロセッサーベンダーはベンダーモジュールを提供する形となった[44]。
種類カーネルのURL
Android共通カーネル(ACK)https://android.googlesource.com/kernel/common/
ハードウェア寄りでは開発組織 Linaro(英語版)がベンダー固有コードの本家Linuxカーネルへの還元(アップストリーミング)を続けている[46]。
またAndroid共通カーネルも少しずつ本家Linuxカーネルへの還元が進んでおり、本家Linuxで受け入れられなかった独自機能もだんだん標準機能やユーザー空間への置き換えが進んでいる。
機能過去のAndroidカーネルAndroidカーネル 6.1現在(太字はAndroidカーネル独自機能) Android 4.4以前のバージョンで動作するアプリケーションは、基本的にはDalvik仮想マシン(VM)上で動作する。DalvikはJavaのオープン実装であるApache Harmonyをベースとしているが、Java APIセットからはSwingやAWTなどが除去され、Android専用のUIフレームワークや独自ライブラリなどが追加されている。Java CDCのAPIは、全てではないが、概ね含まれている。なお、オラクル(旧:Sun)Javaの互換性テストを通過していないため、正式なJavaではない。APIセットはJava Platform, Micro Edition(Java ME)とも異なる。Android 7.0 Nougat以降はJava APIライブラリの実装がOpenJDKベースになった[56]。 Googleから提供されているソフトウェア開発キットでは、Javaプラットフォームによるプログラミング環境と、C/C++による開発がサポートされている。Java以外にも、Javaプラットフォーム向けの複数の言語(Scala、Kotlin)で書かれたプログラムがDalvik/ART上で動作する。Java Native Interface(JNI)を利用して、JavaとC/C++間で相互運用することも可能である。Android 2.3以降ではNative Activityのサポートにより、使用可能なAPIの制約はあるもののC/C++のみでアプリケーションを開発することも可能になっている。また、.NET Framework互換環境の1つであるMonoもAndroidに対応しており、XamarinとMicrosoft Visual Studioを利用することで、.NET言語(C#/F#)を使用してAndroidアプリケーションを開発することができる[57][58]。 Android 4.4(KitKat)からは、デベロッパー向けに新たな仮想マシンAndroid Runtime(ART)が実装された。ARTは、Dalvikよりもアプリケーションの動作効率などを向上させることを目的に開発された[59]。Dalvikの場合、多様なハードウェアに対応できるよう、アプリを中間コードの状態で保管しておき、実行直前にネイティブコードに変換して動作させるJITコンパイル方式が採用されている。
プロセス間通信(IPC)BinderBinder(./drivers/android/内)
匿名共有メモリashmemashmem(./drivers/staging/android/内)又は memfd
(ashmemは本家Linuxで削除された[47][48]もののアプリの一部で必要となる[49])
ログLoggerユーザー空間デーモン(logd)
早期OOMlow memory killerPSIモニター+ユーザー空間デーモン(lmkd)[50]
連続メモリアロケータCMEM/NVMAP/PMEM
→ION[51]DMA-BUF[52]
データ使用量モニタリングxt_qtaguideBPFベース[53]
ネットワーク権限Paranoid networkeBPFベース[53]
リモート操作(ADBのデバイス側)adb USB gadget[54]FunctionFS gadget+ユーザー空間デーモン(adbd)[55][54]
仮想マシン