👻

【Flutter】「アプリは Android 14(API レベル 34) 以降を対象とする必要があります」とか言われる件

2024/07/07に公開

Google Play Console から
「アプリは Android 14(API レベル 34) 以降を対象とする必要があります。2024年8月31日より、最新の Android リリースから 1 年以内の API レベルを対象としていない場合は、アプリを更新できなくなります。」
というメッセージが送られて来た。

Google Play Consoleを開いて対処方法を見ても、具体的にどこをどう修正しろとは書いてない・・・

こちらとしては、そんなに古いバージョンまでサポートする必要ないし、そもそもGoogle Playに掲載できなくなるんなら、そりゃ古いバージョンは否応も無く動作対象外にせざるを得ない。
FlutterもDartも最新版に上げてあるし、Android Emulatorの動作チェックも最新版とその一個前くらいしかやってない。
って言うか、そもそもFlutterってGoogle社謹製なんだから、デフォルトでGoogle Play Consoleが受入れ可能なバージョンに上げといてくれちゃってればいいのに、なんでそうはなってないんだろ?

まぁそれはともかく・・・下記のようなサイトと記事を参考にさせてもらいました

https://developer.android.com/guide/topics/manifest/uses-sdk-element

https://zenn.dev/kyuki/articles/bb483152bc9c28

早く答えを知りたい方は上のyuki katayamaさんのほうを見ていただくほうがいいのですが
自分用の備忘も兼ねて書いてます

で、android/app/build.gradleを見たら、こんなふうになってたんだよね

android/app/build.gradle
android {
        ...
    defaultConfig {
        ...
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        ...
    }

minSdkVersion flutter.minSdkVersion
って数字書いてないじゃん
flutter.minSdkVersionってどこに定義してあるんだよプンスカ!!
ってなってさらに調べたら、

https://punaime.jp/flutter-minsdkversion-define-location-confirmation/

flutter/packages/flutter_tools/gradle/flutter.gradle
に書いてあるんだってさ

flutter/packages/flutter_tools/gradle/flutter.gradle
class FlutterExtension {
    ・・・
    static int minSdkVersion = 16
    ・・・

じゃあこれを

flutter/packages/flutter_tools/gradle/flutter.gradle
class FlutterExtension {
    ・・・
    static int minSdkVersion = 34
    ・・・

に直せばいいんでしょって思ったら、

ここでflutter.gradleのコードを直接変更すると、SDKのアップデートのたびに変更が必要となり、好ましくありません。そのためdefaultConfigの定義を書き換えることが一番簡単な修正方法となります。

って言うんで、それもそうだなっていうことで、結局今直してるアプリのandroid/app/build.gradleに戻って、

android/app/build.gradle
android {
        ...
    defaultConfig {
        ...
-       minSdkVersion flutter.minSdkVersion //この行をコメントアウト
+       minSdkVersion 34
        targetSdkVersion flutter.targetSdkVersion
        ...
    }

結局、yuki katayamaさんと同じ結論になりましたポリポリ( T_T)\(^-^ )

まとめると
アプリを作ったら毎回その時の最新APIバージョンの一個前の数字にして、
そのアプリは最低年1ペースでこの箇所を修正するようにする
新規アプリでもこれと同様のことを毎回してから
flutter clean
flutter build appbundle
して、
Google Play Consoleに送信するとイイよ

ってことらしいです

なんか、こういうのは自動化できたらいいのにな

あとついでながら、この箇所を修正すると当然ながら次のビルドを作ってアップロードしなくちゃいけないので、
android/app/build.gradleのこの箇所と、

android/app/build.gradle
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '7'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '2.0.2'
}

pubspec.yamlのこの箇所の番号を

pubspec.yaml
version: 2.0.2+7

適宜インクリメントしなくちゃいけません

リリースしたアプリが何個もあるとそれなりにタイヘンですが、Googleさん的には「ちゃんと定期的にメンテナンスしろよ」ってことらしいので、まあしょうがないですね


と、ここまで書いといてナンなんだけど、そもそも1年以内に更新してるアプリだったら、タイトルのようなメールは飛んで来てない
たまたまこのアプリ、なんの不具合も機能追加もなく1年放置してしまったから、こんなことになってるんだよな

その一方で、Flutter SDKはちゃんとアップデートしてきた
そのFlutter SDKを見ると、

flutter/packages/flutter_tools/gradle/flutter.gradle
class FlutterExtension {
    ・・・
    static int targetSdkVersion = 34
    ・・・

ってなってるんだけど、
これがもしかして、前にアプリをビルドした時に33になっていたのでは?
ということに思い至ったんだよね

と言うことはつまり、なんの不具合修正も機能追加も無くても、
ただ新しいSDKを使ってビルドをやり直せばイイんじゃね?

デフォルトでGoogle Play Consoleが受入れ可能なバージョンに上げといてくれちゃってればいいのに
とかなんとか言っちゃってたんだけど、実はちゃんとそうなってた!?
Flutter SDKさんゴメンよ・・・

新しいビルドをconsoleに登録するために、
android/app/build.gradleのこの箇所と、

android/app/build.gradle
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '7'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '2.0.2'
}

pubspec.yamlのこの箇所の番号を

pubspec.yaml
version: 2.0.2+7

この部分だけ修正して、新しいSDKで
flutter clean
flutter build appbundle
して、
app-release.aabをGoogle Play Consoleにアップロードしてやれば、
それでイイんじゃね?

いちいち
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
こんなのイヂる必要無かったんじゃねぇの?

昨日consoleにアップ&公開はしたけど、targetSdkVersion = 34 が最終的にOKになったのかわからないので、ちょっとモヤモヤしてるんだけどねぇ・・・・

もしこれが正解なんだったら、

Googleさん、それ早く言ってよ・・・・😅

松重豊さんのあの表情が目に浮かぶ

その後、本当の解決・・・

ホントウの問題はそこじゃなくて、最初期の「内部テスト」リリースを公開したまま(もう本番リリースしたしOKでしょ、と思い込んで放置してた)になってたことだった・・・。Google Play Consoleでは一度公開リリースしてしまうとリリースの削除ができない(「公開したくないリリースを破棄できるようになりました」って書いてあるのは公開前だけの話)ので、またもやしばらく悩んでしまったんだけど、「トラックを一時停止」というボタンを見つけて押したら、上記の解決メールが来た
一時停止でいいのかよ・・・・
そっちだったんかよ・・・・
ここまでの苦労はなんだったんだよ・・・・

Googleさん、それならそうと、早く言ってよ・・・・😅part2

そうして今日も疲労困憊ル

Discussion