ノウハウ アプリ開発 読了目安 約5分

Intel MacでFlutter開発を続けるときの注意点|JDKの混在・CocoaPods・今後への備え

このサイトのアプリは、年季の入ったIntel MacのMacBook Airで作っています。まだ十分に開発はできますが、Androidのビルドが急に通らなくなったり、flutter doctorに気になる警告が出たりと、古い環境ならではのつまずきもあります。実際に遭遇した問題と、その切り分け方を整理します。

まず現状を把握する:flutter doctor -v

トラブルが起きたとき、最初に実行したいのが flutter doctor -v です。-v を付けると、Flutter本体のバージョンだけでなく、Android Studio、使っているJDK、Xcode、CocoaPodsのバージョンや場所まで詳しく表示されます。

最近のFlutterでは、Intel Macで実行すると「将来のリリースでIntelベースのMacのサポートを終了する予定」という趣旨の警告が表示されるようになりました。すぐに使えなくなるわけではありませんが、今後の大きなアップデートの前には、リリースノートでIntel Macの対応状況を確認する習慣をつけておくと安心です。

いちばん多いのは「JDKが混在している」問題

長く使っているMacには、いつの間にか複数のJDK(Java開発キット)が入っていることがよくあります。Android Studioに付属しているもの、別のツールのために入れたもの、Homebrewで入れたものなどです。

問題は、場面によって使われるJDKが違うことです。

場面使われるJDKの決まり方
flutter run / flutter buildFlutterの設定、なければAndroid Studio付属のJDK
ターミナルでの java コマンドPATHの順番で最初に見つかったもの
JAVA_HOME を参照するツール環境変数、または /usr/libexec/java_home の結果
グローバルにインストールした gradle起動時の JAVA_HOME など

そのため、「Android Studioからは実行できるのに、ターミナルからは失敗する」「昨日まで動いていたのに、別のツールを入れたら急にビルドできなくなった」といった現象が起きます。

今どのJDKが使われているかを確認する

# インストールされているJDKの一覧
/usr/libexec/java_home -V

# ターミナルの java の実体とバージョン
which java
java -version

# Flutter が使うJDK(Java binary at: の行を確認)
flutter doctor -v

これらの結果が食い違っていないかを見るだけで、原因の見当がつくことが多くあります。

FlutterのJDKを固定する

Flutterには、使うJDKを明示的に指定する設定があります。

flutter config --jdk-dir "/Applications/Android Studio.app/Contents/jbr/Contents/Home"

Android Studio付属のJDKは、そのバージョンのAndroid Gradle Pluginと組み合わせて使うことが想定されているため、迷ったらこれに合わせるのが無難です。設定後に flutter doctor -v で反映されたことを確認します。

Gradleのエラーを切り分ける手順

Androidのビルドで失敗したときは、次の順番で確認すると、闇雲に設定を触らずに済みます。

  1. エラーメッセージに Unsupported class file major version や requires Java といった言葉があれば、JDKのバージョンの問題を疑います。
  2. android/gradle/wrapper/gradle-wrapper.properties のGradleのバージョンと、android/settings.gradle.kts のAndroid Gradle Plugin(AGP)・Kotlinのバージョンの組み合わせが対応しているかを確認します。
  3. flutter clean を実行してから、もう一度ビルドします。
  4. それでも直らなければ、android フォルダで ./gradlew assembleDebug --stacktrace を実行し、詳しいエラーを読みます。

ここで注意したいのは、グローバルにインストールした gradle コマンドではなく、プロジェクトの ./gradlew(Gradle Wrapper)を使うことです。Wrapperはプロジェクトで指定されたバージョンのGradleを使うため、環境による違いを減らせます。

iOS側:CocoaPodsとRubyの確認

FlutterのiOSビルドでは、プラグインの依存関係の管理にCocoaPodsを使う構成が長く標準でした。Swift Package Managerへの移行も進んでいますが、設定でCocoaPodsを使い続けている場合は、CocoaPodsとそれを動かすRubyの状態がビルドに影響します。

  • Rubyのバージョン管理:macOSに最初から入っているRubyではなく、rbenvなどで入れたRubyを使っていると、CocoaPodsの更新がスムーズです。which pod で、意図した場所のpodが使われているか確認します。
  • pod installが失敗するとき:ios フォルダで pod repo update を実行してから pod install をやり直します。それでもだめなら、ios/Pods と ios/Podfile.lock を削除して入れ直します。
  • Intel MacとApple Siliconの違い:Apple Silicon向けの解説では arch -x86_64 を付ける手順が出てくることがありますが、Intel Macでは不要です。

古いMacで快適に開発するための工夫

メモリが8GB程度の古いMacでは、AndroidエミュレータとXcodeとブラウザを同時に開くと、すぐに動作が重くなります。

  • 動作確認はできるだけ実機で行い、エミュレータは必要なときだけ起動する。
  • Android Studioは使わないときは閉じ、コードの編集は軽いエディタで行う。
  • Gradleのデーモンが残ってメモリを使っている場合は、./gradlew --stop で止める。
  • iPhoneのワイヤレスデバッグを使うと、ケーブルの抜き差しの手間が減る。

将来に向けて準備しておくこと

いつかは新しいMacへの移行が必要になります。そのときに慌てないよう、今のうちから次のことをしておくと移行が楽になります。

  1. 使っているFlutter・Xcode・JDK・CocoaPodsのバージョンを、テキストファイルに記録しておく。
  2. 署名に使う証明書や、Androidのアップロード鍵(keystore)とパスワードを安全な場所にバックアップする。
  3. プロジェクトはGitで管理し、ビルドに必要な設定ファイルがすべて含まれているか確認しておく。

特にAndroidのアップロード鍵を失うと、手続きなしではアプリの更新版を公開できなくなります。環境の移行より前に、真っ先にバックアップを確認しておきたい項目です。