Flutter3.16から3.19へ移行してみようと思ったら、
かなりハマったので、いろいろ調べたときの備忘録(*´ω`*)
環境はこんな感じ。主にAndroid側の設定でハマる
- VSCode/Mac M2
- FVM: 2系 → 3系
- Flutter: 3.16.9 → 3.19.6
- AndroidStudio: → 2022.1.1(JDK11) → 2023.3.1(JDK17)
- Gradle: 7.5 → 8.2
- share_plus: 7.2.2 -> 9.0.0
- package_info_plus: 4.1.0 -> 8.0.0
- purchases_flutter(RevenueCat): 6.27.0
注意
RevenueCatのpurchases_flutter
はまだ新しい書き方に対応していないっぽい
Purchases.getOfferings()
やPurchases.getCustomerInfo()
を実行すると、
レスポンスが返ってこなくて、動かなくなる。。
build.gradle周りの変更をしないと、正常に動く。。
Purchases.setLogLevel(LogLevel.verbose)
にしてもなにもわからない
しかも、RevenueCat自体のキャッシュがあるので、
アプリを削除して、再インストールしないと発見できない。。
ただこのあたりを見ると、サンプルが更新されているので、
もうすぐ対応されるかもしれない。
- Migration to applying Gradle plugins with the declarative plugins block in sample by vegaro · Pull Request #1062 · RevenueCat/purchases-flutter
- [AUTOMATIC] Release/6.29.1 by RCGitBot · Pull Request #1068 · RevenueCat/purchases-flutter
やったこと
とりあえず、途中までいろいろ調べたので、
やったことをまとめていく
FVM/FlutterSDKのアップデート
- FVM: 2系 → 3系
- Flutter: 3.16.9 → 3.19.6
Homebrewで管理しているので、brew
コマンドでアプデ
$ brew upgrade fvm $ fvm install 3.19.6 $ fvm use 3.19.6
.fvm/
配下のSDKの場所だったり、
.fvmrc
が追加されたりなどちょっと変わってる。
// .vscode/settings.json { - "dart.flutterSdkPath": ".fvm/flutter_sdk", + "dart.flutterSdkPath": ".fvm/versions/3.19.6", // 略 }
// .fvm/fvm_config.json { - "flutterSdkVersion": "3.16.9" + "flutterSdkVersion": "3.19.6" }
// .fvmrc + { + "flutter": "3.19.6", + "flavors": {} + }
// android/local.properties sdk.dir=/Users/myuser/Library/Android/sdk - flutter.sdk=/Users/myuser/fvm/versions/3.16.9 + flutter.sdk=/Users/myuser/fvm/versions/3.19.6 flutter.buildMode=debug flutter.versionName=0.0.1 flutter.versionCode=1
モノレポで複数プロジェクトにしていて、
各プロジェクトにも.vscode/settings.json
がある場合は、
そっちのバージョン変更も確認
android/local.properties
も見落としがち
fvm use 3.19.6
をしただけだと反映されず、
ターミナルを一度再起動する必要があるので、
fvm flutter --version
で確認
AndroidStudio周りのアプデ
- AndroidStudio: → 2022.1.1(JDK11) → 2023.3.1(JDK17)
- Gradle: 7.5 → 8.2
主にこれの対応。build.gradleの書き方が変わるらしい
AndroidStudioの更新
AndroidStudioもHomebrew管理なので、brew
コマンドでアプデ
$ brew brew upgrade android-studio
JDKはAndroidStudio組み込みのJDKを使っているけど、
以下のパッケージがJDK17を必要になるので、
古いAndroidStudioだとビルドエラーになる。。。
- share_plus: 7.2.2 -> 9.0.0
- package_info_plus: 4.1.0 -> 8.0.0
主にこのあたりの対応関連っぽい
build.gradleの更新
まだ、非推奨なので、変更しなくても警告が出るだけだけど、 以下の対応をしていく。
FlutterFireやFirebase周りについては書いてないので、めっちゃはまる。。
android/build.gradle
このあたりをごっそり削除。各バージョンは後で使うので、控えておく
- buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - // START: FlutterFire Configuration - classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:perf-plugin:1.4.1' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' - // END: FlutterFire Configuration - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } - } allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(':app') } tasks.register("clean", Delete) { delete rootProject.buildDir }
android/settings.gradle
android/build.gradle
で削除した内容を持ってくる感じ
app_plugin_loader
やflutter-gradle-plugin
を使わなくなり、
flutter-plugin-loader
を利用するようになる
pluginManagement { def flutterSdkPath = { def properties = new Properties() file("local.properties").withInputStream { properties.load(it) } def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath } settings.ext.flutterSdkPath = flutterSdkPath() includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } + plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.15" apply false + id "com.google.firebase.firebase-perf" version "1.4.1" apply false + id "com.google.firebase.crashlytics" version "2.8.1" apply false + // END: FlutterFire Configuration + } include ":app" - apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"
android/app/build.gradle
android/settings.gradle
で定義したライブラリを、
実際に利用するようにする設定。
android/build.gradle
に書いてたみたいな感じ。
plugins { id "com.android.application" id "kotlin-android" id "dev.flutter.flutter-gradle-plugin" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + id 'com.google.firebase.firebase-perf' + id 'com.google.firebase.crashlytics' + // END: FlutterFire Configuration } // 略
Gradle/Android Gradle Plugin(AGP)の更新
- Gradle: 7.5 → 8.2
gradle-wrapper.properties
android/gradle/wrapper/gradle-wrapper.properties
で、
利用するGradleバージョンを変更する
// android/gradle/wrapper/gradle-wrapper.properties distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists - distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip + distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
android/settings.gradle
Gradleバージョンにあわせ、com.android.application
も変更
// android/settings.gradle pluginManagement { // 略 } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false + id "com.android.application" version "8.2.0" apply false id "org.jetbrains.kotlin.android" version "1.7.10" apply false // START: FlutterFire Configuration id "com.google.gms.google-services" version "4.3.15" apply false id "com.google.firebase.firebase-perf" version "1.4.1" apply false id "com.google.firebase.crashlytics" version "2.8.1" apply false // END: FlutterFire Configuration } include ":app"
Android Gradleプラグイン(com.android.application)のバージョンと、
対応しているGradleのバージョンは以下にまとまっている
その他の変更
fluttre create -t app
のテンプレート比較すると、
AndroidManifest.xmlもちょっとかわってた。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:label="sample" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> <!- 略 --> </application> + <!-- Required to query activities that can process text, see: + https://developer.android.com/training/package-visibility?hl=en and + https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. + + In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> + <queries> + <intent> + <action android:name="android.intent.action.PROCESS_TEXT"/> + <data android:mimeType="text/plain"/> + </intent> + </queries> </manifest>
NDKのバージョン
必要に応じて、NDKのバージョンを指定する必要がある。
android { ndkVersion "26.3.11579264" // or ndkVersion "25.2.9519653" }
各種コマンド
古いキャッシュが悪さをしてたりするので、
適宜消しながら、試してみるといい感じ。
# ビルドしたファイルを削除 $ fvm flutter clean # pub getで取得時のキャッシュを削除 $ fvm flutter pub cache clean # pub getで取得したパッケージを再インストール $ fvm flutter pub cache repair # Android側(Gradle)のclean $ cd android && ./gradlew clean # iOS側(CocoaPods)をclean $ cd ios && .pod cache clean # パッケージのアップデートの確認 $ fvm flutter pub outdated # パッケージのアップデートを実行 $ fvm flutter pub upgrade <package_name> # 詳細版で見ると、JDKのバージョンが確認できる $ fvm flutter doctor -v [✓] Android Studio (version 2023.3) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.10+0-17.0.10b1087.21-11572160)
以上!! かなりハマったけど、なんとかアプデできた。。(*´ω`*)
参考にしたサイトさま
- purchases-flutter/revenuecat_examples/purchase_tester/android at main · RevenueCat/purchases-flutter
- Android Gradle plugin 8.4 release notes | Android Studio | Android Developers
- Android is all of a sudden DEAD - getCustomerInfo doesn't work and getOfferings · Issue #992 · RevenueCat/purchases-flutter
- [Android] Autofill from saved credentials doesn't work · Issue #137760 · flutter/flutter
- 「17は無効なソース・リリースです」というエラー
- 【Flutter】AndroidのAPKビルドがgradleやAndroid 12のエラーがでて出来ない問題の解決策 #Android - Qiita
- 【Flutter】「You are applying Flutter’s main Gradle plugin」の警告を解決│Flutter Salon
- Flutterでエラーが発生した時の解決方法 #iOS - Qiita