16 KB ページサイズのサポート

Google Play の 16 KB 互換性要件
2025 年 11 月 1 日より、Google Play に送信され、Android 15 以降のデバイスを対象とするすべての新規アプリと既存のアプリのアップデートは、64 ビット デバイスで 16 KB のページサイズをサポートする必要があります。

これまで 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 と互換性があるかどうかは問いません)。

  1. [Android Studio] を開き、[File] > [Open] をクリックして任意のプロジェクトを選択します。
  2. メニューバーから [Build] > [Analyze APK...] をクリックします。

    APK Analyzer を起動する Studio の [Build] メニュー オプション
  3. 分析する APK を選択します。

  4. lib フォルダ内を確認します。共有オブジェクト(.so)ファイルがある場合は、このフォルダに格納されています。共有オブジェクト ファイルがある場合は、ネイティブ コードを使用しています。配置 列には、配置の問題があるファイルに関する警告メッセージが表示されます。共有オブジェクト ファイルがない場合や、lib フォルダがない場合は、ネイティブ コードを使用していません。

    共有オブジェクト ファイルが存在することを示す APK Analyzer のビュー

自動チェックでアライメントの問題を検出する

ビルド済みのライブラリまたは APK が 16 KB に準拠していない場合、Android Studio は事前に警告を表示します。APK Analyzer ツールを使用して、更新が必要なライブラリや、コードの変更が必要かどうかを確認します。

プロジェクトの配置に関する問題についての Studio の警告通知

Android Studio の Lint でも、16 KB アライメントされていないネイティブ ライブラリがハイライト表示されます。

Studio のリンターが、非整列ネイティブ ライブラリについて警告を表示する

共有ライブラリの ELF セグメントのアライメントを確認する

共有ライブラリの場合は、16 KB ELF アライメントを使用して、共有ライブラリの ELF セグメントが適切にアライメントされていることを確認します。Linux または macOS で開発している場合は、次のセクションで説明されている check_elf_alignment.sh スクリプトを使用できます。コマンドライン ツールを直接使用することもできます

check_elf_alignment.sh スクリプトを使用する(Linux または macOS)

check_elf_alignment.sh スクリプトを使用して ELF セグメントのアライメントを確認する手順は次のとおりです。

  1. check_elf_alignment.sh スクリプトをファイルに保存します。

  2. アプリの APK ファイルでスクリプトを実行します。

    check_elf_alignment.sh APK_NAME.apk
    

    スクリプトは、すべての arm64-v8a 共有ライブラリに対して ALIGNED または UNALIGNED を出力します。

  3. arm64-v8a または x86_64 共有ライブラリが UNALIGNED の場合は、それらのライブラリのパッケージを 更新し、このセクションの手順に沿ってアプリを再コンパイルして再テストする必要があります。

コマンドライン ツールを直接使用する

コマンドライン ツールを直接使用して ELF セグメントのアライメントを確認する手順は次のとおりです。

  1. Android Studio の SDK Manager または sdkmanager コマンドライン ツールを使用して、Android SDK Build-Tools バージョン 35.0.0 以降と Android NDK の両方がインストールされていることを確認します。
  2. アプリの 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
    
  3. 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
    
  4. 出力行を確認して、ロード セグメントの値が 2**14 未満でないことを確認します。ロード セグメントが 2**132**12、またはそれ以下の 値の場合は、それらのライブラリのパッケージを更新し、このセクションの手順に沿ってアプリを再コンパイルして再テストする必要があります。

  5. 次に、アプリの 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 デバイスをサポートしていることを確認します。

  1. 共有ライブラリのパッケージを更新する
  2. 16 KB ELF アライメントを使用してアプリをコンパイルする
  3. コードを修正してランタイムの問題を解決する
  4. 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 構成を更新します。

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 アライメントされている場合でも、コード内の特定の場所でデバイスが特定のページサイズを使用していることが前提とされている場合は、エラーが発生する可能性があります。これを回避するには、次の手順に沿って操作します。

  1. コードロジックで PAGE_SIZE 定数またはインスタンスを参照するハードコードされた依存関係を削除します。デバイスのページ サイズが 4 KB(4096)であることが前提とされています。

    代わりに getpagesize() または sysconf(_SC_PAGESIZE) を使用します。

  2. 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 環境でアプリをテストして、アプリで回帰が発生していないかどうかを確認します。手順は次のとおりです。

  1. Android 15 SDK 以降をセットアップします。

  2. 次のいずれかのテスト環境をセットアップします。

  3. テストデバイスを起動し、次のコマンドを実行して、16 KB 環境を使用していることを確認します。

    adb shell getconf PAGE_SIZE
    

    コマンドは 16384 の値を返します。

  4. 次の zipalign コマンドを実行して、アプリが 16 KB アライメントされていることを確認します。ここで、APK_NAME はアプリの APK ファイルの名前です。

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. アプリを徹底的にテストします。 特定のページサイズを参照するコード インスタンスの変更によって影響を受ける可能性がある領域に重点を置きます。

16 KB ベースのシステム イメージを使用して Android Emulator をセットアップする

Android Emulator を使用して 16 KB 環境をセットアップする手順は次のとおりです。

  1. Android Studio で [Tools] > [SDK Manager] をクリックします。
  2. 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
    Android Studio の SDK Manager を使用して 16 KB のエミュレータ システム イメージをダウンロードする
  3. [Apply > OK] をクリックして、選択したシステム イメージをダウンロードします。

  4. Android 15 の仮想デバイスをセットアップする手順に沿って操作します。システム イメージを選択するよう求められたら、ダウンロードした 16 KB システム イメージを選択します。自動的に推奨されない場合は、[Other Images] タブで 16 KB システム イメージを見つけることができます。

    [その他のイメージ] タブで 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 アライメントにする必要があります。

アプリ情報ページの [**詳細設定**] で、[**ページサイズ互換モードでアプリを実行する**] 設定を切り替え、特定のアプリに対する 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 のページサイズをサポートする必要があります。

この互換性要件の詳細については、こちらのブログ投稿をご覧ください。