【Flutter】Androidビルドエラー攻略テクニック徹底解説📱
要旨
主旨
Flutterを使用したAndroidアプリ開発において、最も厄介な『ビルドエラー』。
プログラムのコードエラーと違い、嵌るとなかなか抜け出せない蟻地獄のようなものである🐜
これらのエラーは、Gradleの設定ミス、Java環境の不整合、依存関係の問題など、さまざまな要因によって引き起こされる。
ツイッター
端的には先日のツイッターに投稿した通り
ビルドエラーとの長き格闘の末 ……
流れ
大まかな流れは以下の通り
Flutter SDKを最新にアップグレード
flutter upgrade にて、バージョン3.22.2 → 3.27.2 にする。
今思えば、これが悪夢の始まりだった ……Androidビルドエラー
Plugin [id: 'com.android.application'] was not found in any of the following sources:が発生するダウングレード
色々試したが解決しないので 3.27.2 → 3.22.2 にダウングレードして、やり直す事に「Flutter: Running Gradle task 'assembleDebug' … 」から一向に進まない
Gradleタスクの進行状況を見ると「JAVAがないのでインストールしてね」と有り得ないことをほざかれる。調査結果
Flutter側で『jbr』(JetBrains Runtime)ではなく、標準の「jre」のディレクトリ名を前提に見に行っている事が判明。解決策
暫定的にシンボリックリンクを作成。攻略テクニック
ビルドエラーとの格闘をもとに得た「攻略テクニック」を纏めてみた
本記事では、先日起きたビルドエラーとの格闘をもとに得た「攻略テクニック」の忘備録を記する📝
1.Flutter SDKを最新にアップグレード
何かさ、ChatGPT先生が言ってきたんだよね”Flutterを最新バージョンにした方が良いよ🤖”って。
# Flutter SDKを最新にアップグレード
flutter upgrade
それもそうかと思い、最新にアップグレード。
flutter upgrade にて、バージョン3.22.2 → 3.27.2 にする。
今思えば、これが悪夢の始まりだった ……
2.Androidビルドエラー
アップグレード後、早速来ましたビルドエラー。
”Plugin [id: 'com.android.application'] was not found in any of the following sources:”だそうだ。
一見、簡単に解決しそうに思えたが、いやいや何のその全然解決しません。
”The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for information on installing Java.”
「JAVAがないのでインストールしてね」とか言われる。
いや、いや、いや、いや 有り得んて🤣
で、gradleファイル周りの設定を色々試してみる
が、解決しない……
全然、解決しないまま時間だけが過ぎていき、だんだん面倒臭くなってくる😑
という事で、Flutter SDK ダウングレードして元に戻してみる事にした。
3.ダウングレード
flutter downgrade <バージョン> が出来ない
# 現在のFlutterのバージョンを確認
flutter --version
Flutter SDK 3.27.2 なので、これを 3.22.2 にダウングレードする。
# Flutter SDKを3.22.2にダウングレード
flutter downgrade 3.22.2
エラーが出て、このリンクを見ろと言われるので、見てみる。
色々書かれているが、要するに「GitHubを使ってね」との事。
GitHubを使ってダウングレード
●Flutterのある場所に移動
# Flutter SDKをインストールしてある場所に移動(人によって場所が違うので要調整)
cd /Users/macbook/flutter
●リポジトリの更新情報を見る
# リポジトリの更新情報を見る
git fetch
●タグを一覧表示(コミット日時の新しい順)
# タグを一覧表示(コミット日時の新しい順)
git tag --sort=-committerdate
下の方にスクロールしていくと
愛しの「3.22.2」を発見
●バージョンを指定してチェックアウト
# バージョンを指定してチェックアウト
git checkout 3.22.2
●ダウングレードされたか確認
# 現在のFlutterのバージョンを確認
flutter --version
愛しの「3.22.2」の奪還に成功。
●flutter doctor で環境診断
一応確認しておく。
開発チャンネルが[user-branch]の為か黄色表示。
まあ、今回は取りあえずビルドエラー解消を優先とする。
4.「Flutter: Running Gradle task 'assembleDebug' … 」から一向に進まない
今度こそ❗️と思いきや
「Flutter: Running Gradle task 'assembleDebug' … 」から一向に進まない。
またもや「JAVAがないのでインストールしてね」とか言われる。
何このデジャヴ🕰
念のためAndroid Studioの方も再度試すが、やはりこちらはビルドが通る。
どうでも良いけど、この 'assembleDebug' … 初回ビルドは時間掛かるらしいが、エラーの場合はさっさとそれを出して欲しい。
ずっと'assembleDebug' … のまま変わらないんですもの😑
5.調査結果
結論
結論から言うと
これにより、Android StudioのJAVAを見つけられずビルドが通らなかった訳である。
●Android Studio 側
/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
●Flutter 側(android/gradlew)
もっとも「 JAVACMD="$JAVA_HOME/jre/sh/java" 」の方は、コメントから察するに「IBMのAIXシステム」での参照先なので、macOSとは関係ないが何となく「jre」の発想が浮かんでくる。
gradlew.batの方も、もう少し調べたかったのだがキリがなさそうなので止めておいた。
先人の方がすでに原因及び解決法を残されていた。
嗚呼、もっと早くググっておけば良かった。
ここからは、私の憶測だが
本来は何かしらの方法で『jbr』のディレクトリ名を前提に見に行く仕組みが施されているが、何かの拍子で「jre」を見に行くようになった。
(例:Flutter SDKのアップグレード/ダウングレードなどの時など)
調査に時間が掛かった理由
●Flutter 側
「flutter doctor --verbose」Android toolchain項目の出力。
/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
となっているが、実際は違っていた。
これの出力結果は「jbr」のつもりだよ、ってだけの話であり、必ずしもその通りのパスの参照を保証するものではない。
だって、こんな風に出力されたら「Android Studioの参照先と同じで間違ってはいない」と思っちゃうじゃん、普通。
有り得ん、まじで有り得ん
もう、何も信じられんわ ……(厨二病)
6.解決策
既にシンボリックリンクがあるか確認
そもそも、どのような仕組みで『jbr』のディレクトリ名を前提にしてたのかが分からんが、暫定的にシンボリックリンクを作成して対処する。
念のため、もう既にシンボリックリンクがあるか確認しておきたい所。
# シンボリックリンクがあるか確認
# 「jre -> jbr」のように『 -> 』が無ければ、ただのディレクトリ
ls -l /Applications/Android\ Studio.app/Contents/
さらに、シンボリックリンクであるか確認までする、石橋の叩きよう。
# シンボリックリンクであるか確認
# 『 -> 』が有ればシンボリックリンク、無ければ通常のディレクトリ。
ls -ld /Applications/Android\ Studio.app/Contents/jbr
無いようですね。
シンボリックリンクを作成
# 移動する
cd /Applications/Android\ Studio.app/Contents
# シンボリックリンクを作成
# 元に戻す(削除したい場合)sudo rm jre
sudo ln -nfs jbr jre
ピックアップすると以下のような感じ
ここで「ln: jre: Operation not permitted」と出る。
「フルディスクアクセス」の権限を付ける
この場合は「フルディスクアクセス」の権限を付ける必要がある。
改めて「sudo ln -nfs jbr jre」をすると通る、
シンボリックリンクが出来たか確認する。
# シンボリックリンクがあるか確認
# 「jre -> jbr」のように『 -> 』が無ければ、ただのディレクトリ
ls -l /Applications/Android\ Studio.app/Contents/
さらにリンク情報も確認してみる
# 詳細なリンク情報を表示
stat /Applications/Android\ Studio.app/Contents/jre
ビルドしてみる
通った✨
他の方法
今回は以下のようにしたが
ChatGPT先生曰く、他にも以下のような方法がある模様🤖
もともと上手くいっていた頃は android/gradle.properties など、どこかしらに設定されていたとか❓
うーむ、未だ謎である🤔
7.攻略テクニック
プロジェクトを作り直す
上記のこの画面。
flutter clean をしただけで flutter pub get をしなかった時によくある事だが、flutter pub get をしてもエラーが解消しない場合がある。
pubspec.yamlも問題なし、後述する『依存関係修復の徹底攻略』なども試すがエラーのまま。
このように、にっちもさっちもいかない場合は「プロジェクトを作り直す」のも手であろう。
この部類のエラーは、下手に執着して時間を浪費するより「逃げるが勝ち」なのである。
「./gradlew assembleDebug」と「flutter run」との違い
つまり「ビルドが通るか」を試したいのみの場合は ./gradlew assembleDebug(オプション無し)が良いだろう。
●オプションを付ける
オプションを付けるとログの出力となる。
「何故、ビルドが通らなかったのか?」の調査に役に立つ。
・「 --stacktrac 」オプション
flutter run の終了後、ログを見たい場合
# android ディレクトリに移動
cd android
# Gradleビルド後のエラー発生時の情報
./gradlew assembleDebug --stacktrace
・「 --info 」オプション
flutter run の最中「Flutter: Running Gradle task 'assembleDebug' … 」が進まない時に、進行状況の確認をしたい場合
# android ディレクトリに移動
cd android
# Gradleビルド中の進行状況など)
./gradlew assembleDebug --info
パッケージ依存関係の最新バージョンを表示
●flutter pub outdated コマンド
# 依存関係の最新バージョンを確認する
flutter pub outdated
flutter pub outdated コマンドは、パッケージ依存関係の最新バージョンを表示する
Flutter環境診断をより詳細に出す
● flutter doctor --verbose オプション
# Flutter環境の診断(簡潔版)
flutter doctor
# Flutter環境の診断(詳細版)
flutter doctor --verbose
Flutter環境の診断に使われる flutter doctor コマンドだが --verbose オプションを付けると、より詳細な情報が出力される
暫定的にシンボリックリンクを作成する
先ほどの復習となるが
この場合、Android StudioのJAVAを見つけられずビルドが通らない。
ここでは、暫定的にシンボリックリンクを作成するコマンドを記す。
# シンボリックリンクがあるか確認
# 「jre -> jbr」のように『 -> 』が無ければ、ただのディレクトリ
ls -l /Applications/Android\ Studio.app/Contents/
# シンボリックリンクであるか確認
# 『 -> 』が有ればシンボリックリンク、無ければ通常のディレクトリ。
ls -ld /Applications/Android\ Studio.app/Contents/jbr
# 移動する
cd /Applications/Android\ Studio.app/Contents
# シンボリックリンクを作成
# 元に戻す(削除したい場合)sudo rm jre
sudo ln -nfs jbr jre
開発チャンネル
●flutter channel コマンド
# 現在のFlutterのチャンネルを確認
flutter channel
# チャネルを切り替える場合(例:stable)
flutter channel stable
GitHubにてダウングレード等した場合は[user-branch]となる。
本来は「stable」が望ましい。
依存関係修復の徹底攻略
「flutter clean + flutter pub get」はFlutter不調時における定番コマンドだが、解決しない場合は flutter pub cache repair (パッケージキャッシュの修復)も試すと良い。
# flutterの調子が悪い時の定番
flutter pub clean
flutter pub get
# 上記でも上手くいかない場合「パッケージキャッシュの修復」を挟む
flutter pub clean
# パッケージキャッシュの修復
flutter pub cache repair
flutter pub get
●「flutter pub clean」と「flutter clean」の違い
以下の合わせ技で、かなりクリーンな状態になる🧹
# プロジェクト全体のキャッシュクリア → パッケージキャッシュの修復 → 依存関係の再取得
flutter clean
flutter pub clean
flutter pub cache repair
flutter pub get
●完全にキャッシュを削除して再取得
# それでも問題が解決しない場合は、以下も併せて試す「完全リセット」
flutter clean
rm -rf pubspec.lock .packages .dart_tool
flutter pub get
「 flutter pub clean 」で解決しなかった場合『 rm -rf pubspec.lock .packages .dart_tool 』を試すと良いであろう。
覚書(随時更新予定)
『Flutter 3.27.3』にバージョンアップした場合に試して、ビルドが通ったもの(2025-01-22 追記)
・android/app/build.gradle
compileSdkが35でエラーの場合に34に修正して試す
・android/settings.gradle
Kotlinバージョン指定 1.7.10 → 1.9.22
著書
【辛島信芳の著書】
IT技術などに興味のある方は、是非ご覧になってください。