これまで Android は 4 KB のメモリ ページサイズのみをサポートしており、Android デバイスが通常備えている合計メモリの平均量に合わせてシステム メモリのパフォーマンスを最適化してきました。Android 15 以降、AOSP は 16 KB のページサイズを使用するように構成されたデバイス(16 KB デバイス)をサポートしています。アプリが NDK ライブラリを直接的または SDK を介して間接的に使用している場合は、16 KB デバイスで動作するようにアプリを再ビルドする必要があります。
デバイス メーカーが物理メモリ(RAM)の容量が大きいデバイスを構築し続けるにつれて、これらのデバイスの多くは、デバイスのパフォーマンスを最適化するために 16 KB(最終的にはそれ以上)のページサイズを採用するようになります。16 KB ページサイズのデバイスのサポートを追加すると、アプリをこれらのデバイスで実行できるようになり、関連するパフォーマンスの改善のメリットをアプリで享受できるようになります。再コンパイルしないと、今後の Android リリースで 16 KB デバイスでアプリが動作しなくなります。
アプリのサポートを追加するにあたって、アプリが影響を受けるかどうかを確認する方法、アプリを再ビルドする方法(該当する場合)、エミュレータ(Android Emulator の Android 15 システム イメージを含む)を使用して 16 KB 環境でアプリをテストする方法に関するガイダンスをご用意しました。
メリットとパフォーマンスの向上
16 KB のページサイズで構成されたデバイスでは、平均でメモリ使用量が若干増加しますが、システムとアプリの両方でさまざまなパフォーマンスが向上します。
- システムのメモリ負荷が高いときのアプリ起動時間の短縮: 平均 3.16% 短縮、テストした一部のアプリでは大幅な改善(最大 30%)
- アプリ起動時の消費電力の削減: 平均 4.56% 削減
- カメラの起動が速くなる: ホット スタートが平均 4.48%、コールド スタートが平均 6.60% 高速化
- システムの起動時間の短縮: 平均で 8%(約 950 ミリ秒)短縮
これらの改善は初期テストに基づくものであり、実際のデバイスでの結果は異なる可能性があります。テストを継続する中で、アプリの潜在的な収益増加に関する追加の分析情報を提供していきます。
アプリが影響を受けるかどうかを確認する
アプリがネイティブ コードを使用している場合は、16 KB デバイスをサポートするようにアプリを再ビルドする必要があります。アプリがネイティブ コードを使用しているかどうか不明な場合は、APK Analyzer を使用してネイティブ コードが存在するかどうかを特定し、見つかった共有ライブラリの ELF セグメントのアライメントを確認できます。Android Studio には、配置の問題を自動的に検出するのに役立つ機能も用意されています。
ライブラリや SDK もすべて含めて、Java プログラミング言語または Kotlin で記述されたコードだけを使用しているアプリは、すでに 16 KB デバイスをサポートしています。ただし、アプリの動作に予期しない回帰がないことを確認するため、16 KB の環境でアプリをテストすることをおすすめします。
アプリがネイティブ コードを使用しているか?
該当するのは次のようなアプリです。
- アプリが C/C++(ネイティブ)コードを使用している。アプリが Android NDK を使用している場合、アプリはネイティブ コードを使用しています。
- アプリが、ネイティブ ライブラリまたはそれを使用する依存関係(SDK など)とリンクしている。
- アプリが、デバイス上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーでビルドされている。
APK Analyzer を使用してネイティブ ライブラリを特定する
APK Analyzer は、ビルドされた APK のさまざまな要素を評価するためのツールです。アプリがネイティブ コードを使用しているかどうかを確認する手順は次のとおりです(16 KB 互換かどうかは問いません)。
- [Android Studio] を開き、[File] > [Open] をクリックして任意のプロジェクトを選択します。
メニューバーから [Build] > [Analyze APK...] をクリックします。
分析する APK を選択します。
libフォルダ内を確認します。このフォルダには、共有オブジェクト(.so)ファイルが格納されています。共有オブジェクト ファイルが存在する場合、アプリはネイティブ コードを使用しています。配置 列には、配置の問題があるファイルに関する警告メッセージが表示されます。共有オブジェクト ファイルが存在しない場合や、libフォルダがない場合、アプリはネイティブ コードを使用していません。
自動チェックでアライメントの問題を検出する
ビルド済みのライブラリまたは APK が 16 KB に準拠していない場合、Android Studio は事前に警告を表示します。APK Analyzer ツールを使用して、更新が必要なライブラリや、コードの変更が必要かどうかを確認します。
Android Studio の Lint でも、16 KB アライメントされていないネイティブ ライブラリがハイライト表示されます。
共有ライブラリの ELF セグメントのアライメントを確認する
共有ライブラリの場合は、16 KB ELF アライメントを使用して、共有ライブラリの ELF セグメントが適切にアライメントされていることを確認します。Linux または macOS で開発している場合は、次のセクションで説明されている check_elf_alignment.sh スクリプトを使用できます。コマンドライン ツールを直接使用することもできます。
check_elf_alignment.sh スクリプトを使用する(Linux または macOS)
check_elf_alignment.sh スクリプトを使用して ELF セグメントのアライメントを確認する手順は次のとおりです。
check_elf_alignment.shスクリプトをファイルに保存します。アプリの APK ファイルでスクリプトを実行します。
check_elf_alignment.sh APK_NAME.apkスクリプトは、すべての
arm64-v8a共有ライブラリに対してALIGNEDまたはUNALIGNEDを出力します。arm64-v8aまたはx86_64共有ライブラリがUNALIGNEDの場合は、それらのライブラリのパッケージを 更新し、アプリを再コンパイルして、このセクションの手順に沿って再テストする必要があります。
コマンドライン ツールを直接使用する
コマンドライン ツールを直接使用して ELF セグメントのアライメントを確認する手順は次のとおりです。
- Android Studio の SDK Manager または
sdkmanagerコマンドライン ツールを使用して、Android SDK Build-Tools バージョン 35.0.0 以降と Android NDK の両方がインストールされていることを確認します。 アプリの APK ファイルを抽出します。
Linux または macOS
unzip APK_NAME.apk -d /tmp/my_apk_outWindows(PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_outAPK ファイルを抽出した一時ディレクトリで、
libディレクトリの内容を確認し、共有オブジェクト(.so)ファイルを探します。これらは 、APK Analyzer を使用してネイティブ ライブラリを特定したときに表示された共有オブジェクト ファイルと同じです。各共有オブジェクト ファイルで次のコマンドを実行します。Linux または macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOADWindows(PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"ここで、
SDK_ROOT_LOCATIONは Android SDK をインストールしたディレクトリのパス、SHARED_OBJECT_FILEは確認する共有オブジェクト ファイルの名前、NDK_VERSIONはインストールした Android NDK のバージョン(28.0.12433566など)です。確認する各ファイルについて、出力は次のようになります。LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14出力行を確認して、ロード セグメントの値が
2**14未満でないことを確認します。ロード セグメントが2**13、2**12、またはそれ以下の 値の場合は、それらのライブラリのパッケージを更新し、 アプリを再コンパイルして、このセクションの手順に沿って再テストする必要があります。次に、アプリの APK ファイルで
zipalignコマンドライン ツールを実行します。Linux または macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apkWindows(PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apkここで、
SDK_ROOT_LOCATIONは Android SDK をインストールしたディレクトリのパス、APK_NAMEはアプリの APK ファイルの名前です。すべての共有ライブラリが正しくアライメントされている場合、出力の最後の行に「Verification successful」と表示されます。検証に失敗した場合は、一部の共有ライブラリを再アライメントする必要があります。そのため、 それらのライブラリのパッケージを更新し、 アプリを再コンパイルして、このセクションの手順に沿って再テストする必要があります。
16 KB デバイスをサポートするようにアプリをビルドする
アプリがネイティブ コードを使用している場合は、次のセクションで説明する手順を完了して、アプリが 16 KB デバイスをサポートしていることを確認します。
- 共有ライブラリのパッケージを更新する
- 16 KB ELF アライメントを使用してアプリをコンパイルする
- コードを修正してランタイムの問題を解決する
- SDK が 16 KB をサポートしているかどうかを確認する
共有ライブラリのパッケージを更新する
AGP バージョン 8.5.1 以降にアップグレードし、非圧縮の共有ライブラリを使用します。
bundletool を使用して zip アライメントを確認する
App Bundle のアライメントを確認するには、次を使用します。
bundletool dump config --bundle=<my .aab> | grep alignment
PAGE_ALIGNMENT_16K が表示された場合、App Bundle は 16 KB の zip アライメントをリクエストしています。PAGE_ALIGNMENT_4K が表示された場合、この AAB からビルドされた APK には、zip ファイルに 4 KB アライメントされた .so ファイルが含まれます。
AGP バージョン 8.5.1 以降
16 KB デバイスでは、非圧縮の共有ライブラリを含むアプリを 16 KB の zip アライメント境界にアライメントする必要があります。これを行うには、Android Gradle プラグイン(AGP)バージョン 8.5.1 以降にアップグレードする必要があります。アップグレード プロセスの詳細については、Android Gradle プラグイン Upgrade Assistant のセクションをご覧ください。
AGP バージョン 8.5 以前
AGP をバージョン 8.5.1 以降にアップグレードできない場合は、圧縮された共有ライブラリを使用するように切り替えます。アライメントされていない共有ライブラリでアプリのインストールに関する問題が発生しないように、アプリをパッケージ化するときに Gradle が共有ライブラリを圧縮するように Gradle 構成を更新します。
Groovy
build.gradle ファイルに次のオプションを追加します。
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
build.gradle.kts ファイルに次のオプションを追加します。
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
AGP バージョン 8.0 以前
AGP バージョン 8.0 以前を使用している場合は、gradle.properties ファイルで App Bundle の非圧縮ネイティブ ライブラリ オプションも無効にする必要があります。
android.bundle.enableUncompressedNativeLibs=false
16 KB ELF アライメントを使用してアプリをコンパイルする
16 KB デバイスでアプリを実行するには、共有ライブラリの ELF セグメントが 16 KB ELF アライメントを使用して適切にアライメントされている必要があります。
ゲーム デベロッパーの場合、ゲームが Unity ゲームエンジン上で実行される場合は、 Unity のガイドをご覧ください。ゲームが Unreal ゲームエンジン上で実行される場合は、 Unreal のガイドをご覧ください。ネイティブ ゲームエンジンの場合は、このガイドに進みます。
16 KB ELF アライメントを使用してアプリをコンパイルするには、使用している Android NDK のバージョンに応じて、次のいずれかのセクションの手順を完了します。
Android NDK r28 以降
NDK バージョン r28 以降では、デフォルトで 16 KB アライメントがコンパイルされます。
Android NDK r27 以前
Android NDK バージョン r27 以前で 16 KB アライメントされた共有ライブラリのコンパイルをサポートするには、次のリンカー フラグを使用します。
-Wl,-z,max-page-size=16384
-Wl,-z,common-page-size=16384
ビルドシステム構成ファイルを更新する方法は次のとおりです。
ndk-build
ndk-build を使用している場合は、Android.mk を更新して 16 KB ELF アライメントを有効にします。
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384
CMake
CMake を使用している場合は、CMakeLists.txt を更新して 16 KB ELF アライメントを有効にします。
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
"-Wl,-z,max-page-size=16384"
"-Wl,-z,common-page-size=16384"
)
コードを修正してランタイムの問題を解決する
アプリが 16 KB アライメントされている場合でも、コード内の特定の場所でデバイスが特定のページサイズを使用していると想定していると、アプリでエラーが発生する可能性があります。これを回避するには、次の手順を完了します。
コードロジックで
PAGE_SIZE定数またはインスタンスを参照するハードコードされた依存関係を削除します。デバイスのページ サイズが 4 KB(4096)であると想定している依存関係も削除します。代わりに
getpagesize()またはsysconf(_SC_PAGESIZE)を使用します。mmap()や、ページアライメントされた 引数を必要とする他の API の使用箇所を探し、必要に応じて代替手段に置き換えます。
アプリが PAGE_SIZE を基盤となるページサイズに関連付けられていない便利な値として使用している場合、16 KB モードで使用してもアプリが破損することはありません。ただし、この値が MAP_FIXED なしで mmap を使用してカーネルに渡されると、カーネルはページ全体を使用するため、メモリが浪費されます。このような理由から、NDK r27 以降で 16 KB モードが有効になっている場合、PAGE_SIZE は未定義になります。
アプリがこの方法で PAGE_SIZE を使用し、この値をカーネルに直接渡さない場合は、PAGE_SIZE を使用する代わりに、他の目的で使用され、実際のメモリページを反映していないことを示す新しい名前の変数を作成します。
SDK が 16 KB をサポートしているかどうかを確認する
多くの SDK は 16 KB のページサイズと互換性があります。特に、自分でビルドする場合や、最新のビルド済みファイルを入手する場合は互換性があります。ただし、一部の SDK ビルド済みファイルまたは SDK バージョンは 16 KB 互換ではないため、各 SDK プロバイダのウェブサイトで、16 KB で使用するバージョンを確認する必要があります。
16 KB 環境でアプリをテストする
16 KB デバイスをサポートするようにアプリをビルドしたら、16 KB 環境でアプリをテストして、アプリで回帰が発生していないかどうかを確認します。手順は次のとおりです。
Android 15 SDK 以降をセットアップします。
次のいずれかのテスト環境をセットアップします。
テストデバイスを起動し、次のコマンドを実行して、16 KB 環境を使用していることを確認します。
adb shell getconf PAGE_SIZEコマンドは
16384の値を返します。次の
zipalignコマンドを実行して、アプリが 16 KB アライメントされていることを確認します。APK_NAME はアプリの APK ファイルの名前です。zipalign -c -P 16 -v 4 APK_NAME.apkアプリを徹底的にテストします。 特定のページサイズを参照するコード インスタンスの変更によって影響を受ける可能性がある領域に重点を置きます。
16 KB ベースのシステム イメージを使用して Android Emulator をセットアップする
Android Emulator を使用して 16 KB 環境をセットアップする手順は次のとおりです。
- Android Studio で [Tools] > [SDK Manager] をクリックします。
In the [SDK Platforms] tab, check [Show Package Details], then expand the [Android VanillaIceCream] or higher section and select one or both of the following emulator system images, depending on the virtual devices you want to create:
- Google APIs Experimental 16 KB Page Size ARM 64 v8a System Image
- Google APIs Experimental 16 KB Page Size Intel x86_64 Atom System Image
[Apply > OK] をクリックして、選択したシステム イメージをダウンロードします。
手順に沿って Android 15 の仮想デバイスをセットアップします。システム イメージを選択するよう求められたら、ダウンロードした 16 KB システム イメージを選択します。自動的に推奨されない場合は、[Other Images] タブで 16 KB システム イメージを見つけることができます。
エミュレータを起動する
Android Emulator と仮想デバイスのセットアップが完了したら、対象デバイス メニューからエミュレータ を起動するか、コマンドラインから起動します。
開発者向けオプションを使用してデバイスで 16 KB モードを有効にする
[16 KB ページサイズで起動する] デベロッパー オプションを切り替えて、デバイスを 16 KB モードで起動します。
Android 15 の QPR バージョンでは、特定のデバイスで利用可能なデベロッパー オプションを使用して、デバイスを 16 KB モードで起動し、オンデバイス テストを実行できます。開発者向けオプションを使用する前に、[設定] > [システム] > [ソフトウェア アップデート] に移動して、利用可能なアップデートを適用します。
この開発者向けオプションは、次のデバイスで利用できます。
Google Pixel 8、Google Pixel 8 Pro(Android 15 QPR1 以降)
Google Pixel 8a(Android 15 QPR1 以降)
Google Pixel 9、9 Pro、9 Pro XL(Android 15 QPR2 以降搭載)
Google Pixel 9a(Android 16 以降搭載)
16 KB の後方互換モード
ページサイズ互換モードでの警告
16 KB の後方互換オプションは、デバイスが 16 KB カーネルで実行されている場合に使用できます。パッケージ マネージャーは、次の条件を満たす場合に、アプリを 16 KB の後方互換モードで実行します。
- アプリに ELF ファイル(拡張子は
.so)が含まれており、LOAD セグメントのアライメントが 4 KB の場合。 - その圧縮済みの APK に圧縮されていない ELF ファイルがあり、それが 4 KB で ZIP アライメントされている場合。
パッケージ マネージャーがアプリに対して 16 KB の後方互換モードを有効にしている場合、そのアプリを初めて起動する際に、16 KB の後方互換モードで実行されていることを示す警告が表示されます。
16 KB の後方互換モードで一部のアプリは動作しますが、信頼性と安定性を最大限に高めるには、アプリを 16 KB アライメントにする必要があります。
アプリ情報ページの [Advanced] で、[Run app with page size compat mode] 設定を切り替え、特定のアプリに対する 16 KB の後方互換モード を有効または無効にします。この設定は、デバイスが 16 KB のページサイズで実行されている場合にのみ表示されます。
ページサイズ互換モードの設定
デバイス上のすべてのアプリで 16 KB の後方互換モードを強制的に有効にするには:
adb shell setprop bionic.linker.16kb.app_compat.enabled true
adb shell setprop pm.16kb.app_compat.disabled false
デバイス上のすべてのアプリで 16 KB の後方互換モードを強制的に無効にするには:
adb shell setprop bionic.linker.16kb.app_compat.enabled false
adb shell setprop pm.16kb.app_compat.disabled true
Android 17 では、すべてのアプリで 16 KB の後方互換モードを強制的に無効にし、互換性のないバイナリを直ちに中止することもできます。
adb shell setprop bionic.linker.16kb.app_compat.enabled fatal
adb shell setprop pm.16kb.app_compat.disabled true
android:pageSizeCompat プロパティを有効または無効に設定して、AndroidManifest.xml 内の特定のアプリの後方互換モードをオンまたはオフにします。このプロパティが設定されている場合、アプリの起動時に後方互換モードの警告は表示されません。
Google Play の互換性要件
デバイス メーカーは、パフォーマンスを最適化するために、デバイスに搭載する RAM を増やしており、16 KB などの大きなページサイズを採用するようになっています。今後リリースされるデバイスに備えて、Google Play では新しい互換性要件が導入されます。2025 年 11 月 1 日より、Google Play に送信され、Android 15(API レベル 35)以降を搭載したデバイスを対象とするすべての新規アプリと既存のアプリのアップデートは、16 KB のページサイズをサポートする必要があります。
この互換性要件の詳細については、こちらのブログ投稿をご覧ください。