📑

Android開発 MVVM+MultiModule Gradleセットアップ

2023/12/13に公開

Gradleファイルとは

ビルド自動化ツールで、Javaバイトコードに変換し、メモリ上に配置してJVM上で実行するための記述ファイル

Groovy KotlinDSL(KTS) で記述される
KotlinDSL(KTS)が推奨されているが、すべてのプラグインやライブラリがKotlin DSLに完全に対応しているわけではないため、移行には注意が必要
https://developer.android.com/studio/build/migrate-to-kts?hl=ja

ビルドの仕組み

リソースとソースコードをコンパイルしてAPKと呼ばれるパッケージを作成

※以下の図は公式ドキュメントからの引用

2種類のプロジェクト設定

Android開発におけるビルド設定は大きく分けて2種類存在します

  • プロジェクトレベル
    プロジェクト配下の全てのモジュールに適用される、アプリのビルドに必要なリポジトリや依存関係を定義
  • モジュールレベル
    モジュールレベルでは、build.gradleの所属するモジュールに適用される依存関係や、カスタムビルドの設定
    (さらにこちらを複数モジュールにプロジェクトを分割するマルチモジュール化ができる)

※プロジェクトとモジュールの関係と、それぞれのbuild.gradleファイルの位置を示す図

MyProject (プロジェクトのルートフォルダ)
├── build.gradle (プロジェクトレベルのビルド設定)
├── settings.gradle (モジュール設定)
├── app (モジュール1のフォルダ)
│   ├── build.gradle (モジュール1のビルド設定)
│   └── ... (その他のファイルやフォルダ)
├── library (モジュール2のフォルダ)
│   ├── build.gradle (モジュール2のビルド設定)
│   └── ... (その他のファイルやフォルダ)
└── ... (その他のファイルやフォルダ)

プロジェクトレベルの設定

アプリのバージョン設定

class Version {
    static final code = 1
    static final name = "1"
}

ビルドに必要なライブラリや、kotlin、Firebaseなどの依存関係をPlugin

plugins {
    id 'com.android.application' version '8.0.1' apply false
    id 'com.android.library' version '8.0.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

プロダクト フレーバーの設定

 if (subProject.hasProperty('android')) {
            try {
                android {
                    flavorDimensions "environment"
                    productFlavors {
                        create("dev") {}
                        create("stg") {}
                        create("prod") {}
                    }
                }

サブプロジェクト毎に統一して行いたい依存関係の設定

switch (projectName) {
                    case ":app":		   		

コンパイルバージョン ターゲットバージョンの設定

android {
                def version = new Version()
                compileSdkVersion 34
                defaultConfig {
                    versionCode = version.code
                    versionName = version.name
                    targetSdkVersion 34

compileSdkVersionは、アプリをコンパイルする際に使用されるAndroid SDKのバージョンのAPIに対してアプリケーションがコンパイルされるがこの設定は実行時の挙動には直接影響しません。
targetSdkVersionは、アプリが最適化されるべきAndroidのターゲットバージョンで、どのAndroidバージョンに対して最適化されているかをシステムに伝えシステムは互換性モードなどの特定の動作をアプリに適用するかどうかを決定する。

アプリモジュールの設定

ビルドタイプの設定や署名設定などを主に行う

署名設定とは

GooglePlayStoreにてアプリを公開する際、以下の2つの鍵を使って行う必要があります。
アプリ署名鍵 → Googleがユーザーに配布するときの行う署名鍵 APKに対して署名
アップロード鍵 → 開発者がGoogleにデプロイするときにGoogleが確認する鍵
Gradleのsigningメソッドに鍵情報を記載

fun signing(
 val fileName = ~~~.plus("/app/keystore.jks")
storeFile = File(fileName)
 storePassword =
  keyPassword = 
  keyAlias =

鍵を格納するファイルパスを記載
格納ファイルの記載
アップロード鍵のパスワード環境変数記載
アプリ署名鍵のパスワード環境変数記載
アプリ署名鍵の環境変数を記載
※環境変数はlocal.propertiesか、CIツール上に保管しビルドスクリプト内に直接機密情報を記述することなく、必要な情報を安全に参照できるようにしましょう。

サブモジュールの設定

サブモジュールのレイヤー毎に依存関係を定義
アーキテクチャの方針に従って、依存関係が逆流することがないように注意しながら、依存関係を定義する必要があります。

MVVM+MulitiModule✖️クリーンアーキテクチャ(個人的推奨設定)

Android開発において、MVVM+MulitiModule✖️クリーンアーキテクチャが公式で推奨されています。
理由として、システムのビジネスルールとユースケースと外部の変更から保護され、テストがしやすく保守性が上がる点が挙げられています。

エンティティ (Entities): システムのビジネスルールをカプセル化します。
ユースケース (Use Cases): アプリケーション固有のビジネスルールを含みます。
インターフェースアダプター (Interface Adapters): ユーザーインターフェース、外部API、データベースなどの外部との通信を担います。
フレームワークとドライバー (Frameworks and Drivers): 具体的な技術的詳細、フレームワーク、ツールなどが含まれます

https://docs.gradle.org/current/userguide/userguide.html
https://future-architect.github.io/articles/20210120/

Discussion