FlutterでAndroidアプリを繰り返しrunしていると突然コケることがある

こんな感じで、突如 File name too long を吐き出して以降コケ続けることがあります。

* What went wrong:
Execution failed for task ':app:copyFlutterAssetsLocalDebug'.
> Could not copy file '/hoge/fuga/…/android/app/build/intermediates/flutter/{variant}/flutter_assets/android/app/build/intermediates/merged_assets/{variant}/out/flutter_assets/android/app/build/intermediates/merged_assets/…/piyo' to '/hoge/fuga/…/android/app/build/intermediates/flutter/{variant}/flutter_assets/android/app/build/intermediates/merged_assets/{variant}/out/flutter_assets/android/app/build/intermediates/merged_assets/…/piyo'.
   > /hoge/fuga/…/android/app/build/intermediates/flutter/{variant}/flutter_assets/android/app/build/intermediates/merged_assets/{variant}/out/flutter_assets/android/app/build/intermediates/merged_assets/…/piyo (File name too long)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 48s
Exception: Gradle task assembleLocalDebug failed with exit code 1

手元の環境では gradle の copyFlutterAssetsTask のタイミングでコケていました。

原因

よくわかりません🙏
ただ、下記ツイートにあるようにbuild回数を重ねる事にbuildディレクトリが深くなっていっているので、buildの都度ディレクトリが掘られる -> file name too long の流れっぽいことは確かだと思われます。

とりあえずの対応策

根本原因は分からないので場当たり的な方法になりますが、手っ取り早くやるなら下記コマンドでbuildディレクトリを削除して再度runすればOK。

rm -rf android/app/build

自分は都度コマンドを叩くのが面倒だった為、AndroidStudioの機能を使って以下のようなシェルスクリプトをbuildの前に実行するようにして凌いでいます。

#!/bin/bash

DIR="android/app/build/intermediates/flutter/{variant}/flutter_assets/android"

if [ -d "$DIR" ]; then
  rm -rf "$DIR"
fi

DIR="android/app/build/intermediates/merged_assets/{variant}/out/flutter_assets/android"

if [ -d "$DIR" ]; then
  rm -rf "$DIR"
fi

※{variant}の部分は各自の環境に読み替えてください
※とりあえず上の2つのディレクトリを消しておけば大丈夫そうでした

一応AndroidStudioの設定手順も

step1
step2
step3

さいごに

もし根本原因&解決策がお分かりの方いらっしゃいましたら是非Twitterの方にDMかリプください🙇‍♂‍