Runtime モジュール(com.android.runtime.release.apex
)は、ネイティブ Android ランタイムとマネージド Android ランタイム用の APEX モジュールです。このモジュールには以下のコンポーネントが含まれています。
- ART
- Bionic
- Managed Core Library(Android 10 の新機能)
- ICU ライブラリ
libnativebridge
libnativehelper
libnativeloader
Runtime モジュールは、Android のビルド時に生成され、構成プロジェクトのビルド アーティファクトを含みます。Runtime モジュールは、Conscrypt モジュール(com.android.conscrypt.apex
)および Time Zone Data モジュール(com.android.tzdata.apex
)の両方と密接に結び付けられています。これらのモジュールも Android 10 で更新されています。
Android ランタイム(ART)の変更点
Android 10 では、ART ビルドシステムは「リリース」と「デバッグ」の 2 つのバリアントとして Runtime モジュールを作成します。これらのバリアントは、追加の診断ツールとデバッグツールを含みます。リリース バージョンは user
ビルドにインストールされ、デバッグ バージョンは userdebug
ビルドと eng
ビルドにインストールされます。デバイスが起動されると、apexd
は Runtime モジュールを /apex/com.android.runtime
の下にマウントします。
モジュール内で、ブート クラスパスは、Managed Core Library などのクラス、他のモジュールのクラス(Conscrypt や Media など)、システム パーティション内のクラス(framework.jar
など)に分割されます。モジュールが更新されると、dex2oat JIT がモジュール内のブートクラスをコンパイルします。
Android 10 では、API が次のように変更されています。
- DEX ファイルをサポートするための新しい API は、システムコード(スタック アンワインダーなど)と ART 間の安定したインターフェースを提供します。
- 新しい API は、システムに対する ART 固有のプラットフォーム抽象化レイヤ(PAL)として使用されます。システム要素(
libartpalette-system.so
)は、ART が依存するシステム機能を公開し、デバイスにインストールされているシステム ライブラリを読み込むクライアント ライブラリ(libartpalette.so
)からアクセス可能です。
Android 10 では、一部の ART バイナリのパスもリファクタリングされ、dalvikvm
、dalvikvm32
、dalvikvm64
、dex2oat
、dexdiag
、dexdump
、dexlist
、dexoptanalyzer
、oatdump
、profman
の各バイナリが /system/bin
から Runtime モジュールに移されました。互換性を維持するため、リファクタリングではシンボリック リンクを /system/bin
に含めています。
Bionic の変更点
libc
の tzcode
は、Runtime モジュール(/apex/com.android.runtime/etc/tz/
)と Time Zone Data モジュール(/apex/com.android.tzdata/etc/tz/
)によって生成されるタイムゾーン データを使用します。tzcode
は、APEX ベースのタイムゾーン更新(Time Zone Data モジュールによって生成される)よりも APK ベースのタイムゾーン更新を優先し、代替手段として /system
データを使用します。
libc
は、libicuuc
/ libicui18n
ではなく、新しいライブラリ(libandroidicu
)を使用します。詳細については、Managed Core Library をご覧ください。
最後に、Bionic 共有ライブラリとダイナミック リンカーのパスがシンボリック リンクになっています(この変更は 64 ビット版にも適用されます)。詳細は以下のとおりです。
/system/lib/libc.so
->/apex/com.android.runtime/lib/bionic/libc.so
/system/lib/libm.so
->/apex/com.android.runtime/lib/bionic/libm.so
/system/lib/libdl.so
->/apex/com.android.runtime/lib/bionic/libdl.so
/system/bin/linker
->/apex/com.android.runtime/bin/linker
ブート シーケンスの変更点
Runtime モジュールをサポートするため、Android 10 ではブート シーケンスが次のように更新されています。
init
で、ブートストラップと、デフォルトのマウント名前空間を準備します。tmpfs
を/apex
にマウントし、マウント ポイントの伝播タイプをprivate
に設定します。- 他のプロセスより前に、
apexd
をブートストラップ モードで開始します。このプロセスは、/system/apex
の APEX ファイルを有効化してブートストラップ マウント名前空間にマウントします。 - その他の事前
apexd
プロセスを開始します。これらのプロセスはブートストラップ マウント名前空間に存在し、システム APEX ファイルからライブラリとともに提供されます。 /data
をマウントします。init
はデフォルトのマウント名前空間に切り替わり、apexd
をデーモンとして起動します。apexd
は、/data/apex
と/system/apex
の両方をスキャンし、これらのディレクトリにある最新の APEX ファイルを有効化します。このフェーズで有効化された APEX ファイルはデフォルトの名前空間のみにマウントされ、事前apexd
プロセスからは見えません。
Managed Core Library
Managed Core Library は、下位レベルの更新可能なマネージド コード(Android ランタイムによって実行される dex
コード)のコレクションです。以前は libcore という名前でした。Android 10 では、Managed Core Library には、platform/libcore/
に加えて複数の Git プロジェクトが含まれているため、コードのコレクションを指す新しい名前が付けられました。
Managed Core Library は、Runtime、Time Zone Data、Conscrypt の各モジュールで提供され、Runtime モジュールに含まれるネイティブ ライブラリ(libjavacore
や libandroidicu
など)に依存します。収集されたコードは、libcore
、apache-xml
、boringssl
、bouncycastle
、conscrypt
、expat
、fdlibm
、icu
、okhttp
、ziparchive
、zlib
などの複数の Git プロジェクトから提供されます。ライブラリはブート クラスパス上の複数の .jar
ファイルに分割されています(core-oj.jar
、core-libart.jar
、conscrypt.jar
、okhttp.jar
、bouncycastle.jar
、apache-xml.jar
など)。ただし、framework.jar
または ext.jar
は含まれません。
コンポーネントの再パッケージング
Android 10 では、いくつかのコンポーネント(bouncycastle/
、conscrypt/
、okhttp/
)を再パッケージングしました。これらは、以前バイトコード操作で android.*
と com.android.*
の下にパッケージングされていたものです。これらのコンポーネントは、Java アノテーションを API メタデータに使用できるように、ソースコード変換を使用して再パッケージングされています。
Core Platform API
Core Platform API は、Android フレームワークで使用する安定版のマネージコード API を提供します。この API は、すべてのフレームワークの依存関係を明確なものにすることで、Managed Core Library の更新を可能にします。Core Platform API には次のような機能があります。
- 公開 SDK API に加えて、依存関係を示します。API の内容については、
libcore/mmodules/core_platform_api/
を参照してください。 - マネージコードに明示的に
@libcore.api.CorePlatformApi
アノテーションを付けます。llibcore/ojluni/src/
のコードについては、libcore/ojluni/annotations/mmodule/
のアノテーションを参照してください。その他のプロジェクトについては、メインのソースファイルを参照してください。
ビルドシステムは、Java ソース プラットフォーム ターゲットをビルドする場合(つまり、.bp
ファイルに "sdk_version:"
がないか、.mk
ファイルに "LOCAL_SDK_VERSION="
がない場合)、デフォルトで Core Platform API を使用します。この場合、Android フレームワーク コードの使用は公開 API と Core Platform API のみに制限されます(実装クラスは不可)。"core_current"
や "current"
などの他の sdk_version
値の動作は通常どおりです(公開 SDK API の使用のみを許可します)。ビルドシステムは Core Platform API サーフェスの変更も報告し、ターゲット(少数の例外を除く)が Managed Core Library の内部コンポーネントに依存することを防ぎます。
Runtime モジュールは、Core Platform API が対象とするフィールドとメソッドに対してアクセス チェックを実行します。これらのチェックは、プラットフォーム コードが Core Platform API のメソッドにアクセスするときに行われます。これらのチェックに関するポリシーは、システム プロパティ persist.debug.dalvik.vm.core_platform_api_policy
によって制御されます。有効なポリシー値は、enabled
、disabled
、just-warn
です。debug ビルドと eng ビルドの場合、標準ポリシーは just-warn
であり、ポリシー違反が検出されると警告がログに記録されます。user ビルドの場合、デフォルトのポリシーは disabled
であり、アクションは行われません。ネイティブ コードが Java Native Interface(JNI)を介してフィールドとメソッドを解決する場合も、Runtime モジュールは Core Platform API チェックを実行します。
Android 10 には、Android フレームワークと Managed Core Library 間の API、実行時の依存関係、ビルド時の依存関係を単純化するための変更も多数含まれています。
Android 10 では、org.kxml2
パーサーが com.android.org.kxml2
の下に再パッケージングされています。
ネイティブ ライブラリ
Android 10 では、Managed Core Library をサポートするネイティブ ライブラリがリファクタリングされています。以前はプラットフォームの他の部分と共有されていた、動的にリンクされるいくつかのライブラリ(libcrypto
、libexpat
、zlib
など)が複製され、それにより Runtime モジュールのコピーがランタイム リンカー名前空間に読み込まれるようになりました。Runtime モジュールによって提供される、動的にリンクされるネイティブ ライブラリは /apex/com.android.runtime/{lib,lib64}
にあります。
ICU ライブラリ
Runtime モジュールには、ICU ライブラリ(ICU4C および ICU4J)と関連データが含まれています。
Android 10 には、ICU4C 関数のサブセットをフレームワーク コードで使用できるようにする新しい動的ライブラリ libandroidicu
が含まれています。libandroidicu
のリンカー シンボルは ICU リリース全体で安定版になりました(シンボルは libicuuc
と libicui18n
で使用される _icu-version-number
ではなく、_android
で終わります)。ただし、アプリの互換性を維持するため、libicuuc
シンボルと libicui18n
シンボルは引き続き使用可能です。さらに、互換性維持のため、リンカーは dlopen() 呼び出しで ICU ライブラリへの絶対パスをリダイレクトします。つまり、dlopen("/system/lib/libicuuc.so",
...)
と dlopen("/system/lib/libicui18n.so", ...)
は、targetSdkVersion < 29
のアプリの場合、/apex/com.android.runtime/lib/
の対応するライブラリにリダイレクトします。
実行時に、ICU データファイルは /apex/com.android.runtime/etc/icu/
にインストールされます。アプリの互換性を維持するため、Android 10 には、以前の ICU データファイルの場所(/system/usr/icu/
)から /apex/com.android.runtime/etc/icu
へのシンボリック リンクが含まれています。
Conscrypt との相互関係
Android 10 では、論理的に Managed Core Library の一部である Conscrypt は、独立した更新可能 APEX モジュールに移動されます。Conscrypt モジュールと Runtime モジュールの間で、新しい双方向 API サーフェスは、公開 SDK API に加えて依存関係を示します。(詳細については、libcore/mmodules/intracoreapi/
をご覧ください)。API 要素には明示的に @libcore.api.IntraCoreApi
アノテーションが付けられます。
ビルドシステムでは、Conscrypt コードが公開 API とコア内 API に制限されていることが検証されます。Managed Core Library のその他の Conscrypt への依存関係は、リフレクション ベースです。ビルドシステムは、可能であればそれらの依存関係を記録し、すべての変更を API サーフェスに報告します。
Time Zone Data との相互関係
Android 10 では、アーキテクチャ libcore、ランタイム libcore、ICU4J / ICU4C は、Runtime モジュール(/apex/com.android.runtime/etc/tz/
)と Time Zone Data モジュール(/apex/com.android.tzdata/etc/tz/
)から提供されるタイムゾーン データを使用します。これらのライブラリには次の機能があります。
/system
データにフォールバックします。- APEX ベースのタイムゾーン更新(Time Zone Data モジュールによって生成される)よりも APK ベースのタイムゾーン更新のデータを優先します。
その他の変更点
Android 10 では、AsynchronousCloseMonitor
API は libnativehelper.so
から libandroidio.so
に移されました。API は AsynchronousCloseMonitor.h
で公開されています。
libnativebridge の変更点
Android 10 では、libnativebridge
ライブラリは Runtime モジュールに移されました。これは、このライブラリが、libnativeloader
と、Runtime モジュールの一部である Bionic C ライブラリと密接に結び付けられているためです。
libnativehelper の変更点
Android 10 では、Runtime モジュールにより、システムとフレームワークのコードは libnativehelper
を使用できます。Runtime モジュール外のコードは、libnativehelper
用のスタブ API(C のみ)にリンクされます。libnativehelper
ライブラリには以下が含まれます。
- キャッシュされた JNI クラス、メソッド、フィールドの縮小されたセット。
platform_include/jni_macros.h
の改善された JNI マクロ。- ネイティブ コードから
java.nio.Buffer
クラスの内部にアクセスするための新しい JNI ヘルパー メソッド(libnativehelper/include/nativehelper/JNIHelp.h
にあるjniGetNio
で始まるメソッドを参照してください)。これらのメソッドはフレームワーク コードで使用されます。
libnativeloader の変更点
Android 10 では、Runtime モジュールに libnativeloader
ライブラリが含まれています。このライブラリは、Java クラスローダー用のリンカー名前空間を作成します。リンカー名前空間は、マネージコードで記述された Android アプリによって読み込まれるネイティブ ライブラリに適用されます。このライブラリは Bionic リンカーと密接に結び付けられており、モジュールにも含まれています。
libpac の変更点
Android 10 では、PacProcessor 用の C API を提供する libpac
が Runtime モジュールに移されました。libpac
ライブラリには完全な V8 JavaScript エンジンが含まれているため、PacProcessor 以外(独立したパッケージとプロセス)では使用しないでください。
リンカー構成の変更点
Android 10 では、リンカー名前空間を使用して、プラットフォームと他の APEX モジュールから Runtime モジュール内部の動的ネイティブ ライブラリの依存関係を分離します。runtime
リンカー名前空間は、外部の依存関係を維持するために他の名前空間との適切なリンクを持つ、Runtime モジュール ライブラリ用に設定されます。
リンカー構成は、/vendor
と /system
のバイナリについては /system/etc/ld.config.txt
、Runtime モジュール自体のバイナリ(/apex/com.android.runtime/bin
)については /apex/com.android.runtime/etc/ld.config.txt
にあります。
SystemServer とフレームワークの変更点
Android 10 では、SystemServer は Runtime モジュールからの情報を報告するため、新しい RuntimeService をホストします。この情報を参照するには、次の ADB コマンドを使用します。
adb shell dumpsys runtimeinfo
RuntimeService が管理する情報は拡張可能です。サービスのソースコードについては frameworks/base/services/core/java/com/android/server/RuntimeService.java
、クライアント コードの例については libcore/luni/src/main/java/libcore/util/CoreLibraryDebug.java
をご覧ください。
Android 10 では、dex2oat
と、Runtime モジュールの他のツールを使用する無線(OTA)アップデート プロセスも更新されています。