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

これまで、Android は 4 KB のメモリページサイズしかサポートしていませんでした。 システムメモリのパフォーマンスを最適化 Android デバイスでは通常、これが行われています。Android 15 以降、AOSP は 16 KB(16 KB)のページサイズを使用するように設定されているデバイス 。アプリで NDK ライブラリを直接使用している場合は、 または SDK を介して間接的に行う場合、アプリを再ビルドして 16 KB のデバイスで使用できます。

デバイス メーカーは次々と、より多くのデバイスで 物理メモリ(RAM)に加え、これらのデバイスの多くに 16 KB( ページサイズを拡大して、デバイスのパフォーマンスを最適化します。追加しています 16 KB ページサイズのデバイスをサポートしているため、アプリはこれらの 関連するパフォーマンスの恩恵をアプリに提供するため 改善されています。16 KB デバイスでは、再コンパイルしないとアプリが動作しない可能性があります 将来の Android リリースで製品化される際の要件です。

アプリのサポートを追加できるように、 アプリが影響を受ける場合はアプリを再構築し(該当する場合)、アプリをテスト エミュレータ(Android 15 を含む)を使用した 16 KB 環境 Android Emulator 用のシステム イメージ)を作成します。

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

ページサイズが 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++(ネイティブ)コードが使用されている。アプリが NDK を使用している場合、アプリはネイティブ コードを使用します。
  • アプリがサードパーティのネイティブ ライブラリまたは依存関係にリンクしていて、 使用します。
  • お客様のアプリは、Google Cloud 上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーで構築されています ダウンロードします

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

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

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

    APK を起動する Studio の [ビルド] メニュー オプション
アナライザー

  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 アライメントを使用してアプリをコンパイルするには、 使用している Android NDK のバージョンに応じて、以下のセクションを確認してください。 できます。

Android NDK r26 以前

Android NDK での 16 KB 対応の共有ライブラリのコンパイルをサポートする バージョン r26 以前では、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 による 16 KB 対応の共有ライブラリのコンパイルをサポートする バージョン r27 以降では、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 を指定しても、カーネルはページ全体を使用します。 メモリが無駄になりますこうした理由により、16 KB の場合、PAGE_SIZE は未定義になります。 NDK r27 以降で有効になっています。

アプリがこの方法で PAGE_SIZE を使用し、この値を 次に、PAGE_SIZE を使用する代わりに、新しい変数属性で新しい変数を作成します。 他の目的で使用されていることがわかるような名前を付け、実際の 表示されます。

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

16 KB デバイスをサポートするアプリをビルドした後で、 16 KB の環境でアプリをテストし、以下の問題があるかどうかを確認する 予測します手順は次のとおりです。

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

  2. 次のいずれかのテスト環境を設定します。

  3. テストデバイスを起動してから、次のコマンドを実行して、 16 KB の環境を使用している場合:

    adb shell getconf PAGE_SIZE
    

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

  4. 共有ライブラリの場合、共有ライブラリのELF セグメントは 16 KB ELF 配置を使用して適切に配置されます。このスクリプトを使用して、 このプロセスに関するヘルプ:

    #!/bin/bash
    
    # usage: alignment.sh path to search for *.so files
    
    dir="$1"
    
    RED="\e[31m"
    GREEN="\e[32m"
    ENDCOLOR="\e[0m"
    
    matches="$(find $dir -name "*.so" -type f)"
    IFS=$'\n'
    for match in $matches; do
      res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
      if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
        echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
      else
        echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
      fi
    done
    
    1. スクリプトを alignment.sh などのファイルに保存します。

    2. アプリの APK ファイルを抽出します。

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. /tmp/my_apk_out 内の抽出されたファイルに対してスクリプトを実行します。 ディレクトリ:

      alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
      

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

    4. arm64-v8a 共有ライブラリのいずれかが UNALIGNED の場合、次の操作を行う必要があります。 それらのライブラリのパッケージを更新してから、アプリケーションを アプリに移動し、このセクションの手順に沿って再テストします。

  5. 次の zipalign コマンドを実行して、アプリが 16 KB で揃え。APK_NAME は名前 アプリの APK ファイルを次のように変更します。

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  6. 影響を受ける可能性のある部分を中心に、アプリを徹底的にテストする 特定のページサイズを参照するコード インスタンスを変更するをご覧ください。

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

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

  1. 16 KB ベースの Android 15 Emulator のシステム イメージは、 Android Studio Jellyfish |2023.3.1 以降。ただし、 使用する場合は、Android 15 ベータ版の最新の プレビュー版です。

    なお、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 の SDK Manager を使用して 16 KB のエミュレータ システム イメージをダウンロードする
スタジオ

  4. [適用 >選択したシステム イメージをダウンロードします。

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

    「Other Images」で 16 KB エミュレータ イメージを見つける
タブ