Android 16KBページサイズ対応とテスト完全ガイド|.NET MAUI・Visual Studio・AVD・Pixel実機での検証手順

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 方式)

  1. Android Studio > Tools > SDK Manager を開き、Android 15 以降の項目で 「Google APIs Experimental 16 KB Page Size ~」の system image(arm64/x86_64)を選択してインストール。
  2. Device Manager から新規 AVD を作成し、上記 16KB イメージを選択(Other Images タブにあります)。
  3. 起動後に adb shell getconf PAGE_SIZE16384 であることを確認。

Visual Studio 2022(.NET MAUI)

  1. プロジェクトを .NET MAUI 9/.NET for Android 最新へ更新し、NDK r28+AGP 8.5.1+ 環境でビルド。
  2. Android Studio 側で作った16KB AVDを起動。Visual Studio の「デバイス」一覧に表示されるので、通常通りデバッグを開始します。
  3. アプリ起動後、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 の条件に注意)。

メーカー機種条件備考
GooglePixel 8 / 8 ProAndroid 15 QPR1 以降開発者オプションで 4KB/16KB 切替。
GooglePixel 8aAndroid 15 QPR1 以降同上。
GooglePixel 9 / 9 Pro / 9 Pro XLAndroid 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 の対処

  1. アプリに .so が含まれるかをビルド物で確認(Android Studio APK Analyzer など)。
  2. 各 .so の ELF LOAD セグメント整列(p_align)readelf -l 等で確認し、214(16384)未満があれば更新または再ビルドします。
  3. 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 です。
  4. アプリコードに 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_SIZE4096 のままになるのは不自然ではありません。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)

  1. プロジェクト更新:.NET 9/MAUI 9 に更新。Workload(dotnet workload update)で .NET for Android を最新化。
  2. ツール更新NDK r28+AGP 8.5.1+ にする(ツール群の更新で多くのケースは自動的に 16KB 化)。
  3. AVD 準備:Android Studio で 16KB イメージの AVD を作成して起動。Visual Studio 側から接続してデバッグ。
  4. ページサイズ確認adb shell getconf PAGE_SIZE を実行し 16384 であることを確認。ログでクラッシュの有無をチェック。
  5. 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_SIZE16384 なら 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 4readelf -lAPK と .so の整列をチェックしてください。ビルドツールを最新(NDK r28+/AGP 8.5.1+)に上げるのが最短です。

Q. 16KB 対応で得られるメリットは?

A. Google の測定では、起動時間短縮・電力低減・カメラ起動高速化・ブート時間短縮などの改善が報告されています。

Q. 16KB Backcompat モードだけで逃げ切れますか?

A. 一時的な互換の仕組みであり、本番運用の代替にはなりません。Play 要件もあるため、最終的にはネイティブ依存を含めた 16KB 対応ビルドへ移行してください。


実務用チートシート

項目合格基準確認コマンド/ポイント
端末ページサイズ16384adb shell getconf PAGE_SIZE(16KB であること)
APK の zipalign16KB 整列zipalign -v -c -P 16 4 app.apkVerification successful
.so の ELF 整列p_align = 2^14readelf -l libX.soLOAD セグメントの整列値を確認
ビルドツール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 配信品質の新・標準ワークフローです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次