Androidアプリケーションの開発環境Android Studioを使用してアプリケーションを開発します。
Android StudioでAndroidアプリケーション開発のためのプロジェクトを新規に作成します。
新規プロジェクトの作成Android Studioを起動して、ナビゲーションの『プロジェクト』タブで『New Project』をクリックします。
テンプレートの選択『Phone and Tablet』の『No Activity』を選択して空のプロジェクトを作成します。
『次へ(N)』で次に進みます。
プロジェクト情報の入力各プロジェクト情報を入力します。
『Package name』は英数小文字のsnake_caseで、ドメインを逆にしたものを指定します。
『完了(F)』でプロジェクトが作成されます。
ビルドツールGradleを最新化します。
プロジェクト構造メニューアイコンから『ファイル』➡『プロジェクト構造…』へと進みます。
Projectサイドメニューの『Project』で『Gradle Version』の最新バージョンを選択します。
『OK』で終了します。
マルチモジュールプロジェクトで構成するため、各モジュール内で定義するバージョン情報をバージョンカタログで一元管理します。
プロジェクトエクスプローラの切替プロジェクトの表示を『プロジェクトファイル』に切り替えます。
カタログファイルの作成プロジェクトのトップディレクトリで右クリック➡『新規(N)』➡『Version Catalog』と進みます。
カタログファイルを編集します。
マルチモジュールの各モジュールの設定を共通化するため、まず最初にAndroid Gradleのビルドツールプラグインの定義を行います。
[versions] android-application = "8.2.1" kotlin-android = "1.9.22" [libraries] [plugins] android-application = { id = "com.android.application", version.ref = "android-application" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-android" }
定義ファイルを編集したため、Android Studioの右上に『Sync Now』が表示されるのでクリックして定義内容をプロジェクト全体に同期させます。
最上位のbuild.gradle.ktsをバージョンカタログを参照するように編集します。
plugins { id("com.android.application") version "8.2.1" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false }
編集後、『Sync Now』で内容をプロジェクトに反映させます。
KotlinのアノテーションプロセッサーKSP(Kotlin Symbol Processing)を導入します。
バージョンカタログファイルにKSPの定義を追記します。
[versions] : devtools-ksp = "1.9.22-1.0.16" : [plugins] : devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "devtools-ksp" }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにKSPの使用宣言を追記します。
plugins { : alias(libs.plugins.devtools.ksp) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
モジュール間の依存関係を疎にするため、DI(Dependency Injection)フレームワークのHiltを導入します。
バージョンカタログファイルにHiltの定義を追記します。
[versions] : dagger-hilt = "2.50" [libraries] hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "dagger-hilt" } hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "dagger-hilt" } [plugins] : hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "dagger-hilt" }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにHiltの使用宣言を追記します。
plugins { : alias(libs.plugins.hilt.android) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
マルチモジュールの各モジュールの設定を共通化するため、Composite Buildを導入します。
ディレクトリの作成プロジェクトのトップディレクトリで右クリック➡『新規(N)』➡『ディレクトリ』でbuild-logicディレクトリを作成します。
※別のディレクトリ名でも構いません。
※その場合は以降読み替えてください。
作成したbuild-logic直下にkotlinスクリプト settings.gradle.kts を新規に作成します。
pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositories { google() mavenCentral() } versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } } }
作成後、『Sync Now』で内容をプロジェクトに反映させます。
バージョンカタログファイルにComposite Buildで使用するライブラリの定義を追加します。
: [libraries] : tools-build-gradle = { module = "com.android.tools.build:gradle", version.ref = "android-application" } kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin-android" } :
追加後、『Sync Now』で内容をプロジェクトに反映させます。
build-logic直下にkotlinスクリプト build.gradle.kts を新規に作成します。
plugins { `kotlin-dsl` } dependencies { implementation(libs.tools.build.gradle) implementation(libs.kotlin.gradle) }
作成後、『Sync Now』で内容をプロジェクトに反映させます。
プロジェクト直下のsettings.gradle.ktsを編集して、Composite Buildをプロジェクトに適用します。
: includeBuild("build-logic")
編集後、『Sync Now』で内容をプロジェクトに反映させます。
Composite BuildのBuild Logicを作成します。
build-logic内にsrc/main/kotlinディレクトリを作成します。
作成したsrc/main/kotlin内にバージョンカタログファイルを参照する関数を作成します。
ファイル名をVersionCatalog.ktにしています。
import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.getByType internal val Project.catalog get(): VersionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs") internal fun VersionCatalog.version(name: String): String { return findVersion(name).get().requiredVersion }
複数の各モジュールのbuild.gradle.ktsで必要となるcompileSdk等を共通のBuild Logicとして定義します。
compileSdk等のバージョン情報をバージョンカタログファイルに追記します。
[versions] compile-sdk = "34" target-sdk = "34" min-sdk = "27" :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
src/main/kotlin内に共通定義関数を作成します。
ファイル名をConfigureExtension.ktにしています。
import com.android.build.api.dsl.CommonExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions internal fun Project.configureCommonExtension( extension: CommonExtension<*, *, *, *, *> ) { extension.apply { compileSdk = catalog.version("compile-sdk").toInt() defaultConfig { minSdk = catalog.version("min-sdk").toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } } } private fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) { (this as ExtensionAware).extensions.configure("kotlinOptions", block) }
appモジュールの依存ライブラリ情報をバージョンカタログファイルに追記します。
[versions] : androidx-core = "1.12.0" # https://androidx.tech/artifacts/core/core-ktx/ androidx-appcompat = "1.6.1" # https://mvnrepository.com/artifact/androidx.appcompat/appcompat google-android-material = "1.11.0" # https://mvnrepository.com/artifact/com.google.android.material/material junit = "4.13.2" # https://mvnrepository.com/artifact/junit/junit junit-ext = "1.1.5" # https://androidx.tech/artifacts/test.ext/junit/ espresso-core = "3.5.1" # https://androidx.tech/artifacts/test.espresso/espresso-core/ [libraries] : androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } google-android-material = { module = "com.google.android.material:material", version.ref = "google-android-material" } junit = { module = "junit:junit", version.ref = "junit" } androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "junit-ext" } androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso-core" } [plugins] :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
src/main/kotlin内にappモジュールのbuild.gradle.ktsで使用するビルドプラグインを作成します。
ファイル名をApplicationConfigurePlugin.ktにしています。
import com.android.build.api.dsl.ApplicationExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies class ApplicationConfigurePlugin: Plugin<Project> { override fun apply(project: Project) { with(project) { with(pluginManager) { apply("com.android.application") apply("org.jetbrains.kotlin.android") apply("com.google.devtools.ksp") apply("com.google.dagger.hilt.android") } extensions.configure<ApplicationExtension> { configureCommonExtension(this) defaultConfig.targetSdk = catalog.version("target-sdk").toInt() buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } } dependencies { add("implementation", catalog.findLibrary("androidx.core.ktx").get()) add("implementation", catalog.findLibrary("androidx.appcompat").get()) add("implementation", catalog.findLibrary("google.android.material").get()) add("implementation", catalog.findLibrary("hilt.android").get()) add("testImplementation", catalog.findLibrary("junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.test.ext.junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.test.espresso.core").get()) add("ksp", catalog.findLibrary("hilt.compiler").get()) } } } }
作成したビルドプラグインをappモジュールのbuild.gradle.ktsで使用できるようにbuild-logic直下のbuild.gradle.ktsに追記します。
: gradlePlugin { plugins { register("ApplicationConfigurePlugin") { id = "build.logic.application.configure" implementationClass = "ApplicationConfigurePlugin" } } }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
appモジュールのbuild.gradle.ktsに作成したビルドプラグインを適用します。
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("build.logic.application.configure") } android { namespace = "jp.co.example.android01" compileSdk = 34 defaultConfig { applicationId = "jp.co.example.android01" minSdk = 27 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { implementation("androidx.core:core-ktx:1.10.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.9.0") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") }
適用後、『Sync Now』で内容をプロジェクトに反映させます。
ビルドプラグインを適用した後に、プロジェクトが正常にビルドできることを確認します。
appモジュールにApplicationクラスを継承したクラスを作成してHiltの使用準備を行います。
※クラス名は任意です。
package jp.co.example.android01 import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class AppExt: Application() { }
appモジュールのAndroidManifest.xmlに作成したクラスを登録します。
: <application android:name=".AppExt" :