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

従来、Android は 4 KB のメモリページサイズのみをサポートしていました。そのため、システムメモリのパフォーマンスは、Android デバイスの通常の合計メモリ量の平均に合わせて最適化されていました。Android 15 以降では、ページサイズが 16 KB(16 KB のデバイス)を使用するように構成されているデバイスがサポートされています。

デバイス メーカーは、引き続き大容量の物理メモリ(RAM)を搭載したデバイスを開発しています。そのため、これらのデバイスの多くは、デバイスのパフォーマンスを最適化するために、16 KB(最終的にはより大きなページサイズ)に設定されます。16 KB デバイスのサポートを追加すると、これらのデバイスでアプリを実行できるようになり、関連するパフォーマンスの向上によるメリットが得られます。そのために、アプリが影響を受けるかどうかを確認する方法アプリを再ビルドする方法(該当する場合)、エミュレータと実機の両方を使用して 16 KB の環境でアプリをテストする方法に関するガイダンスを提供しています。

メリットとパフォーマンスの向上

ページサイズが 16 KB に設定されたデバイスは、平均でわずかに多くのメモリを使用しますが、システムとアプリの両方でさまざまなパフォーマンスの向上が得られます。

  • システムがメモリ不足の状況にあるときのアプリの起動時間が短縮: 平均で 3.16% 短縮され、テストした一部のアプリでは大幅な改善(最大 30%)を達成
  • アプリ起動時の消費電力の削減: 平均 4.56% を削減
  • カメラの起動の高速化: ホットスタートが平均 4.48% 高速化、コールド スタートが平均 6.60% 高速化
  • システムの起動時間の改善: 平均 1.5%(約 0.8 秒)改善

これらの改善は初期テストに基づくため、実際のデバイスでの結果とは異なる可能性があります。Google はテストを継続し、アプリの潜在的な利点に関して追加の分析を提供します。

アプリが影響を受けるかどうかを確認する

アプリでネイティブ コードを使用している場合は、16 KB デバイスをサポートするようにアプリを再ビルドする必要があります。アプリがネイティブ コードを使用しているかどうか不明な場合は、APK Analyzer を使用して、ネイティブ コードが存在するかどうかを確認できます。

すべてのライブラリや SDK を含め、Java プログラミング言語または Kotlin で記述されたコードのみを使用しているアプリの場合、すでに 16 KB のデバイスをサポートしています。それでも、16 KB 環境でアプリをテストし、アプリの動作に予期しない回帰がないことを確認することをおすすめします。

アプリがネイティブ コードを使用しているか?

次のいずれかに該当する場合は、アプリでネイティブ コードが使用されています。

  • アプリで C/C++(ネイティブ)コードが使用されている。アプリで Android NDK を使用している場合、アプリはネイティブ コードを使用しています。
  • アプリは、それらを使用するサードパーティのネイティブ ライブラリまたは依存関係にリンクされます。
  • アプリが、デバイス上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーでビルドされている。

APK Analyzer を使用してネイティブ ライブラリを特定する

APK Analyzer は、ビルドされた APK のさまざまな要素を評価するためのツールです。アプリでネイティブ コードとライブラリのどちらを使用しているかを特定する手順は次のとおりです。

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

    APK Analyzer を起動する Studio の [Build] メニュー オプション

  3. 分析する APK を選択します。

  4. lib フォルダ内を調べます。共有オブジェクト(.so)ファイルが存在する場合は、このフォルダ内にあります。共有オブジェクト ファイルが存在する場合、アプリはネイティブ コードを使用します。共有オブジェクト ファイルが存在しないか、lib フォルダが存在しない場合、アプリはネイティブ コードを使用しません。

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

16 KB デバイスに対応したアプリをビルドする

16 KB デバイスをサポートするには、ネイティブ コードを使用するアプリで以降のセクションで説明する手順を完了する必要があります。

共有ライブラリのパッケージを更新する

AGP バージョン 8.3 以降にアップグレードし、非圧縮共有ライブラリを使用することをおすすめします。

AGP バージョン 8.3 以降

16 KB のデバイスでは、出荷時に共有ライブラリが圧縮されていない状態で、アプリを 16 KB の zip 調整境界に揃える必要があります。そのためには、Android Gradle プラグイン(AGP)バージョン 8.3 以降にアップグレードする必要があります。アップグレード プロセスの詳細については、Android Gradle プラグイン Upgrade Assistant のセクションをご覧ください。

AGP バージョン 8.2 以前

AGP をバージョン 8.3 以降にアップグレードできない場合は、圧縮共有ライブラリを使用するように切り替える方法もあります。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 アライメントを使用して適切にアライメントする必要があります。

16 KB ELF アライメントを使用してアプリをコンパイルするには、使用している Android NDK のバージョンに応じて、次のいずれかのセクションの手順を行います。

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 r27 以降

Android NDK バージョン r27 以降を使用した 16 KB 対応の共有ライブラリのコンパイルをサポートするには、ndk-buildbuild.gradlebuild.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

特定のページサイズを参照しているコード インスタンスを確認する

アプリが 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 を使用する代わりに、他の目的に使用され、実際のメモリページを反映していないことを示す新しい名前の新しい変数を作成します。

16 KB の環境でアプリをテストする

16 KB デバイスをサポートするアプリをビルドしたら、16 KB の環境でアプリをテストし、アプリで回帰が発生しないかどうかを確認することをおすすめします。これを行うには、次のいずれかのテスト環境をセットアップしてから、特定のページサイズを参照するコード インスタンスを変更することで影響を受ける可能性のある部分を中心に、アプリを徹底的にテストします。

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

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

  1. 16 KB ベースの Android 15 エミュレータのシステム イメージは、Android Studio Jellyfish | 2023.3.1 以降と互換性があります。ただし、Android 15 ベータ版を快適にご利用いただくには、Android Studio の最新のプレビュー版をダウンロードしてください。

    なお、Android Studio は複数のバージョンを一緒にインストールできるので、Android Studio の既存のバージョンをインストールしたままにしておくことができます。

  2. Android Studio で [Tools] > [SDK Manager] をクリックします。

  3. [SDK Platforms] タブで、[Show Package Details] をオンにしてから [Android VanillaIceCream Preview] セクションを開き、作成する仮想デバイスに応じて次のエミュレータ システム イメージのいずれかまたは両方を選択します。

    • Google API 試験運用版 16k ページサイズ ARM 64 v8a システム イメージ
    • Google API 試験運用版 16k ページサイズ Intel x86_64 Atom システム イメージ

    Android Studio の SDK Manager を使用して 16 KB のエミュレータ システム イメージをダウンロードする

  4. [Apply] > [OK] をクリックして、選択したシステム イメージをダウンロードします。

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

    [その他のイメージ] タブで 16 KB のエミュレータ イメージを確認する