Android StudioでAndroidアプリケーション開発のためのプロジェクトを新規に作成します。
新規プロジェクトの作成Android Studioを起動して、ナビゲーションの『プロジェクト』タブで『New Project』をクリックします。
テンプレートの選択『Phone and Tablet』の『No Activity』を選択して空のプロジェクトを作成します。
『次へ(N)』で次に進みます。
プロジェクト情報の入力各プロジェクト情報を入力します。
『Package name』は英数小文字のsnake_caseで、ドメインを逆にしたものを指定します。
『完了(F)』でプロジェクトが作成されます。
プラグイン/ライブラリの最新化はバージョンカタログを編集することで行います。
プロジェクトエクスプローラの切替プロジェクトの表示を『プロジェクトファイル』に切り替えます。
カタログファイルの編集バージョンカタログは、/gradle/libs.versions.toml に作成されています。
バージョンの最新化バージョンの背景色が黄色になっているプラグイン/ライブラリは最新バージョンが存在します。
カーソルをあてると『Change to …』が現れるので、クリックするとバージョンが置き換わります。
プロジェクトへの同期・反映バージョンカタログ等のファイルの内容を変更すると『Sync Now』が現れます。
クリックすると変更内容がプロジェクトに同期・反映されます。
ツールバーの『同期アイコン』をクリックしても同期・反映されます。
プロジェクトで使用するJDKを設定します。
JAVA_HOMEが他のアプリケーションで使用されていて、バージョンが異なるような場合に設定します。
※JAVA_HOMEのバージョンをそのまま使用する場合は、設定なくても構いません。
最上位のgradle.propertiesに使用するJDKのパスを追記します。
: # Use Android Studio's JDK for Gradle builds org.gradle.java.home=C\:/Program Files/Android/Android Studio/jbr
追記後、『Sync Now』で内容をプロジェクトに反映させます。
単体テストを効率的に行うためのオープンソースフレームワークをJUnit 4からJUnit 5に移行します。
バージョンカタログをJUnit 5に対応させます。
[versions] : junit = "4.13.2" junitVersion = "1.3.0" #noinspection NewerVersionAvailable junit5-bom = "5.13.4" # android-junit5:1.13.4.0を使う場合、5.13.4より上に上げないこと androidx-test = "1.7.0" # https://mvnrepository.com/artifact/androidx.test/core android-junit5 = "1.13.4.0" # https://github.com/mannodermaus/android-junit5 : [libraries] : junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } junit5-bom = { module = "org.junit:junit-bom", version.ref = "junit5-bom" } junit5-api = { module = "org.junit.jupiter:junit-jupiter-api" } junit5-engine = { module = "org.junit.jupiter:junit-jupiter-engine" } junit5-params = { module = "org.junit.jupiter:junit-jupiter-params" } androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidx-test" } androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test" } androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidx-test" } : [plugins] : android-junit5 = { id = "de.mannodermaus.android-junit5", version.ref = "android-junit5" } [bundles] androidx-test = [ "androidx-test-core", "androidx-test-runner", "androidx-test-rules" ] junit5 = [ "junit5-api", "junit5-params" ]
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにandroid-junit5の使用宣言を追記します。
plugins { : alias(libs.plugins.android.junit5) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
KotlinのアノテーションプロセッサーKSP(Kotlin Symbol Processing)を導入します。
バージョンカタログファイルにKSPの定義を追記します。
[versions] : ksp = "2.2.20-2.0.3" # https://github.com/google/ksp/releases : [plugins] : ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにKSPの使用宣言を追記します。
plugins { : alias(libs.plugins.ksp) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
モジュール間の依存関係を疎にして、テストをしやすくするため、DI(Dependency Injection)フレームワークのHiltを導入します。
バージョンカタログファイルにHiltの定義を追記します。
[versions] : hilt = "2.57.2" # https://mvnrepository.com/artifact/com.google.dagger/hilt-android [libraries] : hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" } [plugins] : hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにHiltの使用宣言を追記します。
plugins { : alias(libs.plugins.hilt) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
UI開発を簡素化するためのツールキットJetpack Composeを導入します。
バージョンカタログファイルにJetpack Composeの定義を追記します。
[versions] : compose-ui = "1.9.3" # https://mvnrepository.com/artifact/androidx.compose.ui/ui compose-material = "1.4.0" # https://mvnrepository.com/artifact/androidx.compose.material3/material3 compose-activity = "1.11.0" # https://mvnrepository.com/artifact/androidx.activity/activity-compose [libraries] : compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose-ui" } compose-material = { module = "androidx.compose.material3:material3", version.ref = "compose-material" } compose-activity = { module = "androidx.activity:activity-compose", version.ref = "compose-activity" } [plugins] : compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
最上位のbuild.gradle.ktsにJetpack Composeプラグインの使用宣言を追記します。
plugins { : alias(libs.plugins.compose.compiler) apply false }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
/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に変更します。
マルチモジュールの各モジュールの設定を共通化するため、Composite Buildを導入します。
ディレクトリの作成プロジェクトのトップディレクトリで右クリック➡『新規(N)』➡『ディレクトリ』でbuild-logicディレクトリを作成します。
※別のディレクトリ名でも構いません。
※その場合は以降読み替えてください。
バージョンカタログファイルにComposite Buildで使用するライブラリの定義を追記します。
: [libraries] tools-build-gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
build-logic直下にkotlinスクリプト settings.gradle.kts を新規に作成します。
pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } } }
build-logic直下にkotlinスクリプト build.gradle.kts を新規に作成します。
plugins { `kotlin-dsl` } dependencies { implementation(libs.tools.build.gradle) implementation(libs.kotlin.gradle.plugin) }
プロジェクト直下のsettings.gradle.ktsを編集して、Composite Buildをプロジェクトのビルド対象にします。
: include(":app") // サブプロジェクト参照を型安全にします enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") includeBuild("build-logic")
編集後、『Sync Now』で内容をプロジェクトに反映させます。
バージョンカタログ関連の拡張関数を作成します。
build-logic内にsrc/main/kotlinディレクトリを作成します。
作成したsrc/main/kotlin内にバージョンカタログ関連の拡張関数を作成します。
ファイル名をVersionCatalogExtensions.ktにしています。
package jp.co.progress_llc.buildlogic import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog import org.gradle.api.artifacts.VersionCatalogsExtension /** * プロジェクトからバージョンカタログを取得するための拡張関数です */ internal fun Project.libs(): VersionCatalog = extensions.getByType(VersionCatalogsExtension::class.java).named("libs")
compileSdk等のバージョン情報をバージョンカタログファイルに追記します。
[versions] compile-sdk = "36" target-sdk = "36" min-sdk = "28" :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
アプリケーション/ライブラリの共通設定を適用するためのヘルパー関数をsrc/main/kotlin内に作成します。
ファイル名をConfigureExtension.ktにしています。
package jp.co.progress_llc.buildlogic import org.gradle.api.Project import com.android.build.api.dsl.CommonExtension import org.gradle.api.JavaVersion import org.gradle.kotlin.dsl.configure import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension internal fun Project.configureCommonExtension( extension: CommonExtension<*, *, *, *, *, *> ) { extension.apply { compileSdk = this@configureCommonExtension.libs().findVersion("compile-sdk").get().requiredVersion.toInt() defaultConfig { minSdk = this@configureCommonExtension.libs().findVersion("min-sdk").get().requiredVersion.toInt() } compileOptions { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } 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")) } } } extensions.configure<KotlinAndroidProjectExtension> { jvmToolchain(21) } }
アプリケーションモジュール用のビルドプラグインを作成します。
src/main/kotlin内にappモジュールのbuild.gradle.ktsで使用するビルドプラグインを作成します。
ファイル名をApplicationConfigurePlugin.ktにしています。
package jp.co.progress_llc.buildlogic import org.gradle.api.Project import org.gradle.api.Plugin import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import com.android.build.api.dsl.ApplicationExtension 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") apply("org.jetbrains.kotlin.plugin.compose") } extensions.configure<ApplicationExtension> { configureCommonExtension(this) defaultConfig.targetSdk = project.libs().findVersion("target-sdk").get().requiredVersion.toInt() buildFeatures.compose = true buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } } dependencies { add("implementation", project.libs().findLibrary("androidx-core-ktx").get()) add("implementation", project.libs().findLibrary("androidx-appcompat").get()) add("implementation", project.libs().findLibrary("material").get()) add("implementation", project.libs().findLibrary("hilt-android").get()) add("ksp", project.libs().findLibrary("hilt-compiler").get()) } } }
作成したビルドプラグインを:appモジュールのbuild.gradle.ktsで使用できるようにbuild-logic直下のbuild.gradle.ktsに追記します。
: gradlePlugin { plugins { register("ApplicationConfigurePlugin") { id = "build.logic.application.configure" implementationClass = "jp.co.progress_llc.buildlogic.ApplicationConfigurePlugin" } } } dependencies { :
追記後、『Sync Now』で内容をプロジェクトに反映させます。
appモジュールのbuild.gradle.ktsに作成したビルドプラグインを適用します。
plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) id("build.logic.application.configure") } android { namespace = "jp.co.progress_llc.portal" compileSdk { version = release(36) } defaultConfig { applicationId = "jp.co.progress_llc.portal" minSdk = 28 targetSdk = 36 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) }
適用後、『Sync Now』で内容をプロジェクトに反映させます。
:appモジュールではテストクラスによるテストの予定がありませんので、サンプルテストクラスを削除します。
下記のファイルを削除します。
この時点で、プロジェクトが正常にコンパイル/ビルドできることを確認します。
:appモジュールにApplicationクラスを継承したクラスを作成し、Hiltを介してApplicationを実行するようにします。
※クラス名は任意です。
package jp.co.progress_llc.portal import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class HiltApplication: Application() { }
:appモジュールのAndroidManifest.xmlに作成したクラスを登録します。
: <application android:name=".HiltApplication" :