Runtime

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 バイナリのパスもリファクタリングされ、dalvikvmdalvikvm32dalvikvm64dex2oatdexdiagdexdumpdexlistdexoptanalyzeroatdumpprofman の各バイナリが /system/bin から Runtime モジュールに移されました。互換性を維持するため、リファクタリングではシンボリック リンクを /system/bin に含めています。

Bionic の変更点

libctzcode は、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 ではブート シーケンスが次のように更新されています。

  1. init で、ブートストラップと、デフォルトのマウント名前空間を準備します。tmpfs/apex にマウントし、マウント ポイントの伝播タイプを private に設定します。
  2. 他のプロセスより前に、apexd をブートストラップ モードで開始します。このプロセスは、/system/apex の APEX ファイルを有効化してブートストラップ マウント名前空間にマウントします。
  3. その他の事前 apexd プロセスを開始します。これらのプロセスはブートストラップ マウント名前空間に存在し、システム APEX ファイルからライブラリとともに提供されます。
  4. /data をマウントします。init はデフォルトのマウント名前空間に切り替わり、apexd をデーモンとして起動します。
  5. 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 モジュールに含まれるネイティブ ライブラリ(libjavacorelibandroidicu など)に依存します。収集されたコードは、libcoreapache-xmlboringsslbouncycastleconscryptexpatfdlibmicuokhttpziparchivezlib などの複数の Git プロジェクトから提供されます。ライブラリはブート クラスパス上の複数の .jar ファイルに分割されています(core-oj.jarcore-libart.jarconscrypt.jarokhttp.jarbouncycastle.jarapache-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 によって制御されます。有効なポリシー値は、enableddisabledjust-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 をサポートするネイティブ ライブラリがリファクタリングされています。以前はプラットフォームの他の部分と共有されていた、動的にリンクされるいくつかのライブラリ(libcryptolibexpatzlib など)が複製され、それにより Runtime モジュールのコピーがランタイム リンカー名前空間に読み込まれるようになりました。Runtime モジュールによって提供される、動的にリンクされるネイティブ ライブラリは /apex/com.android.runtime/{lib,lib64} にあります。

ICU ライブラリ

Runtime モジュールには、ICU ライブラリ(ICU4C および ICU4J)と関連データが含まれています。

Android 10 には、ICU4C 関数のサブセットをフレームワーク コードで使用できるようにする新しい動的ライブラリ libandroidicu が含まれています。libandroidicu のリンカー シンボルは ICU リリース全体で安定版になりました(シンボルは libicuuclibicui18n で使用される _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/)から提供されるタイムゾーン データを使用します。これらのライブラリには次の機能があります。

その他の変更点

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)アップデート プロセスも更新されています。