これまで 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
)ファイルがある場合はここにホストされています。共有オブジェクト ファイルが存在する場合、アプリはネイティブ コードを使用しています。[Alignment] 列には、配置に関する問題があるファイルに対する警告メッセージが表示されます。共有オブジェクト ファイルが存在しない場合やlib
フォルダがない場合は、アプリはネイティブ コードを使用していません。
自動チェックで配置の問題を検出する
ビルド済みのライブラリまたは APK が 16 KB に準拠していない場合、Android Studio は事前に警告を表示します。APK アナライザ ツールを使用して、更新が必要なライブラリや、コードの変更が必要かどうかを確認します。

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 SDK Build-Tools バージョン 35.0.0 以降と Android NDK の両方が、Android Studio の SDK Manager または
sdkmanager
コマンドライン ツールを使用してインストールされていることを確認します。 アプリの APK ファイルを抽出します。
Linux または macOS
unzip APK_NAME.apk -d /tmp/my_apk_out
Windows(PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
APK ファイルを抽出した一時ディレクトリで、
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 LOAD
Windows(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.apk
Windows(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 デバイスをサポートしていることを確認してください。
共有ライブラリのパッケージングを更新する
AGP をバージョン 8.5.1 以降にアップグレードし、非圧縮の共有ライブラリを使用することをおすすめします。
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
}
}
}
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 アラインの共有ライブラリのコンパイルをサポートするには、ndk-build
、build.gradle
、build.gradle.kts
、またはリンカーのフラグを次のように更新する必要があります。
ndk-build
Application.mk
で次のように変更します。
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy
build.gradle
ファイルで、引数 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
を設定します。
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin
build.gradle.kts
ファイルで、引数 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
を設定します。
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
他のビルドシステム
次のリンカーフラグを指定します。
-Wl,-z,max-page-size=16384
Android NDK r26 以前
Android NDK バージョン r26 以前で 16 KB アライメントの共有ライブラリのコンパイルをサポートするには、次のように ndk-build
または cmake
構成を更新する必要があります。
ndk-build
Android.mk
を更新して 16 KB ELF アライメントを有効にします。
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
CMakeLists.txt
を更新して 16 KB ELF アライメントを有効にします。
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Android NDK r22 以前
NDK r26 以前で説明した手順に加えて、NDK r22 以前を使用している場合は common-page-size=16384
を設定する必要があります。common-page-size=16384
の設定は、以前のバージョンの GNU ld リンカーと LLVM lld リンカーのバグが原因で必要です。ただし、これらのバグを完全に回避するには、ツールをより新しいバージョンに更新することを強くおすすめします。
Android NDK バージョン r22 以下で 16 KB 互換の共有ライブラリをコンパイルするには、次のように ndk-build
または cmake
構成を更新します。
ndk-build
16 KB 互換の ELF をビルドするように Android.mk
を更新します。
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
CMake
16 KB 互換の ELF をビルドするように CMakeLists.txt
を更新します。
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-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
を使用する代わりに、他の目的で使用され、実際のメモリページを反映していないことを示す新しい名前の新しい変数を作成します。
16 KB をサポートする SDK を確認する
多くの SDK は 16 KB のページサイズと互換性があります。特に、自分でビルドする場合や、最近のプリビルドを入手する場合は互換性があります。ただし、一部の SDK プリビルドまたは SDK バージョンは 16 KB に対応していないため、各 SDK プロバイダのウェブサイトで、16 KB で使用するバージョンを確認する必要があります。
16 KB 環境でアプリをテストする
16 KB デバイスをサポートするアプリをビルドしたら、16 KB 環境でアプリをテストして、アプリにリグレッションが発生していないかどうかを確認します。手順は次のとおりです。
次のいずれかのテスト環境を設定します。
テストデバイスを起動し、次のコマンドを実行して、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 15 システム イメージで Android Emulator をセットアップする
Android エミュレータを使用して 16 KB 環境をセットアップする手順は次のとおりです。
16 KB ベースの Android 15 エミュレータ システム イメージは、Android Studio Jellyfish | 2023.3.1 以降と互換性があります。ただし、16 KB のデバイスで作業する際の最適なエクスペリエンスを得るには、Android Studio Ladybug | 2024.2.1 以降を使用してください。
Google は常に新機能の開発に取り組んでいます。そのため、Android Studio の新しいバージョンや最新のプレビュー版がリリースされたら、ダウンロードすることをおすすめします。
なお、Android Studio は複数のバージョンを一緒にインストールできるので、Android Studio の既存のバージョンをインストールしたままにしておくことができます。
Android Studio で [Tools] > [SDK Manager] をクリックします。
[SDK Platforms] タブで、[Show Package Details] をオンにして、[Android VanillaIceCream] 以降のセクションを開き、作成する仮想デバイスに応じて次のエミュレータ システム イメージのいずれかまたは両方を選択します。
- Google APIs Experimental 16 KB ページサイズ ARM 64 v8a システム イメージ
- Google APIs Experimental 16 KB ページサイズ Intel x86_64 Atom システム イメージ
[適用] > [OK] をクリックして、選択したシステム イメージをダウンロードします。
Android 15 用の仮想デバイスをセットアップするの手順に沿って操作し、システム イメージの選択を求められたら、ダウンロードした 16 KB のシステム イメージを選択します。自動的に推奨されない場合は、[その他のイメージ] タブで 16 KB のシステム イメージを確認できます。
一部のエミュレータ バージョンとシステム イメージの追加手順
Android Emulator バージョン 35.1.5 ~ 35.1.20、および SDK Manager で提供される Android 15.0 16 KB ページサイズ システム イメージのリビジョン 4 より前のバージョンでは、x86_64 システムで 16 KB 環境をシミュレートするために、次の手順も完了する必要があります。これらの手順は、バージョン 35.1.21 以降、および Android 15.0 16 KB ページサイズのシステム イメージのリビジョン 4 以降では必要ありません。
- デバイス マネージャーで、16 KB のイメージの横にある 3 つのドットをクリックし、[ディスクに表示] をクリックします。
- このフォルダで
config.ini
ファイルを探します。 config.ini
ファイルに次の行を追加して、変更を保存します。kernel.parameters = androidboot.page_shift=14
変更を確認するには、次のコマンドを実行します。このコマンドは
16384
を返します。adb shell getconf PAGE_SIZE
エミュレータを起動する
Android エミュレータと仮想デバイスの設定が完了したら、ターゲット デバイスのメニューから、またはコマンドラインからエミュレータを起動します。
開発者向けオプションを使用してデバイスで 16 KB モードを有効にする

[16 KB ページサイズで起動する] デベロッパー オプションを切り替えて、デバイスを 16 KB モードで起動します。
Android 15 QPR1 以降では、特定のデバイスで利用可能なデベロッパー オプションを使用して、デバイスを 16 KB モードで起動し、デバイス上でテストを実行できます。開発者向けオプションを使用する前に、[設定] > [システム] > [ソフトウェア アップデート] に移動して、利用可能なアップデートを適用します。
この開発者向けオプションは、次のデバイスで利用できます。
Google Pixel 8、Google Pixel 8 Pro(Android 15 QPR1 以降)
警告: Android 15 QPR2 ベータ版 3 の既知の問題により、Android 15 QPR2 ベータ版 3 をインストールしてデバイスを 16 KB モードで起動すると、Google Pixel 8 デバイスでタッチスクリーンが動作しません。この問題は Google Pixel 8 Pro デバイスには影響しません。
Google Pixel 8a(Android 15 QPR1 以降)
警告: Android 15 QPR2 ベータ版 3 の既知の問題により、Android 15 QPR2 ベータ版 3 をインストールしてデバイスを 16 KB モードで起動すると、Pixel 8a デバイスでタッチスクリーンが動作しません。
Google Pixel 9、Google Pixel 9 Pro、Google Pixel 9 Pro XL(Android 15 QPR2 ベータ版 2 以降)
Google Play の互換性要件
デバイス メーカーがパフォーマンスを最適化するためにデバイスに搭載する RAM を増やすにつれて、16 KB などの大きなページサイズを採用するメーカーが増えるでしょう。これらのデバイスのリリースに備えて、Google Play では新しい互換性要件を導入します。2025 年 11 月 1 日より、Google Play に提出され、Android 15(API レベル 35)以上を搭載したデバイスを対象とするすべての新しいアプリと既存のアプリのアップデートは、16 KB のページサイズをサポートする必要があります。
この互換性要件について詳しくは、こちらのブログ投稿をご覧ください。