💣

FlutterでAndroidのbuildをしたらエラーが出た!

2022/06/04に公開

Firebaseの接続する設定が変わっている?

内容を修正しました😅

  1. タイトルの変更
  2. 英語の小文字と大文字の違いでエラーが出ることを書いてなかった!!!
  3. わかりずらいなと思い修正しました。読者の皆様ご迷惑をおかけいたしました🙇‍♂️

最近Firebase CLIなるものが流行っていて、google-service.jsonをあまり使っていなかったのですが、2022年の6月4日土曜日に使うと久しぶりに、buildエラーにハマった😱

こちらのサイトのサンプルコードを使って学習を進めていたときに起きました!
https://flutternyumon.com/firestore-add-data/

解決法

こちらのコードを変更する必要があります!

applicationId "com.example.messagesApp"// "この中のcom.example.アプリ名"

Firebaseからダウンロードしたファイルに書かれていたこちらのコードと異なるとエラーが発生する!
なぜかというと、build.gradleほapplicationIDは、小文字で書かれていて、google-service.jsonの方は、大文字で書かれているからです😱

applicationId "com.example.crud_sample"

こちらをapp/build.gradleで使用する。

"package_name": "com.example.messagesApp" // "この中のcom.example.アプリ名"

google-services.json

{
  "project_info": {
    "project_number": "870802808383",
    "project_id": "flutter-demo007-f14d2",
    "storage_bucket": "flutter-demo007-f14d2.appspot.com"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:870802808383:android:9d0646122b24c36e58628a",
        "android_client_info": {
          "package_name": "com.example.messagesApp" // こちらをapp/build.gradleのapplicationIdにコピーアンドペーストする
        }
      },

app/build.gradle

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

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

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services'// 追加

android {
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.messagesApp"  // google-services.jsonの"package_name": "com.example.messagesApp"と同じにする
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
        minSdkVersion 21 // 21に設定
        targetSdkVersion 31 // 31に設定
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled true // Android公式より追加
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation platform('com.google.firebase:firebase-bom:30.1.0')// 追加
    implementation "androidx.multidex:multidex:2.0.1" // Android公式より追加
}

設定後にAndroidでbuildできていたので、大丈夫だと思われます。エラーにハマって焦りました😅

追加情報

業務をやっていて、最近FlutterSDK本体の方の設定をすれば、作成したプロジェクトの「minSdkVersion」と「targetSdkVersion」を自分で入力しなくても良いことに気づきました!

app/src/build.gradle

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

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

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.page_provider"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
        minSdkVersion flutter.minSdkVersion // Flutter3では数値が書かれていない!
        targetSdkVersion flutter.targetSdkVersion // Flutter3では数値が書かれていない!
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

実は、数値の設定はしなくても良かったのを今日知った😇

Flutter本体を設定する⚙️

Developフォルダの中に配置されたダウンロードされたFlutterSDKのパス

/Users/hashimotojunichi/Development/flutter/packages/flutter_tools/gradle

flutter.gradleというファイルを開く!

ファイルはVScodeを起動してドラッグ&ドロップすると簡単に開けます🧑🏼‍🎓

ファイルの中身

16と書いてあるところを21に変更するだけです。簡単でした。これだけです😅

調べても全然情報が出てこないから驚きましたね!!!
Googleさんもあまり親切ではないな😅😅😅

新手に出てきた問題!

x-codeのキャッシュを消す作業をして余計なもの削除して、x-codeぶっ壊して、Flutterでbuildできなくなったので、古いx-codeを削除して、AppStoreから、新しいバージョンをインストール。

x-codeぶっ壊れたときは、SwiftUIとStoryboard選ぶ場所がなくなってたような?
選択画面を間違えただけかも?

こちらの記事が参考になった?
https://qiita.com/ladybugs/questions/988db95ec192826f3c93

flutter channel stable
flutter upgrade --force
flutter pub cache repair

flutter channel stableしたら、赤いエラーでたが、治ったみたい?
新しいFlutterをダウンロードして、Developフォルダに配置すればよい?
コマンドでアップデートするより、こっちの方がいいかも?

Flutterを3.0.1から3.0.2へコマンドでアップデートしたのですが、minSdkVersion flutter.minSdkVersion(最小バージョン)が16に戻ってしまうようです😇
ですので、新しいのを入れたら毎回リセットされるよな...
出ないと整合性の不具合というものが出てくる!

20230913 WED

また、本体の設定を変えようとしたらファイルの場所が移動してました!
最新版はこちらにminSDKの数字が書かれています!

パスしか書かれてない?

ここにある!

Discussion