【Android Studio】Fastlaneの導入方法!デバッグ/リリース用APK/AABファイルの生成
この記事からわかること
- Android Studio/KotlinでFastlaneを導入する方法
- デバッグ/リリース用APK/AABファイルの生成
- gradle(task:)でできること
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Koala
- Kotlin:1.9.0
- Gradle:8.7
- java:17.0
- macOS:Sonoma 14.6.1
Fastlaneとは?
「Fastlane」とはiOSまたはAndroidアプリの配布やテスト周りの作業を自動化するためのCI/CDツールです。できることは大きく分けて以下の4つになります。
- App StoreConnect/GooglePlayでのリリース作業
- テストの実行
- メタ情報の自動生成
仕組みとしてはFastfile
というRubyで記述した設定ファイルを用意し、ターミナルなどからコマンドを実行するだけで特定の作業を自動で行ってくれるものになります。
CI/CDとは?
CI/CDとは「Continuous Integration(継続的インテグレーション)/ Continuous Delivery(継続的デリバリー)」の略称で、ざっくり言うとソースコードの統合(Integration)と配布(Delivery)を自動化する手法のことを指します。
MacにFastlaneの環境を構築する
MacでFastlane
の環境を構築するためにHomebrew
、rbenv
、bundler
の3つを使用します。詳細なセットアップ手順は下記の記事を参考にしてください。
- Homebrew・・・MacOS(及びLinux)のパッケージ管理ツール
- rbenv・・・Rubyのバージョン管理ツール
- bundler・・・RubyのGemパッケージマネージャー
おすすめ記事:MacにFastlaneを導入する方法
最終的にbundler -v
で正常にバージョンが返ってくるようであれば前準備はOKです。
$ bundler -v
Bundler version 2.5.13
AndroidプロジェクにFastlaneを組み込む
AndroidプロジェクトにFastlane
を組み込んでいきます。ターミナルを起動しカレントディレクトリをAndroidプロジェクトに合わせてbundle init
コマンドを実行します。
$ bundle init
実行するとプロジェクトルートに「Gemfile」が生成されます。GemFile
はGemとツールのバージョンを指定するためのテキストファイルです。
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
この中にgem "fastlane"
を追加してbundle install
コマンドを実行します。するとfastlane
を動作させるために必要なライブラリなどがインストールされていきます。いろいろインストールされますがこれはfastlane
が依存関係を多く持っているためです。
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
gem "fastlane"
bundle install
コマンドが完了すると「Gemfile.lock」がプロジェクトルートに生成されます。このファイルにはインストールされたGemのバージョンと依存関係が記録されています。同じGemfile.lockを使用する他の開発者や環境でも、バージョンの齟齬がないように環境構築することができるようになります。
$ bundle install
Fastlaneのセットアップ
bundle exec fastlane init
コマンドを実行してFastlaneを使用するための設定ファイルを生成していきます。最初に色々聞かれるので回答しています。
$ bundle exec fastlane init
1.パッケージ名
最初に対象プロジェクトのパッケージ名を聞かれます。com.XXX.XXX
形式で指定しているパッケージ名を入力してEnter
を押します。
Package Name (com.krausefx.app):
2.Google Play認証ファイルパス
Google Playと連携するための認証ファイルのパスを問われます。認証ファイルを設定するとFastlaneからGoogle PlayにAPK/AABファイルのアップロードを行うことができるようになります。認証ファイルが用意できていない場合はEnter
を押すことでスキップできます。
Follow the Setup Guide on how to get the Json file: https://docs.fastlane.tools/actions/supply/
Path to the json secret file:
3.メタデータ管理
既存のメタデータをダウンロードし、メタデータ管理を設定しますか?と聞かれるので必要ならy
で進めてください。これは認証パスを設定していないとうまく行かないようです。
Download existing metadata and setup metadata management? (y/n)
スキップした場合は以下のコマンドを実行することでストアのメタ情報を取得することが可能です。
$ fastlane supply init
最後に以下のように表示されればセットアップの完了です。完了するとプロジェクトルートに「fastlane」ディレクトリが生成されその中に「Appfile」と「Fastfile」ファイルが生成されます。Fastfileの方に実行したいアクションやワークフローを定義していきます。
Successfully generated fastlane configuration
ここまでで回答したパッケージ名と認証ファイルのパスは「AppFile」の中に記述されます。もしスキップした場合や異なる値を渡した場合はここから修正してください。
json_key_file("./fastlane/secrets/service_account_key.json")
package_name("com.XXXXX.XXXXXXX")
APKファイルを生成する
まずはFastlaneを使用して「クリーンビルドしてリリース用のAPKを生成する処理」を自動化してみます。ターミナルからGradleで実行出来る操作は、gradle(task:)
を使用することで同じ動作を実現できます。今回はクリーンビルドからのAPKファイルの生成なのでclean assembleRelease
を使用すればOKです。
default_platform(:android)
platform :android do
# クリーンビルドしてリリースAPKを作成する
desc "Clean Build And Create Release APK"
lane :clean_build_release_apk do
gradle(task: "clean assembleRelease")
end
end
ターミナルの場合のコマンド
./gradlew clean assembleRelease
レーンの実装が完了したら以下のコマンドを実行して正常に生成されるか試してみてください。fastlane.tools finished successfully 🎉
と出れば成功です。
$ bundle exec fastlane clean_build_release_apk
// 〜〜〜〜〜〜〜〜〜〜〜〜
+--------------------------------------------+
| fastlane summary |
+------+-----------------------+-------------+
| Step | Action | Time (in s) |
+------+-----------------------+-------------+
| 1 | default_platform | 0 |
| 2 | clean assembleRelease | 17 |
+------+-----------------------+-------------+
[20:07:23]: fastlane.tools finished successfully 🎉
// 〜〜〜〜〜〜〜〜〜〜〜〜
もしエラーになる場合は./gradlew clean assembleRelease
で正常に動作するか試してみてください。私はFAILURE: Build failed with an exception.
が発生していたので失敗していましたが、以下の記事の手順で解消して無事正常に動作するようになりました。
署名済みのAABファイルを生成する
Google Play Consoleへアップロードするための「署名ずみのAABファイル」を生成することも可能です。AABファイルの場合はbundleRelease
を使用し、署名済みにするためにproperties
パラメータを使用してKeyStoreの情報を渡します。(そのためKeyStore情報は作成しておいてください)
gradle(
task: "bundle",
build_type: "release",
properties: {
# KeyStore生成時に.jks拡張子なしにしていた場合はなしでOK 絶対パスで記載
"android.injected.signing.store.file" => "path/to/keystore.jks",
"android.injected.signing.store.password" => "生成時に登録したパスワード",
"android.injected.signing.key.alias" => "生成時に登録したエイリアス名",
"android.injected.signing.key.password" => "生成時に登録したパスワード"
}
)
keystore
(.jks)ファイルへのパスは絶対パスで記述すると確実です。
gradleブロックで出来ること
gradle
ブロックにはさまざまなパラメータを渡すことができますがtask:
には基本となるタスクを渡します。先ほどのようにクリーンとビルドなど同時に複数渡すことも可能です。
デバッグ用APKをビルド
gradle(task: "assembleDebug")
# この指定も同じ
gradle(
task: "assemble",
build_type: "debug"
)
リリース用APKをビルド
gradle(task: "assembleRelease")
リリース用AABをビルド(未署名)
gradle(task: "clean bundleRelease")
リリース用AABをビルド(署名)
gradle(
task: "bundle",
build_type: "release",
properties: {
"android.injected.signing.store.file" => "path/to/keystore.jks",
"android.injected.signing.store.password" => "your-store-password",
"android.injected.signing.key.alias" => "your-key-alias",
"android.injected.signing.key.password" => "your-key-password"
}
)
クリーンビルド
gradle(task: "clean")
単体テストの実行
gradle(task: "test")
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。