Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android 16KBページサイズ対応をはじめからていねいに

Android 16KBページサイズ対応をはじめからていねいに

2025年11月以降、Google Playで公開するAndroid 15向けアプリには16KBページ対応が必須です。
この必須対応で得られるパフォーマンス向上の仕組みから、Flutterプロジェクトへの具体的な導入手順までを解説します。特にFlutterエンジニアには馴染みの薄い、build.gradleやネイティブライブラリ(.so)のビルド設定をデモで丁寧にご紹介します。

CA.flutter #4

Avatar for mine2424

mine2424

July 10, 2025
Tweet

More Decks by mine2424

Other Decks in Programming

Transcript

  1. 自己紹介 Profile 西峰 綾汰 にしみね りょうた 🏢 CyberAgent / SGEマンガ事業部

    / 2024年入社 📱 ジャンプTOON という縦型漫画アプリを開発 🎯 趣味・興味 🏎️ F1 - Mercedes / Redbull ♠️ ポーカー - 🇲🇴 / 🇰🇷 / 🇻🇳 / 🇰🇭 / 🇭🇰 🎸 フジロック - 今年参戦します!
  2. 4KB → 16KBで何が変わる? 📊 ページ数が1/4に 100万ページ → 25万ページ 管理コストが大幅削減 🔍

    検索が高速化 ページテーブルが小さくなる = メモリアクセスが速い 🔋 CPU負荷軽減 ページ切り替えが減る = バッテリー消費削減 💾 キャッシュ効率UP TLBヒット率が向上 = アプリが軽快に動作 技術用語: TLB = アドレス変換キャッシュ | ページフォルト = メモリ割り込み減少 | フラグメンテーション = 断片化削減
  3. Google Playの新要件 2025年11月1日 対応期限 API35+ Android 15以降 重要なポイント 対象: 新規アプリ・アップデート両方

    条件: Android 15(API 35)をターゲット 未対応: Google Play審査に通らない 公式要件: Google Play Console Help
  4. Google Play ターゲットAPI要件 2025年8月31日からの要件 新規アプリ・既存アプリのアップデート必須要件: Android 15 (API 35)以上 16KBページサイズ対応

    API 35をターゲットにすると: 16KBページサイズ対応が必須 ネイティブコード使用時は再コンパイル必要 未対応の場合、審査でリジェクト 重要: API 34以下では16KB対応不要だが、 2025年11月以降は選択肢なし 公式ドキュメント: Target API level requirements for Google Play apps
  5. Googleの公式テスト結果 🚀 アプリ起動 最大30%高速化 速度向上 🔋 電力消費 4.56%削減 省電力 📸

    カメラ起動 4.5〜6.6%高速化 UX向上 ⚡ システム起動 8%短縮 全体改善 出典: Support 16 KB page sizes - Benefits and performance gains
  6. ネイティブライブラリ(.so)とは? Flutterアプリの構成要素 Dartコード lib/ 以下のコード Flutter Frameworkが処理 影響なし ネイティブライブラリ C/C++で書かれたコード

    プラグインに含まれる 要対応 主な.soファイル libflutter.so - Flutterエンジン libapp.so - Dartコードのコンパイル結果 lib〇〇.so - 各種プラグイン
  7. 主要パッケージの対応状況 1/4 完全対応済みパッケージ 🔥 Firebase全般 Analytics, Crashlytics, Messaging等 対応状況: 全て対応済み

    追加作業: 不要 📊 datadog_flutter 監視・パフォーマンス分析 対応バージョン: v2.11.0以降 追加作業: バージョン更新のみ 📍 geolocator 位置情報取得 対応状況: 最新版で対応済み 追加作業: 不要
  8. 主要パッケージの対応状況 2/4 基本パッケージ(対応済み) shared_preferences ローカルストレージ ✓ 対応済み sqflite SQLiteデータベース ✓

    対応済み path_provider ファイルパス取得 ✓ 対応済み url_launcher URL起動 ✓ 対応済み connectivity_plus ネットワーク状態 ✓ 対応済み device_info_plus デバイス情報 ✓ 対応済み
  9. 主要パッケージの対応状況 3/4 設定が必要なパッケージ 🔔 flutter_local_notifications ローカル通知機能 問題: Desugar依存によりJava 11制限 解決方法:

    android { compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } } 🎨 Rive Flutter アニメーションライブラリ 重要: NDK r28.1への更新が必須 解決方法: android { ndkVersion "28.1.13356709" }
  10. 主要パッケージの対応状況 4/4 注意が必要なパッケージ jcenter依存の警告があるパッケージ memory_info - メモリ情報取得 update_available - アップデート確認

    ※ 動作に影響はないがGradle警告が表示される 🔍 パッケージの対応確認方法 1. APKをビルド: flutter build apk --release 2. チェックスクリプトで確認: ./check_elf_alignment.sh app-release.apk 3. UNALIGNEDのライブラリを特定 4. 該当パッケージのGitHub Issueを確認
  11. Android 16での互換モード Android 16の新機能 Android 16では16KBページサイズ互換モードが追加されます。 互換モードの仕組み 未対応アプリも4KBモードで実行 パフォーマンス低下の可能性 一時的な回避策

    重要な注意点 Google Play要件は変わらない 2025年11月1日の期限は同じ 互換モードに依存しない 必ず16KB対応が必要 推奨: 互換モードに頼らず、早めに完全対応を
  12. STEP4: 現状を確認する 結果の見方 arm64-v8a/libflutter.so: ALIGNED (2^16) # OK! arm64-v8a/libapp.so: ALIGNED

    (2^16) # OK! x86_64/libflutter.so: ALIGNED (2^16) # OK! x86_64/libapp.so: ALIGNED (2^16) # OK! x86_64/libplugin.so: UNALIGNED # 修正しましょう armeabi-v7a/libplugin.so UNALIGNED # 修正不要 重要なポイント arm64-v8a と x86_64 が ALIGNED なら基本的にOK armeabi-v7a は32bitアーキテクチャのため影響なし UNALIGNED のライブラリがある場合は更新が必要
  13. アーキテクチャ別の対応状況 16KBページサイズ対応が必要なアーキテクチャ 対応必須 arm64-v8a (64bit ARM) 最新のAndroidデバイスの主流 Pixel、Galaxy等のフラグシップ機 x86_64 (64bit

    Intel/AMD) エミュレータ 一部のChromebook 対応不要 armeabi-v7a (32bit ARM) 古いAndroidデバイス 16KBページサイズの影響なし x86 (32bit Intel/AMD) 古いエミュレータ ほぼ使用されていない 重要: arm64-v8aとx86_64がALIGNEDであれば、Google Playの要件を満たします。
  14. build.gradleとは? Androidアプリのビルド設定ファイル 場所 android/ ├── build.gradle # プロジェクト全体 └── app/

    └── build.gradle # アプリ本体 ←こっち! 役割 ビルドツールのバージョン指定 依存関係の管理 コンパイル設定 今回はここを修正!
  15. 必須の修正内容 android/app/build.gradle android { namespace "com.example.myapp" compileSdk 35 // ←

    Android 15に変更 defaultConfig { applicationId "com.example.myapp" minSdk 21 targetSdk 35 // ← Android 15に変更 // NDKバージョンによって設定が異なる // NDK r26以前の場合(手動設定が必要) ndk { ldFlags += ["-Wl,-z,max-page-size=16384"] } // NDK r27の場合(CMake設定が必要) externalNativeBuild { cmake { arguments += [ "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" ] } }
  16. NDKバージョンの指定 - r27 NDK r27(設定が必要) android { ndkVersion "27.2.12479018" externalNativeBuild

    { cmake { arguments += [ "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" ] } } } NDK r27では手動でCMakeの引数設定が必要です。
  17. NDKバージョンの指定 - r28 NDK r28+(推奨) android { ndkVersion "28.1.13356709" //

    追加設定不要!自動対応 } NDK r28.1以降では16KBページサイズ対応が自動化されています。 これが最も簡単な方法です。
  18. 依存関係の更新 1/2 androidx.coreの更新が必須 dependencies { implementation 'androidx.core:core-ktx:1.16.0' // ← 1.16.0以上必須

    // その他の依存関係... } androidx.core 1.16.0以降が16KBページサイズに対応しています。
  19. 依存関係の更新 2/2 AGPバージョンも確認 android/build.gradle (プロジェクトレベル) buildscript { ext.kotlin_version = '1.9.0'

    dependencies { classpath 'com.android.tools.build:gradle:8.6.0' // ← 8.6.0以上 } } Android Gradle Plugin (AGP) 8.6.0以上が必要です。
  20. 16KBテスト環境の準備 Google公式の推奨環境 実機テスト Pixel 8/8a 以降 Android 15 Developer Preview

    Flash Toolで書き込み エミュレータテスト Android Studio Iguana以降 Android 15 (API 35) 16KB page size system image テスト対象デバイス 必須: Pixel 8/8a/8 Pro 推奨: Pixel 9シリーズ 確認: Pixel 6/7も対応可 注意事項 16KBページサイズは実験的機能 実機の方が正確な結果を取得可能
  21. エミュレータのセットアップ Android Studio での設定手順 1. Tools → AVD Manager →

    Create Virtual Device 2. Hardware Profile: Pixel 8 以降を選択 3. System Image: Release Name: Android 15 API Level: 35 ABI: x86_64 Target: Android 15 (16 KB Page Size)
  22. 動作確認 基本的な確認コマンド # ページサイズの確認 adb shell getconf PAGE_SIZE # 期待値:

    16384 # APKのインストールと起動 adb install app-release.apk adb shell am start -n com.example.app/.MainActivity # アライメントログの確認 adb logcat | grep -E "alignment|page_size" ページサイズが16384と表示されれば環境設定OK アプリが正常に起動すれば基本動作OK
  23. パフォーマンス測定 測定コマンド # 起動時間の測定 adb shell am start -W com.example.app/.MainActivity

    # TotalTime: XXXXms を確認 # メモリ使用量の確認 adb shell dumpsys meminfo com.example.app | grep TOTAL # TOTAL: XXXMB を確認 # CPU使用率のモニタリング adb shell top -m 10 | grep com.example.app 期待される結果 起動時間: 初回は遅いが、2回目以降は改善 メモリ使用量: 4KB時と比べて約5%削減 CPU使用率: ページフォルト減少により低下
  24. エラー別対処法 1/3 INSTALL_FAILED_INVALID_APK # Gradleキャッシュをクリア ./gradlew clean rm -rf ~/.gradle/caches/

    # 再ビルド flutter build apk --release 原因: ネイティブライブラリのアライメント不良 対処: クリーンビルドで解決することが多い
  25. エラー別対処法 2/3 AGP/Gradle互換性エラー エラーメッセージ Dependency 'androidx.core:core-ktx:1.16.0' requires AGP 8.6.0+ 解決方法

    android/gradle/wrapper/gradle-wrapper.properties を更新: distributionUrl=https://services.gradle.org/\ distributions/gradle-8.11.1-all.zip AGPとGradleのバージョンは互換性が必要です。
  26. エラー別対処法 3/3 NDKバージョンエラー エラーメッセージ No version of NDK matched the

    requested version 解決方法 Android StudioでNDKをインストール: 1. SDK Manager → SDK Toolsタブ 2. Show Package Detailsをチェック 3. 必要なNDKバージョンを選択してインストール(推奨: NDK r28.1.13356709)
  27. 本日のまとめ 重要な日付 2025年8月31日 API 35が必須に 2025年11月1日 16KB対応の期限 対応方法 NDK r28.1を使用(最も簡単)

    targetSdk 35に更新 androidx.core 1.16.0以上 確認方法 ./check_elf_alignment.sh \ app-release.apk ゴール arm64-v8aがALIGNED (2^16) x86_64がALIGNED (2^16) エミュレータ/実機で動作確認