Android 15世代から本格化した16KBページサイズ。特に .NET MAUI/.NET for Android でネイティブコード(NDK/SDK の .so)に依存するアプリは、ビルドとテストの両面での備えが不可欠です。本記事では「エミュレーターで adb shell getconf PAGE_SIZE が 4096(4KB)になる」「Pixel 7 で 16KB にならない」など、現場でつまずきやすい論点を整理し、Windows/macOS 上のデバッグ手順、実機リスト、合格判定の方法まで一気通貫で解説します。
Android 16KBページサイズの要点(最初に結論)
- 要件:Google Play は 2025年11月1日 以降、Android 15(API 35)以上を対象にする新規/更新アプリに 16KBページサイズ対応を義務付けます(64bit端末)。アプリがネイティブコードを含む場合は再ビルドが必要です。
- 確認コマンド:テスト対象端末やエミュレーターで
adb shell getconf PAGE_SIZEを実行し、16384(16KB)であることを確認します。 - エミュレーター:Android Studio の SDK Manager から 「Google APIs Experimental 16 KB Page Size」イメージを入手して AVD を作成します(arm64 / x86_64)。
- 実機:Pixel 8 / 8 Pro / 8a(Android 15 QPR1 以降)および Pixel 9 系列(QPR2 Beta 2 以降)に開発者向けの 16KB 切替オプションが提供されています。
- MAUI 対応:.NET MAUI 9(.NET for Android 最新)+ NDK r28 以上+ AGP 8.5.1 以上へ更新すると、既定で 16KB 対応のビルドが可能です。
質問と背景:なぜ「adb が 4096を返す」のか
Visual Studio 付属の Android Device Manager で作成した標準エミュレーターは、既定が 4KB イメージのことが多く、そのままでは PAGE_SIZE=4096 が返ります。16KB 検証を行うには、Android Studio 側で 16KB イメージの AVD を作成し、Visual Studio からその AVD に接続してデバッグします。Microsoft Q&A でも「VS のデバイス マネージャー単体では 16KB イメージが出ない」「Android Studio で作成した AVD を使う」といった運用が紹介されています。
前提整理:16KB ページサイズ化で何が変わるか
- Android 15 から OS はページサイズ非依存(page-size agnostic)となり、4KB/16KB いずれのカーネルでも動作可能に。
- Google の検証では、16KB 構成でアプリ起動高速化・電力低減・カメラ起動短縮・ブート時間短縮などの効果が報告されています。
- ただし、.so の ELF LOAD セグメント整列(p_align)や APK での16KB zipalignが不適切だと、クラッシュやインストール失敗につながります。
ページサイズの確認方法(実機/エミュレーター共通)
# 端末・エミュレーターのページサイズ判定
adb shell getconf PAGE_SIZE
# 期待値:16384(=16KB)。4096 は 4KB 環境
より下位レイヤーの確認として、端末のカーネル設定(/proc/config.gz)を参照し CONFIG_ARM64_16K_PAGES=y を探す方法も有効です。
16KB 環境を構築してテストする(Windows/macOS)
Android Studio(推奨:AVD 方式)
- Android Studio > Tools > SDK Manager を開き、Android 15 以降の項目で 「Google APIs Experimental 16 KB Page Size ~」の system image(arm64/x86_64)を選択してインストール。
- Device Manager から新規 AVD を作成し、上記 16KB イメージを選択(Other Images タブにあります)。
- 起動後に
adb shell getconf PAGE_SIZEが16384であることを確認。
Visual Studio 2022(.NET MAUI)
- プロジェクトを .NET MAUI 9/.NET for Android 最新へ更新し、NDK r28+/AGP 8.5.1+ 環境でビルド。
- Android Studio 側で作った16KB AVDを起動。Visual Studio の「デバイス」一覧に表示されるので、通常通りデバッグを開始します。
- アプリ起動後、
Device Explorerまたはターミナルからadb shell getconf PAGE_SIZEを実行して 16KB 環境であることを確認。
メモ:Visual Studio の Android Device Manager 単体では 16KB イメージが出ないことがあります。Android Studio の AVD を併用するのが確実です。
実機でのオンデバイステスト(Pixel)
- Android 15 QPR 系では、対応 Pixel に開発者向け「16KB でブート」トグルが提供されており、再起動で 4KB/16KB を切替可能。
- 切替は初回にブートローダーのアンロックやデータワイプを伴う旨が AOSP ブログで案内されています。検証専用機の利用が安全です。
16KB ページサイズ採用・検証に使える主な実機(2025年10月時点)
Google の公式ドキュメントに開発者オプションで 16KB 切替に対応する Pixel が明記されています。以下はその抜粋です(OS バージョンや QPR の条件に注意)。
| メーカー | 機種 | 条件 | 備考 |
|---|---|---|---|
| Pixel 8 / 8 Pro | Android 15 QPR1 以降 | 開発者オプションで 4KB/16KB 切替。 | |
| Pixel 8a | Android 15 QPR1 以降 | 同上。 | |
| Pixel 9 / 9 Pro / 9 Pro XL | Android 15 QPR2 Beta 2 以降 | 同上。 |
なお、Samsung Remote Test Labでは 16KB テストモードの Galaxy 端末が提供され、リモートで動作確認が可能です(実端末のモデルは時期により入れ替わります)。
.NET MAUI/ネイティブ依存アプリの「合格」チェックリスト
ツール/SDK の前提
- .NET MAUI 9/.NET for Android 最新、NDK r28+、AGP 8.5.1+(これで既定で 16KB 整列・パッケージングが有効になります)。
- 古い NDK を使う場合は、
-Wl,-z,max-page-size=16384などのリンカオプションやビルド引数で 16KB 整列を明示します(r27 ではANDROID_SUPPORT_FLEXIBLE_PAGE_SIZESなど)。
自前コード/サードパーティ .so の対処
- アプリに .so が含まれるかをビルド物で確認(Android Studio APK Analyzer など)。
- 各 .so の ELF LOAD セグメント整列(p_align)を
readelf -l等で確認し、214(16384)未満があれば更新または再ビルドします。 - APK のzipalign 検証:
# Windows(PowerShell) ${Env:ANDROID_SDK_ROOT}\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 .\app-release.apk # macOS / Linux $ANDROID_SDK_ROOT/build-tools/35.0.0/zipalign -v -c -P 16 4 app-release.apk最後に「Verification successful」と出れば 16KB 整列 OK です。 - アプリコードに
4096のハードコードがないか点検し、getpagesize()/sysconf(_SC_PAGESIZE)などランタイム取得へ置換します。
テスト環境の作り方(再掲)
- エミュレーターは Android Studio の16KB イメージを使用。
- 実機は Pixel 8/8 Pro/8a/9 系で開発者オプションを 16KB に切替。
- Samsung Remote Test Lab を用いたリモート実機検証も可。
「Pixel 7 を使っているが 16KB になっていない」原因
Pixel 7 は、公式ドキュメントに記載される16KB Developer Option 提供機種に含まれていません。したがって Android 15 環境でも getconf PAGE_SIZE が 4096 のままになるのは不自然ではありません。16KB 実機検証が必要なら、Pixel 8/8 Pro/8a または 9 系に切り替えるのが確実です。
よくある落とし穴と対処
- 「VS のエミュレーターで 16KB にならない」:VS の Device Manager 既定イメージは 4KB 構成が多い。Android Studio で 16KB AVD を作成し、それを VS から選択してデバッグ。
- 「.so は直したのに Play Console で NG」:APK の zipalign(-P 16)が通っているか、Bundle → Play 側での再圧縮に注意。AGP 8.5.1+ が推奨。
- 「libc++_shared.so が古い」:NDK r28+ を採用する(既定で 16KB 整列)。古い NDK ではリンカオプションの追加が必要。
- 「一部 SDK の .so が 4KB 固定」:ベンダーの 16KB 対応版へアップデート。移行までの暫定として 16KB Backcompat モードを使う手もあるが、本番運用は非推奨。
Windows/macOS 向け:デバッグ手順(.NET MAUI)
- プロジェクト更新:.NET 9/MAUI 9 に更新。Workload(
dotnet workload update)で .NET for Android を最新化。 - ツール更新:NDK r28+ ・ AGP 8.5.1+ にする(ツール群の更新で多くのケースは自動的に 16KB 化)。
- AVD 準備:Android Studio で 16KB イメージの AVD を作成して起動。Visual Studio 側から接続してデバッグ。
- ページサイズ確認:
adb shell getconf PAGE_SIZEを実行し16384であることを確認。ログでクラッシュの有無をチェック。 - APK 検証:
zipalign -v -c -P 16 4で 16KB 整列を検証。readelf -lで各 .so のp_alignを確認。
診断スクリプト例(CI/ローカル)
以下は「端末のページサイズ」と「APK の 16KB 整列」を併せてチェックする簡易例です。
#!/usr/bin/env bash
set -euo pipefail
APK=${1:-app-debug.apk}
echo "[1] Device PAGE_SIZE"
adb shell getconf PAGE_SIZE
echo "[2] zipalign check (16KB)"
"${ANDROID_SDK_ROOT}/build-tools/35.0.0/zipalign" -v -c -P 16 4 "${APK}"
echo "[3] ELF p_align check (NDK .so)"
TMPDIR=$(mktemp -d)
unzip -q -o "${APK}" -d "${TMPDIR}"
find "${TMPDIR}/lib" -name "*.so" -print0 | while IFS= read -r -d '' so; do
echo "== ${so} =="
"${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf" -l "${so}" | grep -E "LOAD|Align"
done
rm -rf "${TMPDIR}"
※ zipalign 検証・ELF 整列要件は Android 公式ドキュメントの手順・条件に基づきます。
設計観点:コード側での「4KB 前提」を排除する
PAGE_SIZEの定数使用をやめる:getpagesize()またはsysconf(_SC_PAGESIZE)で実行時に取得。- mmap 等のオフセット整列:16KB 環境ではオフセットが 16KB 境界である必要があり、4KB 前提コードは動作不良の原因になります。
運用ヒント:Backcompat とテストの優先順位
Android 15 には16KB Backcompat モードがあり、4KB 整列の .so を持つアプリでも暫定的に動作させられます。ただし「警告表示」「安定性に劣る」などの制約があるため、本番展開の前に必ず 16KB ネイティブ対応へ移行しましょう。
トラブル事例(.NET MAUI)
- 起動直後にクラッシュ:16KB エミュレーター/実機で .NET 9 MAUI 新規プロジェクトが起動しない事例が報告されています。依存 .so の整列や AGP/NDK の組み合わせを最新化し、既知不具合の回避策を確認してください。
まとめ
adb shell getconf PAGE_SIZEが 16384 なら 16KB 環境。テスト端末の選定ミスをまず排除。- エミュレーターは Android Studio の16KB システムイメージを使用。Visual Studio からも接続可能。
- 実機は Pixel 8/8 Pro/8a/9 系が公式に切替対応(QPR 条件あり)。Pixel 7 は対象外。
- ビルドは NDK r28+/AGP 8.5.1+ が近道。zipalign(-P 16)と ELF p_align を必ず検証。
- 16KB 化は性能・省電力の観点でもメリットが示されています。移行後は 4KB/16KB 両環境での回帰テストを継続しましょう。
付録:よくある質問(FAQ)
Q. Visual Studio 17.14.x のエミュレーターで 16KB を出せますか?
A. Visual Studio のデバイス マネージャーは 4KB 既定のケースが多く、Android Studio 側で 16KB AVD を作成して利用するのが実務上の定石です。
Q. MAUI アプリが 16KB 対応か、簡単に確かめる方法は?
A. 16KB 端末(または 16KB AVD)上で起動検証し、zipalign -c -P 16 4 と readelf -l でAPK と .so の整列をチェックしてください。ビルドツールを最新(NDK r28+/AGP 8.5.1+)に上げるのが最短です。
Q. 16KB 対応で得られるメリットは?
A. Google の測定では、起動時間短縮・電力低減・カメラ起動高速化・ブート時間短縮などの改善が報告されています。
Q. 16KB Backcompat モードだけで逃げ切れますか?
A. 一時的な互換の仕組みであり、本番運用の代替にはなりません。Play 要件もあるため、最終的にはネイティブ依存を含めた 16KB 対応ビルドへ移行してください。
実務用チートシート
| 項目 | 合格基準 | 確認コマンド/ポイント |
|---|---|---|
| 端末ページサイズ | 16384 | adb shell getconf PAGE_SIZE(16KB であること) |
| APK の zipalign | 16KB 整列 | zipalign -v -c -P 16 4 app.apk が Verification successful |
| .so の ELF 整列 | p_align = 2^14 | readelf -l libX.so で LOAD セグメントの整列値を確認 |
| ビルドツール | NDK r28+ / AGP 8.5.1+ | 既定で 16KB 整列・パッケージング。旧版はリンカフラグ追加。 |
| コード修正 | 4KB 前提の排除 | getpagesize()/sysconf(_SC_PAGESIZE) 利用へ。:contentReference[oaicite:61]{index=61} |
免責とアップデート指針
本記事は 2025年10月時点の情報です。Android Developers Blog/公式ドキュメントは更新が頻繁なため、要件や対応機種は変わる場合があります。最新の「Support 16KB page sizes」ドキュメントと開発者ブログを定期的に確認してください。:contentReference[oaicite:62]{index=62}
要点の再掲:「adb shell getconf PAGE_SIZE=16384」をまずクリア。エミュレーターは Android Studio の 16KB イメージを使い、実機は Pixel 8/8 Pro/8a/9 系。ビルドは NDK r28+ と AGP 8.5.1+ を基準に、zipalign と ELF 整列で最終チェック。これが 16KB 時代の Android 配信品質の新・標準ワークフローです。

コメント