複数のFlutterアプリで「Google Playの16KB ページサイズ要件」に対応した備忘録

※当サイトは、アフィリエイト広告を利用しています

how to備忘録

Google Play Consoleから、

「Google Playの16KBページ サイズ要件の影響を受けるアプリがあります」

という通知が来て、2025年10月末までに対応が必要だったので、四苦八苦しながら対応を終えました。

 

Androidでリリース済のアプリ(Flutterで開発)が複数あり、様々なパターンを経験したので、他の情報では見られなかった内容も含め、簡単に備忘録を共有したいと思います。

※「こうしたらできた」的な内容ですので、深い技術的な理解はできていないです。。

※16KBページサイズ自体の詳細説明は、省略しています。

 

自分の経験に基づくと、大まかな対応方法は、以下の通りでした。

  1. 事前チェック
    • Google Play Consoleで確認
    • チェックコードで判定確認
  2. 対処法
    • 「Android SDK Build-Tools 35.0.0」をインストール(入っていない場合)
    • 「settings.gradle」の「id "com.android.application" version」を「8.5.1」以上にする(必要なら「gradle-wrapper.properties」も「8.7」以上に修正)
    • 「app/build.gradle」の「ndkVersion」を「28.1.13356709」以上にする
       ■■ パッケージの更新が不要ならここで終わり ■■
    • 必要な場合、適宜パッケージを16KB対応版に更新
    • 上記に伴って、必要に応じFlutterのバージョンを更新
  3. 動作チェック
    • チェックコード2つで判定
    • 16KB対応のエミュレーターで動作確認
    • Google Play Consoleで確認

 

前提とする環境

  • PC:MacBook Pro(Intel Core i5)
  • OS:macOS Sonoma 14.5
  • Flutter:3.27.1、3.19.6(複数アプリで2種類のバージョンを使用)
  • Android Studio:Koala 2024.1.1 Patch 1
  • APIレベル35には対応済

 

対応しないとどうなるのか?

通知によると、

 

「2025年11月1日より、16 KBメモリのページサイズをサポートしていないアプリのアップデートについてはリリースできなくなります。」

 

との事なので、未対応だからといって、ストアから削除される訳ではなく、期日を過ぎても16KB対応したファイルをアップロードすれば、更新リリースはできるようです(ただ、、心配な方は、できるだけ期日前に対応した方が良いとは思います)。

 

主に参照した情報

  • 公式サイト

 

  • サイバーエージェント(CA. flutter)

こちらのYouTubeでも解説されており、大変参考になりましたm(_ _)m。

 

  • Chat-GPTへの相談

今回もフル活用しました。。

  

事前チェック(16KB非対応の状況確認)

16KB非対応の状況を確認する方法は、いくつかありますが、試行錯誤の結果、自分は下記方法で確認しました。

※公式サイトでは、Android Studioの「APK Analyzer」を使う方法が紹介されていますが、こちらの解説によると、結果が正確ではないとの事だったので、使いませんでした。

 

(1)Google Play Consoleで確認

Google Play Consoleの左メニュー「テストとリリース」→「製品版」→「リリースタブ」→「リリースを管理」→「新しいApp Bundle」に、現在リリース中のファイル情報が掲載されているので、右側の矢印「→」を押し、一番下の「メモリのページサイズ」を確認します。

 

 

ここで「16 KB 非対応」となっていれば、要対応を意味します。

「詳細を表示」し、単に「アプリは16 KBに対応していません」とだけ書かれていれば、後述するパッケージの更新は恐らく不要です。

一方、「16KBに対応していないライブラリ」の欄があり、「〜.so」(ネイティブ共有ライブラリ)の表記があると、パッケージ更新が必要になると思われます。

 

公式サイトでは、次項(2)のチェックコードの方法が紹介されていますが、Google Play Console上でも、このように親切に表示してくれているので、少なくとも自分の場合は、この(1)の確認だけでも十分でした。

  

(2)チェックコードで確認

公式サイトでは、こちらの方法が紹介されています。

 

まず、プロジェクトのルートフォルダで、

flutter build apk --release

を実行してapkファイルを作成します(自分はFVMを導入しているので、頭に「fvm」をつけています)。

次に、公式サイトで紹介されているこちらのページにあるチェックコードをコピーし、テキストエディタ等に貼り付けて、「check_elf_alignment.sh」というファイル名で、ローカル(PC内)に保存します。

  

保存したフォルダ内で、下記コマンドにて、

./check_elf_alignment.sh /Users/#####/build/app/outputs/flutter-apk/app-release.apk

チェックコードを実行します(#####はプロジェクトフォルダのパスの略記)。

 

表示された結果の中で、「arm64-v8a」もしくは「x86_64」の記載がある行に「UNALIGNED」の表示があれば、要対応を意味しています。

逆にこれらの行が全て「ALIGNED」であれば対応不要となります。

※対応が必要なのは、64-bitについてなので、「armeabi-v7a」や「x86」の記載がある行の「UNALIGNED」は、無視して良いようです。

 

例えば、自分の場合は、

/var/folders/_g/・・略・・/lib/x86_64/libimage_processing_util_jni.so: \e[31mUNALIGNED\e[0m (2**12)

という行があったので、「libimage_processing_util_jni.so」のライブラリが、要修正(16KB非対応)だと分かりました(具体的に問題のあるパッケージの特定方法は後述)。

※(1)Google Play Consoleで調べた「16KBに対応していないライブラリ」の表示と一致していました。

 

対処法(16KB非対応の解消方法)

以下、要対応と判定された場合に、必須と考えられる対応順に記載します。

 

①Android SDK Build-Tools 35.0.0をインストール(入っていない場合)

最も重要な点として、そもそも「35.0.0」以降のBuild-Toolを使わないと、16KB対応のapkを作成できないようです。

確認すると、自分の場合は、「34.0.0」を使っていたので、この時点で、リリース済の全アプリが要対応になってしまっていました。。

 

そこでまずは、Android Studioにて、下図の通り「35.0.0」をインストールしました(この対応は、1度やればOKです)。

 

 

②AGP(Android Gradle プラグイン)を8.5.1以上にする

「settings.gradle」のplugins { } ブロックに書かれているAGPのバージョンを、下記の通り、「8.5.1」以上に指定します。

id "com.android.application" version "8.5.1" apply false

 

「8.6.0」が必須と書かれている情報もありますが、自分は、Android Studioのバージョンが低いこともあり、「8.5.1」でないと、リリースビルドを作成できませんでした(公式サイトを見ても、「8.5.1」以上あれば問題ないようです)。

 

本記事では、2025年8月末対応期限だったAPIレベル35対応が完了している事を前提としているため、その場合は恐らく不要かと思いますが、「android/gradle/wrapper/gradle-wrapper.properties」のバージョン記述が「8.7」未満だと、以下のようなエラーが出ました(下記は「8.3」だった場合の例です)。

An exception occurred applying plugin request [id: 'com.android.application']
Failed to apply plugin 'com.android.internal.version-check'.
Minimum supported Gradle version is 8.7. Current version is 8.3. If using the gradle wrapper, try editing the distributionUrl in /Users/####/android/gradle/wrapper/gradle-wrapper.properties to gradle-8.7-all.zip

 

自分の場合は、APIレベル35対応の時に「8.9」にしていたので、問題ありませんでしたが、もし「8.7」未満の場合には、下記のように修正が必要です。

distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip

※「-all」は「-bin」でも問題ないようです(必要最小限の容量にするか否かの違い)

 

なお、使っているパッケージ類が、既に16KBに対応済の場合は、前記①の対応だけで、チェックコードの結果がOK(「arm64-v8a」、「x86_64」について全て「ALIGNED」)に変わりました。

しかし、①の対応のみで、リリースビルド(aabファイル)を作成し、Google Play Consoleにアップロードしても、依然として「アプリは16KBに対応していません」の表記のままだったので、結局、この②(AGP更新)と、次の③(NDK更新)の対応が必要でした。

 

③NDKを28.1以上にする

自分の場合は、「26.1.10909125」を使っていたので、下図のとおり、Android Studioにて、NDKの「28.1.13356709」をインストールした上で、

 
「app/build.gradle」のandroid { } ブロックにて、

ndkVersion "28.1.13356709"

の記述に修正しました。

 

※公式サイトにも説明がある通り、NDKのバージョンは28.1より低くても良いようですが、追加設定が必要なので、28.1を使用した方が楽だと思います。

 

前述「(1)Google Play Consoleで確認」で、特段、非対応ライブラリの表記がない場合は、恐らくここまでやった状態で、リリースビルドを作成すれば、16KB対応は完了できるかと思われます(少なくとも自分の場合はそうでした)。

 

④パッケージを16KB対応版に更新

以降は、前述(1)(2)のチェックで、16KB非対応のライブラリがあった場合になります。

"〜.so"だけだと、具体的にどのパッケージに問題があるか分からないので、プロジェクトフォルダ内を検索して調べます(名称によっては、"libsqlite3.so"のように、見て直ぐ分かるケースもあるので、その場合は検索不要です)。

 

例えば、自分の場合、「libimage_processing_util_jni.so」というライブラリ(ネイティブ共有ライブラリ)が、16KB非対応と言われたので、これがどのパッケージで使われているのか調べるために、プロジェクトフォルダで下記検索コードを実行しました。

grep -R "libimage_processing_util_jni.so" \
~/.gradle/caches/modules-2 \
~/.gradle/caches/transforms-* \
2>/dev/null | head -n 50

 

この調べ方は、Chat-GPTに教えてもらいました。

  • 「~/.gradle/caches/modules-2」→ Gradle の依存キャッシュの保存場所
  • 「~/.gradle/caches/transforms-*」 → Gradle が依存ファイルを「変換」した後のキャッシュ

を表しており、これらの中をライブラリ名で文字検索すると、パッケージ情報が見つかる可能性がある、というものです。

 

その結果、自分の場合は、

Binary file /Users/####/.gradle/caches/modules-2/files-2.1/androidx.camera/camera-core/1.3.3/####/camera-core-1.3.3.aar matches

という表示が出たので(「####」は表記を省略)、ここから、使っていたcameraパッケージが怪しいと分かりました。

 

実際、cameraパッケージを最新版(現時点で0.11.2)に更新したら、16KB非対応が解消されました。 

なお、自分の場合、パッケージ更新後に、改めてapkを作成しようとすると大量のエラーが出ましたが、「pubspec.lock」を削除してから、「pub get」することで解消できました。

 

全てのパッケージに16KB対応が求められるのか?:

自分の場合、既に対応期日の2025年10月末が近かった事や、定期的に更新されているパッケージを用いていることもあり、いずれのアプリにおいても、要対応となったパッケージを最新版に更新するだけで、16KB対応を満たすことができました。

但し、公式サイトのこちらにも説明がありますが、全てのパッケージに16KB対応が求められる訳ではなく、NDK・C/C++ベースのネイティブライブラリを用いたパッケージだけが影響を受けるようです。

そのため、更新頻度が低いパッケージでも、純Dartで実装されており、ネイティブ依存が無いパッケージであれば、16KB非対応の懸念はないようです。

 

⑤必要に応じFlutterのバージョンを更新

必ずしも16KB対応に必要な訳ではありませんが、前記④でパッケージを更新する際、Flutter SDKも更新が必要になる場合があります。

自分の場合も、cameraパッケージを更新するために、Flutterのバージョンを、「3.19.6」から「3.27.1」に上げる必要がありました。

 

Flutter3.27.1に上げるときに必要だった対応については、下記に記載していますので、よろしければご参照ください。

 

動作チェック(16KB対応済の確認)

前述までの修正が終わったら、確かに16KB非対応が解消されているか、いくつかの方法で確かめます。

 

2つのチェックコードで判定

公式サイトには、2つのチェックコードが掲載されています。

 

1つ目の方法は、再度、apkファイルを作成し、前述(2)のチェックコードで、「./check_elf_alignment.sh・・・」のコマンドを実行する方法です。

実行結果において、「arm64-v8a」もしくは「x86_64」の記載がある行が、全て「ALIGNED」になっていればOKです。

 

2つ目の方法は、同じく再作成したapkファイルに対して、下記コードでチェックする方法です(プロジェクトのルートフォルダで実行)。

~/Library/Android/sdk/build-tools/35.0.0/zipalign -c -P 16 4 build/app/outputs/flutter-apk/app-release.apk

※Build-Toolが「~/Library/Android/sdk/」にある場合の例です。

 

実行結果の表示ログの最後に、「Verification succesful」が表示されれば、OKとなります。

 

恥ずかしながら、詳細は理解できていませんが、Chat-GPTに聞いたところ、1つ目と2つ目の方法は、チェックの観点が違うらしいので、念のため、両方確かめておいた方が良いようです。

※ご参考に、2つの方法について教えてもらった概要を掲載します。

  • 1つ目の方法(「check_elf_alignment.sh」を使う方法):
    • APK内に入っているネイティブライブラリ(.so = ELFファイル)の内部構造を確認
    • ELFファイルの セグメント(ロード領域)が16KB境界に揃っているか をチェック
    • つまり 「.so 自体の中身が16KBページ環境に適合しているか?」 を確認
  • 2つ目の方法(「zipalign」を使う方法):
    • APK (ZIP形式コンテナ) の中で、各ファイルの開始オフセットが16KBページ環境に適合しているかをチェック
    • つまり 「APKの入れ物として正しいアラインメントか?」 を確認

 

16KB対応のエミュレーターで動作確認

自分のAndroid Studioのバージョンが古いためか、公式サイトの説明図とは仕様が異なっていたので、若干、16KB対応のエミュレーターの作成で苦労しました。

以下は、あくまで自分の環境の例ですが、Android Studioで、下記の通り「16KB Page Size」のシステムイメージをインストールし(下図はAPI 35のエミュレーターを作成する場合の例)、

 

エミュレーターの作成画面で、「16 KB Page Size」の「Target」を選んでエミュレーターを作成します。
※自分のAndroid Studioのバージョンだと、Targetの列に「16 KB Page Size・・・」と、さり気なく書かれているので、なかなか気づけませんでした。。

 

エミュレーターを起動後、ターミナルで「adb shell getconf PAGE_SIZE」のコマンドを実行し、「16384」と表示されれば、16KBになっている事を確認できます。

作成したエミュレーター上で、無事アプリをビルドできれば、OKとなります。

 

Google Play Console上で確認

最後に、更新用のリリースビルド(aabファイル)を作成し、Google Play Consoleにアップロードして、当該App Bundleの「メモリのページサイズ」が「16 KB 対応」に変わっていれば、対応完了です。

 

 

更新版について、Googleの審査が終わり、Google Play上にリリースされても、しばらくは「2025年11月1日までに、アプリで 16 KB メモリのページサイズをサポートする必要があります」の警告が出たままでした。

しかし、半日ほどすると、「先日お知らせしたアプリのポリシー違反が対処されました」という通知が来て、無事、警告が解消されました。

 


以上の方法にて、Androidでリリース済の全てのアプリで、16KB対応を無事、完了できました。

  

以上、どなたかのご参考になれば幸いです。

 

 

リリースしたアプリ(全てFlutterで開発)

 

個人アプリ開発で役立ったもの

おすすめの学習教材

超初心者向けでオススメな元Udemyの講座/

 

 \キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/

 

\Gitの基礎について無料で学べる/

 

おすすめの学習書籍

実用的image_pickerに関してかなり助けられた/

 

Dartの基礎文法を素早くインプットできる/


Dart入門 - Dartの要点をつかむためのクイックツアー

コメント

タイトルとURLをコピーしました