見出し画像

【Flutter】Androidビルドエラー攻略テクニック徹底解説📱


要旨

主旨

Flutterを使用したAndroidアプリ開発において、最も厄介な『ビルドエラー』。
プログラムのコードエラーと違い、嵌るとなかなか抜け出せない蟻地獄のようなものである🐜

これらのエラーは、Gradleの設定ミス、Java環境の不整合、依存関係の問題など、さまざまな要因によって引き起こされる。

ツイッター

端的には先日のツイッターに投稿した通り

ビルドエラーとの長き格闘の末 ……

流れ

大まかな流れは以下の通り

  1. Flutter SDKを最新にアップグレード
    flutter upgrade にて、バージョン3.22.2 → 3.27.2 にする。
    今思えば、これが悪夢の始まりだった ……

  2. Androidビルドエラー
    Plugin [id: 'com.android.application'] was not found in any of the following sources:が発生する

  3. ダウングレード
    色々試したが解決しないので 3.27.2 → 3.22.2 にダウングレードして、やり直す事に

  4. 「Flutter: Running Gradle task 'assembleDebug' … 」から一向に進まない
    Gradleタスクの進行状況を見ると「JAVAがないのでインストールしてね」と有り得ないことをほざかれる。

  5. 調査結果
    Flutter側で『jbr』(JetBrains Runtime)ではなく、標準の「jre」のディレクトリ名を前提に見に行っている事が判明。

  6. 解決策
    暫定的にシンボリックリンクを作成。

  7. 攻略テクニック
    ビルドエラーとの格闘をもとに得た「攻略テクニック」を纏めてみた

本記事では、先日起きたビルドエラーとの格闘をもとに得た「攻略テクニック」の忘備録を記する📝

💡『7.攻略テクニック』については、あらゆる種類のビルドエラーの解決につながる知見なので、Flutter使いの人は是非とも参考にして欲しく思う。

1.Flutter SDKを最新にアップグレード

何かさ、ChatGPT先生が言ってきたんだよね”Flutterを最新バージョンにした方が良いよ🤖”って。

# Flutter SDKを最新にアップグレード
flutter upgrade

それもそうかと思い、最新にアップグレード。

バージョン3.27.2 にする

flutter upgrade にて、バージョン3.22.2 → 3.27.2 にする。
今思えば、これが悪夢の始まりだった ……

2.Androidビルドエラー

Plugin [id: 'com.android.application'] was not found

アップグレード後、早速来ましたビルドエラー。
”Plugin [id: 'com.android.application'] was not found in any of the following sources:”だそうだ。
一見、簡単に解決しそうに思えたが、いやいや何のその全然解決しません

Gradleの詳細ログを取得

”The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for information on installing Java.”

JAVAがないのでインストールしてね」とか言われる。
いや、いや、いや、いや 有り得んて🤣

💡 ちなみに、Android Studioの方は普通にビルドが通ってます

で、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.調査結果

結論

結論から言うと

1.Android StudioのJAVAは『jbr』(JetBrains Runtime、「Android Studio」で使用)のパスを見に行っている。
2.Flutterでは『jbr』ではなく、標準の「jre」(Java Runtime Environment)のディレクトリ名を前提に見に行っている。

これにより、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

gradlew.batの方も、もう少し調べたかったのだがキリがなさそうなので止めておいた。

先人の方がすでに原因及び解決法を残されていた。
嗚呼、もっと早くググっておけば良かった。

ここからは、私の憶測だが

1.Android Studioが見にいくJAVAのディレクトリ。
Flutter側でもこのパスを見にいく筈だが ……
/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
2.何かの拍子で、Flutter側が「jre」のディレクトリ名を前提としてしまう
/Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java

本来は何かしらの方法で『jbr』のディレクトリ名を前提に見に行く仕組みが施されているが、何かの拍子で「jre」を見に行くようになった。
(例:Flutter SDKのアップグレード/ダウングレードなどの時など)

調査に時間が掛かった理由

時間が掛かった理由
「flutter doctor --verbose」Android toolchain項目の出力を過信してしまった為。

巧妙なハルシネーション

●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」と出る。

「フルディスクアクセス」の権限を付ける

この場合は「フルディスクアクセス」の権限を付ける必要がある。

VSCodeのターミナルを使っている場合

改めて「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」との違い

比較表

【1】./gradlew assembleDebug(オプション無し)
アプリのビルドを行う。
【2】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 オプションを付けると、より詳細な情報が出力される

暫定的にシンボリックリンクを作成する

先ほどの復習となるが

1.Android StudioのJAVAは『jbr』(JetBrains Runtime、「Android Studio」で使用)のパスを見に行っている。
2.Flutterでは『jbr』ではなく、標準の「jre」(Java Runtime Environment)のディレクトリ名を前提に見に行っている。

この場合、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

💡「ln: jre: Operation not permitted」と出た場合は「フルディスクアクセス」の権限を付けます。

VSCodeのターミナルを使っている場合

開発チャンネル

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技術などに興味のある方は、是非ご覧になってください。

いいなと思ったら応援しよう!