「Gradle project sync failed」が原因で「Generate Signed Bundle」が表示されない時の対処法

Flutter

Android Studioでaabファイル作ろうとしたけど、Buildメニューに「Generate Signed Bundle」の項目がない。。

「Gradle project sync failed」というエラーも出ている。どうしたらいいの?

 

という方向けの記事です。

 

自分がこの状況に陥り、解決にとても苦労したので、自分の体験をもとに、対処法を共有したいと思います。

 

結論は、以下になります。

 

  1. 「Android Gradle Plugin Version」「Gradle Version」の対応関係が不整合の場合は、整合するようにアップデートする。
  2. 「Show Log in Finder」のログを見て、ERRORの項目をチェックし、必要な対処をする。
    • 「ERROR…Module: ‘xxxx’ platform ‘android-番号’ not found.」となっている場合は、該当の番号のAndroid SDKをインストールする。

  

自分の場合は、上記2.が解決方法でした。

 

2.は、あくまで「ログを見るのが重要」という趣旨でして、実際にはERRORの内容次第のため、必ずしもAndroid SDKのインストールで解決するとは限らない点をご了承くださいm(_ _)m。

 


40代からプログラミング(Flutter)を始めて、GooglePlayAppStoreにアプリを公開しているhalzo appdevです。

先日、2つ目のアプリを公開しました。全てFlutterで開発したアプリです。

 

作成したアプリはこちら↓

かんたんプリント管理:アラート・OCR文字認識・検索機能を搭載

Google Play で手に入れよう
Download on the App Store

 

シンプルメモ帳「BasicMemo」 – 文字カウント、ワンタッチ入力、タグ管理等の機能を搭載

Google Play で手に入れよう
Download on the App Store

 

スポンサーリンク

前提とする環境

以降の説明は、以下の環境で試した結果になります。

  • PC: MacBook Pro
  • OS: Big Sur
  • Flutter: Channel stable, 2.2.3
  • Android Studio: version 4.2

 

スポンサーリンク

自分が直面した状況 ※「Generate Signed Bundle / APK…」が表示されない

Google Play Consoleにアップロードするaab(Android App Bundle)ファイルを作成するため、

 

  • Flutterプロジェクトの中の「Android」フォルダを右クリック
  • 「Open Android module in Android Studio」で、Androidアプリ専用のプロジェクトを起動
  • 「Build」メニューから「Generate Signed Bundle / APK…」を選択

 

の手順を踏もうとしたところ、「Build」メニューに「Generate Signed Bundle / APK…」の項目が見つかりませんでした。

 

 

「Build」ウィンドウには、非推奨のGradle使用の警告が出ているものの、「BUILD SUCCESSFUL」となっていて、Androidアプリとしてのビルドはできているようでした。

 

 

但し、よく見るとウィンドウ上部に、

 

Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly.
Try Again    Open ‘Build’ View    Show Log in Finder

 

というメッセージが出ていました。

 

 

メッセージのとおり、「Try Again」を押しても、同じ状態になるだけで効果はありません。

 

「Open ‘Build’ View」を押すと、上図の「Build」ウィンドウが開くだけです。

 

「Show Log in Finder」を押すと、過去からのログが記録されている長大なファイルが開き、どこを見てよいのか分からず。。

 

他に気になる箇所を探すと、プロジェクトウィンドウに、通常であれば生成されるはずの「app」フォルダがありませんでした。

 

 

また、右下の「Event Log」を開いてみると、

 

Gradle sync failed: Sync failed: reason unknown

 

と赤字で表示されており、やはりエラーで正しくビルドされていない事がわかりました。

 

 

「reason unknown」とあるので、厄介そうな予感です。。

 

スポンサーリンク

ネット上で調べて見つかった情報

「Generate Signed Bundle / APK…」が表示されないときの対策情報

どのキーワードで調べるか悩みましたが、まずは「Generate Signed Bundle / APK…」が表示されない事への対処法を調べてみました。

 

大方の情報は、Flutterのプロジェクトからは直接「Generate Signed Bundle / APK…」を開けず、「Open Android module in Android Studio」からAndroidアプリ専用の画面を開く必要がある、という趣旨のものでした。

 

この点は理解して対応していたため、解決には至りませんでした。

 

ただ、こちらの情報は少し違う観点でした。

 

 

自分のプロジェクト環境も、PCの移行に伴ってgit cloneして作ったものだったので、「もしかしてcloneしたときに何か処理が漏れていたからか?」と思い、参考にしたのですが、情報の時点がかなり以前なのもあってか、自分の状況とは異なるようでした。

 

なお、Flutterプロジェクトを旧環境(旧PCなど)から新環境(新PCなど)に移行する際、git cloneして、新環境でAndroidアプリのリリースビルドを作るとき、最低限必要となる対応は、以下2点と認識しており、いずれも対応済でした(そもそも後者は今回の時点では関係しないかと思います)。

 

  • 「File」→「Project Structure」→「Project Settings」→「Modules」で、+ボタンからAndroidのモジュールを追加する。
    ※git clone後に、「View」→「Tool Windows」で、「Device File Explorer」や「Logcat」などがリストに表示されない場合は、これが必要これをしないと、「Device File Explorer」だけでなく、「Generate Signed Bundle / APK…」も表示されない。
  • 旧環境で、Google Playリリース時に使用していたkeystore(.jksファイル)を、git cloneした新環境においても使用できるよう、コピーしてくる。

 

前者については、こちらの記事で詳細を整理したので、よろしければご参考にしてください。

 

 

なお、Flutterプロジェクトをgit cloneしたときに必要な対応については、こちらの記事が大変わかりやすくまとまっており、参考になりました。ありがとうございます!

 

 

「Gradle project sync failed」が発生したときの対策情報

「Gradle project sync failed」の対処法としては、「Android Gradle Plugin Version」と「Gradle Version」の対応関係が不整合なので、Gradleを最新にして解消する、という情報が主流でした。

 

 

こちらに、Google公式のバージョン対応表があります。

 

 

ここでバージョン対応に不整合がある場合は、下図のようにAndroid Studioの右下に出ているアップデートを実行すれば、解消すると思われます。

 

 
もしくは、次の図にあるとおり、Androidアプリ専用の画面の「File」→「Project Structure」→「Project」から、それぞれ整合するバージョンを指定することもできます。

 

詳細なアップデートの方法は、上記Google公式のバージョン対応表のページにも説明があります。

 

しかし、自分の環境を「Project Structure」から確認したところ、下図のとおり不整合は生じていませんでした。

 

 

別のFlutterプロジェクトも、上記と同じバージョン関係で問題なくGradle syncが成功していたので、Gradleのバージョンが問題ではなさそうです。。

 

「Show Log in Finder」のログを確認

その他に、Android StudioやMacの再起動を試しましたが効果はなく、Gradle syncが成功したプロジェクトと失敗したプロジェクトで、「Project Structure」の設定内容も比較しましたが、特に違いは見つけられませんでした。

 

ただ、ログをきちんと見ていなかったことを思い出したので、改めて確認しました。

 

ログファイル(自分の場合は「idea.log」というファイル)は、前述のAndroid Studio内のエラーメッセージのリンク(「Show Log in Finder」)から飛べますが、Finderから探す場合は、以下のようなパスに保存されています。

 

ユーザー名>ライブラリ>Logs>Google>AndroidStudio4.2>idea.log

※「ライブラリ」フォルダは、Finder上でcommand+shift+ピリオド(.)を押すと表示されます。

 

ログファイルには、過去分から膨大な量が記録されているので、どこに今回のエラーログがあるか分かりづらいです。。

 

そのため、ログファイルを開いた状態で、「sync failed」のエラーメッセージにある「Try Again」を押すことで、実行した時点からのログを追加表示させ、該当部分を探しやすくしました。

 

結果、ログの中に以下のようなエラー文があることがわかりました。

 

ERROR – intellij.openapi.progress.Task – Module: ‘flutter_plugin_android_lifecycle’ platform ‘android-31’ not found.
com.android.tools.idea.gradle.project.sync.idea.issues.SdkPlatformNotFoundException: Module: ‘flutter_plugin_android_lifecycle’ platform ‘android-31’ not found.

 

どうやらAPIレベル31のAndroid SDKが入っていないことが問題らしいと分かりました。

 

Android SDKを追加

念のため上記エラー文でググってみると、全く同じ状況を説明している下記記事が見つかりました。ベストアンサーではありませんが、1つ目の回答が対処法になると思われます。

 

 

そこで、「Preferences」→「Appearance & Behavior」→「System Settings」→「Android SDK」と進み、「Android API 31」をインストールしました。

 

 

その上で、

 

  • 「File」→「Invalidate Caches / Restart…」で、キャッシュを削除・Android Studioを再起動
  • 「Open Android module in Android Studio」で、Androidアプリ専用のプロジェクトを起動

 

すると、無事Syncが成功し、「Build」メニューに「Generate Signed Bundle / APK…」が表示されました。

 

 

バージョンは違いますが、こちらの記事にほぼ同じ内容が掲載されていて、大変参考になりました。ありがとうございます!

 

 

ただ、APIレベルについて、まだ理解が浅いこともあり、

 

「app/build.gradle」ファイルでは「targetSdkVersion」と「compileSdkVersion」を30にしているのに、なぜAPIベル31のSDKが必要なの?

 

と疑問に思ってしまいました。。

 

恐らく使用しているパッケージの中に、APIレベル31を要求するものがあったのかな?と思い、エラーログにあった「flutter_plugin_android_lifecycle」をコード内検索(command+shift+F)したところ、「flutter_plugin_android_lifecycle」パッケージのバージョン2.0.5が使用されていると分かりました。

 

本パッケージの下記Changelogによると、2.0.5は、compileSdkVersion 31に対応させたバージョンらしいので、これが原因の一端だったようです。

 

 

なお、本パッケージは、自分が導入していた「file_picker」パッケージの中で使用されていました。

 

これ以上は、まだ理解を深められていませんが、、、また勉強していきます。

 

以上、ご参考になれば幸いです。

 

最後までお読みいただき、ありがとうございました。

 

\ Flutterの学習で役立ったコンテンツ・書籍 /

The Complete 2021 Flutter Development Bootcamp with Dart

 

 


Dart入門 – Dartの要点をつかむためのクイックツアー

コメント

タイトルとURLをコピーしました