くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutter3.16から3.19への移行が大変だった

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自体のキャッシュがあるので、
アプリを削除して、再インストールしないと発見できない。。

ただこのあたりを見ると、サンプルが更新されているので、
もうすぐ対応されるかもしれない。

やったこと

とりあえず、途中までいろいろ調べたので、
やったことをまとめていく

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だとビルドエラーになる。。。

主にこのあたりの対応関連っぽい

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_loaderflutter-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)

以上!! かなりハマったけど、なんとかアプデできた。。(*´ω`*)

参考にしたサイトさま