ユーザ用ツール

サイト用ツール


サイドバー

プログレス合同会社

広告

android:studio:application:project

01.新規プロジェクトの作成

Android StudioでAndroidアプリケーション開発のためのプロジェクトを新規に作成します。

android:studio:application:android-app0101.png

新規プロジェクトの作成

Android Studioを起動して、ナビゲーションの『プロジェクト』タブで『New Project』をクリックします。

android:studio:application:android-app0102.png

テンプレートの選択

Phone and Tablet』の『No Activity』を選択して空のプロジェクトを作成します。

次へ(N)』で次に進みます。

android:studio:application:android-app0103.png

プロジェクト情報の入力

各プロジェクト情報を入力します。

Package name』は英数小文字のsnake_caseで、ドメインを逆にしたものを指定します。

完了(F)』でプロジェクトが作成されます。

プラグイン/ライブラリの最新化

プラグイン/ライブラリの最新化はバージョンカタログを編集することで行います。

android:studio:application:android-app0111.png

プロジェクトエクスプローラの切替

プロジェクトの表示を『プロジェクトファイル』に切り替えます。

android:studio:application:android-app0112.png

カタログファイルの編集

バージョンカタログは、/gradle/libs.versions.toml に作成されています。

android:studio:application:android-app0113.png

バージョンの最新化

バージョンの背景色が黄色になっているプラグイン/ライブラリは最新バージョンが存在します。

カーソルをあてると『Change to …』が現れるので、クリックするとバージョンが置き換わります。

android:studio:application:android-app0114.png

プロジェクトへの同期・反映

バージョンカタログ等のファイルの内容を変更すると『Sync Now』が現れます。

クリックすると変更内容がプロジェクトに同期・反映されます。

ツールバーの『同期アイコン』をクリックしても同期・反映されます。

JDKの設定

プロジェクトで使用する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

3行目
Android Studioに同梱されているJDKを指定しています。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

JUnit 5へ移行

単体テストを効率的に行うためのオープンソースフレームワークを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" ]

3行目~4行目、12行目~13行目
Compose UIのテストがJUnit 4に依存している箇所がありますので、残しておきます。
5行目
新しいバージョンの通知を行わせない設定です。
6行目
これより上のバージョンは、android-junit5:1.13.4.0が対応していません
7行目~8行目
コメント部分のURLを参照して、最新安定バージョンを指定します。
14行目~17行目
JUnit 5のライブラリを指定します。
BOMでバージョンの整合性を取りますので、個々のライブラリでのバージョン参照は不要です。
18行目~20行目
テストフレームワークのライブラリを指定します。
24行目
JUnit 5のプラグインを指定します。
25行目~28行目
テストライブラリをグループ化しています。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

最上位のbuild.gradle.ktsandroid-junit5の使用宣言を追記します。

plugins {
   :
  alias(libs.plugins.android.junit5) apply false
}

3行目
バージョンカタログファイルのandroid-junit5プラグインを参照します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

KSPの導入

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" }

3行目
コメント部分のURLを参照して、Kotlinバージョンに適した最新安定バージョンを指定します。
7行目
任意の名前でプラグインを定義します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

最上位のbuild.gradle.ktsKSPの使用宣言を追記します。

plugins {
   :
  alias(libs.plugins.ksp) apply false
}

3行目
バージョンカタログファイルのKSPプラグインを参照します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

Hiltの導入

モジュール間の依存関係を疎にして、テストをしやすくするため、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" }

3行目
コメント部分のURLを参照して、最新安定バージョンを指定します。
7行目~8行目
任意の名前で依存ライブラリを定義します。
12行目
任意の名前でプラグインを定義します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

最上位のbuild.gradle.ktsにHiltの使用宣言を追記します。

plugins {
   :
  alias(libs.plugins.hilt) apply false
}

3行目
バージョンカタログファイルのHiltプラグインを参照します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

Jetpack Composeの導入

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" }

3行目~5行目[versions]
コメント部分のURLを参照して最新安定バージョンを指定します。
9行目~11行目[libraries]
Jetpack Composeのライブラリを定義します。
15行目[plugins]
Jetpack Composekotlinコンパイラープラグインを定義します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

最上位のbuild.gradle.ktsJetpack Composeプラグインの使用宣言を追記します。

plugins {
   :
  alias(libs.plugins.compose.compiler) apply false
}

3行目
バージョンカタログファイルのJetpack Composeプラグインを参照します。

追記後、『Sync Now』で内容をプロジェクトに反映させます。

javaディレクトリ名の変更

/app/src/main/java/… のディレクトリ名を /app/src/main/kotlin/… に変更します。
※変更しなくても構いません。

android:studio:application:android-app0121.png

リファクタリングの開始

/app/src/main/java ディレクトリで右クリック➡『リファクタリング(R)』➡『名前の変更(R)…』へと進みます。

android:studio:application:android-app0122.png

名前の変更

変更後の名前に kotlin を入力して『リファクタリング(R)』でディレクトリ名を変更します。

/app/src/androidTest/java、/app/src/test/java も同様にkotlinに変更します。

Composite Buildの導入

マルチモジュールの各モジュールの設定を共通化するため、Composite Buildを導入します。

android:studio:application:android-app0131.png

ディレクトリの作成

プロジェクトのトップディレクトリで右クリック➡『新規(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" }
   :

3行目~4行目[libraries]
Composite Buildで使用するライブラリを定義します。

追記後、『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"))
    }
  }
}

1行目~7行目
build-logicで使用するプラグインのリポジトリサーバーを指定します。
10行目~14行目
build-logicで依存するプラグイン/ライブラリのリポジトリサーバーを指定します。
15行目~19行目
build-logicでバージョンカタログをlibsで参照可能にします。

build-logic直下にkotlinスクリプト build.gradle.kts を新規に作成します。

plugins {
  `kotlin-dsl`
}

dependencies {
  implementation(libs.tools.build.gradle)
  implementation(libs.kotlin.gradle.plugin)
}

2行目
ビルドスクリプトをKotlinで記述するためのプラグインを指定します。
6行目~7行目
依存するライブラリを指定します。

プロジェクト直下のsettings.gradle.ktsを編集して、Composite Buildをプロジェクトのビルド対象にします。

   :
include(":app")

// サブプロジェクト参照を型安全にします
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
includeBuild("build-logic")

5行目~6行目
build-logicをビルドの対象にします。

編集後、『Sync Now』で内容をプロジェクトに反映させます。

VersionCatalogExtensionsの作成

バージョンカタログ関連の拡張関数を作成します。

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")

10行目
libs()でバージョンカタログファイルを参照するように定義しています。
11行目
バージョンカタログファイルを参照する関数の本体です。

ConfigureExtensionの作成

compileSdk等のバージョン情報をバージョンカタログファイルに追記します。

[versions]
compile-sdk = "36"
target-sdk  = "36"
min-sdk     = "28"
   :

2行目~4行目[versions]
それぞれのバージョンを任意の名前で指定します。

追記後、『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)
  }
}

1行目
パッケージ名は適宜自身のものに置き換えてください。
以降、同様です。
9行目~36行目(Project.configureCommonExtension)
全モジュールのbuild.gradle.ktsで共通な項目を定義している関数です。
testInstrumentationRunnerテストの必要に応じて各モジュールのbuild.gradle.ktsで定義します。
そのため、ここでは定義しません。
関数名configureCommonExtensionは任意の名前です。
13行目、15行目
VersionCatalogExtensions.ktで定義した関数を使用してバージョンカタログファイルからバージョン情報を取り出しています。
this@configureCommonExtensionProjectlibs()を明示的に参照しています。
21行目~31行目
ソースファイルがkotlinフォルダに作成されていることを定義します。

ApplicationConfigurePluginの作成

アプリケーションモジュール用のビルドプラグインを作成します。

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())
    }
  }
}

12行目~13行目
:appモジュールで使用するプラグインを定義しています。
/app/build.gradle.kts内のpluginsブロックを参照して指定します。
14行目~16行目
KSPHiltJetpack Composeのプラグインを定義しています。
19行目
ConfigureExtension.ktで作成した全モジュールの共通定義を呼び出しています。
20行目
defaultConfigブロックのtargetSdkをバージョンカタログを参照して指定しています。
21行目
Jetpack Composeを有効にします。
22行目~27行目
/app/build.gradle.kts内のandroid/buildTypesブロックを参照して指定します。
30行目~32行目
dependenciesブロックの依存ライブラリを定義しています。
/app/build.gradle.kts内のdependenciesブロックを参照して指定します。
テスト関連の依存ライブラリはビルドプラグインでは定義しません。
テストの必要に応じて、各モジュールのbuild.gradle.ktsで定義します。
バージョンカタログを参照しています。
33行目
Hiltの依存ライブラリをバージョンカタログを参照して定義しています。
34行目
HiltKSP依存ライブラリをバージョンカタログを参照して定義しています。

ApplicationConfigurePluginの適用

作成したビルドプラグインを: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 {
   :

4行目
任意の名前で名称を定義しています。
5行目
任意の名前でプラグインのidを定義しています。
6行目
プラグインを実装しているクラスを指定します。
/build-logic/src/main/kotlin内に作成したApplicationConfigurePlugin.ktで定義しているクラス名です。

追記後、『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)
}

2行目~3行目、9行目~11行目、15行目~16行目、23行目~35行目、40行目~42行目
ビルドプラグインで定義しているので削除します。
4行目
/build-logic/build.gradle.ktsで定義したビルドプラグインのidを指定します。
20行目、43行目~45行目
テストを行うときまで削除します。

適用後、『Sync Now』で内容をプロジェクトに反映させます。

サンプルテストクラスの削除

:appモジュールではテストクラスによるテストの予定がありませんので、サンプルテストクラスを削除します。

下記のファイルを削除します。

  • /app/src/androidTest/kotlin/jp/co/progress_llc/potal/app/ExampleInstrumentedTest.kt
  • /app/src/test/kotlin/jp/co/progress_llc/potal/app/ExampleUnitTest.kt

この時点で、プロジェクトが正常にコンパイル/ビルドできることを確認します。

Hiltの使用準備

:appモジュールにApplicationクラスを継承したクラスを作成し、Hiltを介してApplicationを実行するようにします。
※クラス名は任意です。

package jp.co.progress_llc.portal

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class HiltApplication: Application() {
}

6行目
Hiltの使用を宣言しています。
7行目
Applicationクラスを継承しています。

:appモジュールのAndroidManifest.xmlに作成したクラスを登録します。

   :
  <application
    android:name=".HiltApplication"
   :

3行目
作成したクラスの名前を指定しています。

android/studio/application/project.txt · 最終更新: by プログレス合同会社