ページサイズとは、OS がメモリを管理する際の粒度です。現在多くの CPU は、4 KB ページサイズをサポートしているため、Android OS やアプリは、4 KB ページサイズを実行できるようにビルド、最適化されてきました。ARM CPU は、より大きな 16 KB ページサイズをサポートしています。また、Android 15 以降、AOSP も 16 KB ページサイズでの Android のビルドをサポートしています。このオプションでは追加のメモリを使用しますが、システム パフォーマンスは向上します。Android 15 では、このオプションはデフォルトでは有効化されていませんが、デベロッパー モードまたはデベロッパー オプションとして利用できます。OEM やアプリ デベロッパーは、将来的にどこでも 16 KB モードに切り替えるための準備ができます。
16 KB ページサイズの有効化
16 KB ページがサポートされるのは、16 KB カーネルの arm64
ターゲットのみです。ただし、Cuttlefish の場合は、 x86_64
で 16 KB ユーザー空間をシミュレーションするオプションもあります。
arm64
ターゲットの場合、Kleaf でカーネルをビルドすると、--page_size=16k
が 16 KB モードでカーネルをビルドします。Linux カーネル設定を直接使用している場合、CONFIG_ARM64_4K_PAGES
の代わりに CONFIG_ARM64_16K_PAGES
を設定することで 16 KB ページを選択できます。
Android ユーザー空間で 16 KB ページサイズのサポートを有効化するには、次のビルド オプションを設定します。
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
:PAGE_SIZE
定義を削除し、実行時にコンポーネントがページサイズを決定するようにします。PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
: プラットフォーム ELF ファイルが確実に 16 KB アライメントで作成されるようにします。サイズが必要以上に大きいのは、今後の互換性を考慮しているためです。16 KB ELF アライメントでは、カーネルで 4 KB / 16 KB のページサイズをサポートできます。
ビルドフラグを確認する
lunch
ターゲットを選択したら、ビルドフラグが環境内で適切に設定されているか確認します。
$ source build/envsetup.sh
$ lunch target
$ get_build_var TARGET_MAX_PAGE_SIZE_SUPPORTED
16384
$ get_build_var TARGET_NO_BIONIC_PAGE_SIZE_MACRO
true
前の 2 つのコマンドで 16384
および true
がそれぞれ返された場合は、ビルドフラグが適切に設定されていることになります。
16 KB ELF アライメントで共有ライブラリをビルドする
Android プロジェクトの一部である共有ライブラリをビルドするには、「16 KB ページサイズを有効にする」の前の設定で十分です。
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
Android プロジェクトの一部ではない共有ライブラリをビルドする場合は、以下のリンカーフラグを渡す必要があります。
-Wl,-z,max-page-size=16384
16 KB ELF アライメントのバイナリおよび事前ビルドを確認する
アライメントと実行時の動作を確認するのに最適な方法は、コンパイルされた 16 KB カーネルでテスト、実行することです。ただし、次の方法で早期に問題を検出できます。
Android W(AOSP 試験運用版)以降、ビルド時に
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true
に設定できます。一時的に無視するには、Android.bp
でignore_max_page_size: true
を、Android.mk
でLOCAL_IGNORE_MAX_PAGE_SIZE := true
を使用します。これらの設定により、すべての事前ビルドを確認し、16 KB アライメントではない更新済みのビルドを検出できます。Android 15 以降でリリースされるデバイスでは、
atest elf_alignment_test
を実行してデバイス上の ELF ファイルのアライメントを確認できます。