【Flutter】Can't determine type Can't detfor tag '<macro name="...">'...

2024/05/31に公開

背景

Flutter SDKのバージョンアップを行なった後、Androidビルド時に以下のエラーに遭遇しました。

Can't determine type for tag '<macro name="m3_comp_bottom_app_bar_container_color">?attr/colorSurface</macro>'

考えられる原因

バージョンアップにより、依存関係にあるMaterialライブラリ (com.google.android.material)も更新され、古いタグを参照することができなくなってしまったものと思われます。

解決策

調査したところ、以下の2つのうち、どちらかの対応が必要。

  • Gradle v.7.3.3以降にアップデート
  • または、依存するcom.google.android.materialを 1.6.0 に据え置く(ダウングレード)
dependencies {
  // ...
  implementation 'com.google.android.material:material:1.6.0'

ただし、自分の場合はFlutterプロジェクトとして直接build.Gradleにcom.google.android.material の指定がなかったので、Gradle v.7.3.3以降にアップデートする方法としました。

https://github.com/material-components/material-components-android/issues/3423#issuecomment-1561471465

Gradleのアップデート

7.3.3に更新して、ビルドしてみます。

   dependencies {
        classpath 'com.android.tools.build:gradle:7.3.3'

エラー!

Could not find com.android.tools.build:gradle:7.3.3.
Searched in the following locations:
  - ....

バージョン確認

調べたところ、7.3.3はリリースされていませんでした。リリースバージョンは以下から確認できます。
https://mvnrepository.com/artifact/com.android.tools.build/gradle

改めて、利用可能なバージョンでビルド。

```androld/build.gradle
   dependencies {
        classpath 'com.android.tools.build:gradle:7.4.2'

gradle-wrapper.propertiesの更新

7.4.2にしていたらエラーが出たので、その通り更新します。

A problem occurred evaluating project ‘:app’.
> Failed to apply plugin ‘com.android.internal.version-check’.
   > Minimum supported Gradle version is 7.5. Current version is 7.4.2. If using the gradle wrapper, try editing the distributionUrl in /Users/kanoufivot/dev/idare/android/gradle/wrapper/gradle-wrapper.properties to gradle-7.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

AndroidManifestの更新

さらにエラー。

* What went wrong:
Execution failed for task ‘:app:processDevDebugMainManifest’.
> Manifest merger failed : Attribute application@allowBackup value=(false) from AndroidManifest.xml:23:9-36
  	is also present at [com.appsflyer:af-android-sdk:6.14.0] AndroidManifest.xml:32:9-35 value=(true).
  	Suggestion: add ‘tools:replace=“android:allowBackup”’ to <application> element at AndroidManifest.xml:4:5-18:19 to override.

利用しているライブラリで android:allowBackup="true" が指定されているときに、自分のアプリで android:allowBackup="false" を指定するとマニフェストのマージに失敗してビルドエラーになります。

tools:replace="android:allowBackup" を使用するために、manifestにxmlns:tools="http://schemas.android.com/tools" の指定も必要になります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    package="...">  
  
    <application  
        android:allowBackup="false"  
        tools:replace="android:allowBackup"  
        ...>  

ビルド成功

上記修正にて、無事ビルドが通りました。

参考

https://stackoverflow.com/questions/75283152/getting-cant-determine-type-for-tag-macro-name-m3-comp-assist-chip-containe

https://stackoverflow.com/questions/70545646/could-not-find-com-android-tools-buildgradle7-3-3-error-found-in-build-gradle

https://y-anz-m.blogspot.com/2015/09/androidmanifest.html

Discussion