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』の最新バージョンを選択します。
執筆時では、8.10.2でした。
『OK』で終了します。
マルチモジュールプロジェクトで構成するため、各モジュール内で定義するバージョン情報をバージョンカタログで一元管理します。
プロジェクトエクスプローラの切替プロジェクトの表示を『プロジェクトファイル』に切り替えます。
カタログファイルの編集バージョンカタログファイルは、/gradle/libs.versions.toml に作成されています。
バージョンカタログファイルを編集します。
マルチモジュールの各モジュールの設定を共通化するため、まず最初にAndroid Gradleのビルドツールプラグインの定義を行います。
[versions] agp = "8.7.2" kotlin = "2.0.21" :
定義ファイルを編集したので、Android Studio右上の『同期アイコン』をクリックして定義内容をプロジェクト全体に同期させます。
KotlinのアノテーションプロセッサーKSP(Kotlin Symbol Processing)を導入します。
バージョンカタログファイルにKSPの定義を追記します。
[versions] : devtools-ksp = "2.0.21-1.0.27" : [plugins] : devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "devtools-ksp" }
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにKSPの使用宣言を追記します。
plugins { : alias(libs.plugins.devtools.ksp) apply false }
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
モジュール間の依存関係を疎にするため、DI(Dependency Injection)フレームワークのHiltを導入します。
バージョンカタログファイルにHiltの定義を追記します。
[versions] : dagger-hilt = "2.52" [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" }
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにHiltの使用宣言を追記します。
plugins { : alias(libs.plugins.hilt.android) apply false }
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
マルチモジュールの各モジュールの設定を共通化するため、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")) } } }
作成後、『同期アイコン』で内容をプロジェクトに反映させます。
バージョンカタログファイルにComposite Buildで使用するライブラリの定義を追加します。
: [libraries] : tools-build-gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } :
追加後、『同期アイコン』で内容をプロジェクトに反映させます。
build-logic直下にkotlinスクリプト build.gradle.kts を新規に作成します。
plugins { `kotlin-dsl` } dependencies { implementation(libs.tools.build.gradle) implementation(libs.kotlin.gradle) }
作成後、『同期アイコン』で内容をプロジェクトに反映させます。
プロジェクト直下のsettings.gradle.ktsを編集して、Composite Buildをプロジェクトに適用します。
: includeBuild("build-logic")
編集後、『同期アイコン』で内容をプロジェクトに反映させます。
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" :
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
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.kotlin.dsl.assign import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension 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 } configureKotlin<KotlinAndroidProjectExtension>() } } private inline fun <reified T : KotlinTopLevelExtension> Project.configureKotlin() = configure<T> { val warningsAsErrors: String? by project when (this) { is KotlinAndroidProjectExtension -> compilerOptions is KotlinJvmProjectExtension -> compilerOptions else -> TODO("Unsupported project extension $this ${T::class}") }.apply { jvmTarget = JvmTarget.JVM_11 allWarningsAsErrors = warningsAsErrors.toBoolean() } }
バージョンカタログファイルのappモジュールの依存ライブラリ情報を更新します。
[versions] : coreKtx = "1.15.0" # https://mvnrepository.com/artifact/androidx.core/core-ktx junit = "4.13.2" # https://mvnrepository.com/artifact/junit/junit junitVersion = "1.2.1" # https://mvnrepository.com/artifact/androidx.test.ext/junit espressoCore = "3.6.1" # https://mvnrepository.com/artifact/androidx.test.espresso/espresso-core appcompat = "1.7.0" # https://mvnrepository.com/artifact/androidx.appcompat/appcompat material = "1.12.0" # https://mvnrepository.com/artifact/com.google.android.material/material :
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
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("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("material").get()) add("implementation", catalog.findLibrary("hilt.android").get()) add("testImplementation", catalog.findLibrary("junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.junit").get()) add("androidTestImplementation", catalog.findLibrary("androidx.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" } } }
追記後、『同期アイコン』で内容をプロジェクトに反映させます。
appモジュールのbuild.gradle.ktsに作成したビルドプラグインを適用します。
plugins { alias(libs.plugins.android.application) alias(libs.plugins.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_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) }
適用後、『同期アイコン』で内容をプロジェクトに反映させます。
ビルドプラグインを適用した後に、プロジェクトが正常にビルドできることを確認します。
appモジュールにApplicationクラスを継承したクラスを作成してHiltの使用準備を行います。
※クラス名は任意です。
package jp.co.example.android01 import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class AppHiltExt: Application() { }
appモジュールのAndroidManifest.xmlに作成したクラスを登録します。
: <application android:name=".AppHiltExt" :
/app/src/main/java/… のディレクトリ名を /app/src/main/kotlin/… に変更します。
※変更しなくても構いません。
/app/src/main/java ディレクトリで右クリック➡『リファクタリング(R)』➡『名前の変更(R)…』へと進みます。
名前の変更変更後の名前に kotlin を入力して『リファクタリング(R)』でディレクトリ名を変更します。
/app/src/androidTest/java、/app/src/test/java も同様に kotlin に変更します。
appモジュールのbuild.gradle.ktsをソースファイルがkotlinフォルダに作成されるように変更します。
: android { : sourceSets { getByName("main") { java.setSrcDirs(listOf("src/main/kotlin")) } getByName("test") { java.setSrcDirs(listOf("src/test/kotlin")) } getByName("androidTest") { java.setSrcDirs(listOf("src/androidTest/kotlin")) } } }