従来、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 のさまざまな要素を評価するためのツールです。アプリでネイティブ コードとライブラリのどちらを使用しているかを特定する手順は次のとおりです。
- Android Studio を開き、[File] > [Open] をクリックして、任意のプロジェクトを選択します。
メニューバーで、[Build] > [Analyze APK...] をクリックします。
分析する APK を選択します。
lib
フォルダ内を調べます。共有オブジェクト(.so
)ファイルが存在する場合は、このフォルダ内にあります。共有オブジェクト ファイルが存在する場合、アプリはネイティブ コードを使用します。共有オブジェクト ファイルが存在しないか、lib
フォルダが存在しない場合、アプリはネイティブ コードを使用しません。
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-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
特定のページサイズを参照しているコード インスタンスを確認する
アプリが 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 の環境でアプリをテストする
16 KB デバイスをサポートするアプリをビルドしたら、16 KB の環境でアプリをテストし、アプリで回帰が発生しないかどうかを確認することをおすすめします。これを行うには、次のいずれかのテスト環境をセットアップしてから、特定のページサイズを参照するコード インスタンスを変更することで影響を受ける可能性のある部分を中心に、アプリを徹底的にテストします。
- 16 KB ベースの Android 15 システム イメージを使用して Android Emulator をセットアップする
- ARM64 で 16 KB ページサイズの Cuttlefish を使用する
- x86-64 で 16 KB ページサイズの Cuttlefish をシミュレートする
16 KB ベースの Android 15 システム イメージを使用して Android Emulator をセットアップする
Android Emulator を使用して 16 KB の環境をセットアップする手順は次のとおりです。
16 KB ベースの Android 15 エミュレータのシステム イメージは、Android Studio Jellyfish | 2023.3.1 以降と互換性があります。ただし、Android 15 ベータ版を快適にご利用いただくには、Android Studio の最新のプレビュー版をダウンロードしてください。
なお、Android Studio は複数のバージョンを一緒にインストールできるので、Android Studio の既存のバージョンをインストールしたままにしておくことができます。
Android Studio で [Tools] > [SDK Manager] をクリックします。
[SDK Platforms] タブで、[Show Package Details] をオンにしてから [Android VanillaIceCream Preview] セクションを開き、作成する仮想デバイスに応じて次のエミュレータ システム イメージのいずれかまたは両方を選択します。
- Google API 試験運用版 16k ページサイズ ARM 64 v8a システム イメージ
- Google API 試験運用版 16k ページサイズ Intel x86_64 Atom システム イメージ
[Apply] > [OK] をクリックして、選択したシステム イメージをダウンロードします。
手順に沿って Android 15 の仮想デバイスをセットアップし、システム イメージの選択を求められたら、ダウンロードした 16 KB のシステム イメージを選択します。自動的に推奨されない場合は、[Other Images] タブに 16 KB のシステム イメージが表示されます。