Skip to content

Commit a16519b

Browse files
committed
Refactor common build logic into a set of Gradle plugins
Creates androidify.applicationPlugin, androidify.libraryPlugin, and androidify.composeLibraryPlugin that picks up common logic from build.gradle.kts files and reduces duplication it build logic Test: ./gradlew testDebugUnitTest -x app:testDebugUnitTest
1 parent baa2ee7 commit a16519b

24 files changed

+218
-272
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,5 @@
1010
/app/src/release/generated/*
1111
/core/build/
1212
/feature/build/
13+
/build-plugin/build
14+
/build-plugin/.gradle/*

app/build.gradle.kts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
1717

1818
plugins {
19-
alias(libs.plugins.android.application)
20-
alias(libs.plugins.kotlin.android)
21-
alias(libs.plugins.kotlin.compose)
19+
alias(libs.plugins.androidify.androidApplication)
2220
alias(libs.plugins.serialization)
2321
alias(libs.plugins.kotlin.ksp)
2422
alias(libs.plugins.hilt)
@@ -31,20 +29,10 @@ plugins {
3129

3230
android {
3331
namespace = "com.android.developers.androidify"
34-
compileSdk = libs.versions.compileSdk.get().toInt()
35-
3632
defaultConfig {
3733
applicationId = "com.android.developers.androidify"
38-
minSdk = libs.versions.minSdk.get().toInt()
39-
targetSdk = 36
4034
versionCode = libs.versions.appVersionCode.get().toInt()
4135
versionName = libs.versions.appVersionName.get()
42-
43-
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
44-
}
45-
46-
signingConfigs {
47-
4836
}
4937

5038
buildTypes {
@@ -84,13 +72,6 @@ android {
8472
}
8573
}
8674
}
87-
compileOptions {
88-
sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
89-
targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
90-
}
91-
kotlinOptions {
92-
jvmTarget = libs.versions.javaVersion.get()
93-
}
9475
testOptions {
9576
unitTests {
9677
isIncludeAndroidResources = true

build-plugin/build.gradle.kts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
plugins {
2+
`kotlin-dsl`
3+
}
4+
5+
dependencies {
6+
compileOnly(libs.android.gradlePluginApi)
7+
compileOnly(libs.kotlin.gradlePlugin)
8+
}
9+
10+
11+
tasks {
12+
validatePlugins {
13+
enableStricterValidation = true
14+
failOnWarning = true
15+
}
16+
}
17+
18+
gradlePlugin {
19+
plugins {
20+
register(libs.plugins.androidify.androidLibrary.get().pluginId) {
21+
id = libs.plugins.androidify.androidLibrary.get().pluginId
22+
implementationClass = "com.android.developers.androidify.plugin.AndroidLibraryPlugin"
23+
}
24+
register(libs.plugins.androidify.androidComposeLibrary.get().pluginId) {
25+
id = libs.plugins.androidify.androidComposeLibrary.get().pluginId
26+
implementationClass = "com.android.developers.androidify.plugin.AndroidComposeLibraryPlugin"
27+
}
28+
register(libs.plugins.androidify.androidApplication.get().pluginId) {
29+
id = libs.plugins.androidify.androidApplication.get().pluginId
30+
implementationClass = "com.android.developers.androidify.plugin.AndroidApplicationPlugin"
31+
}
32+
}
33+
}

build-plugin/settings.gradle.kts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
pluginManagement {
2+
repositories {
3+
gradlePluginPortal()
4+
google()
5+
}
6+
}
7+
8+
dependencyResolutionManagement {
9+
repositories {
10+
google {
11+
content {
12+
includeGroupByRegex("com\\.android.*")
13+
includeGroupByRegex("com\\.google.*")
14+
includeGroupByRegex("androidx.*")
15+
}
16+
}
17+
mavenCentral()
18+
}
19+
versionCatalogs {
20+
create("libs") {
21+
from(files("../gradle/libs.versions.toml"))
22+
}
23+
}
24+
}
25+
26+
rootProject.name = "build-logic"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.android.developers.androidify.plugin
2+
3+
import com.android.build.api.dsl.ApplicationExtension
4+
import org.gradle.api.JavaVersion
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.apply
8+
import org.gradle.kotlin.dsl.assign
9+
import org.gradle.kotlin.dsl.configure
10+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
11+
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
12+
13+
class AndroidApplicationPlugin : Plugin<Project> {
14+
override fun apply(project: Project) {
15+
with(project) {
16+
apply(plugin = "com.android.application")
17+
apply(plugin = "org.jetbrains.kotlin.android")
18+
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
19+
20+
extensions.configure<ApplicationExtension> {
21+
compileSdk = getVersionByName("compileSdk").toInt()
22+
defaultConfig {
23+
minSdk = getVersionByName("minSdk").toInt()
24+
targetSdk = getVersionByName("targetSdk").toInt()
25+
}
26+
compileOptions {
27+
val javaVersion = JavaVersion.toVersion(getVersionByName("javaVersion"))
28+
sourceCompatibility = javaVersion
29+
targetCompatibility = javaVersion
30+
}
31+
buildFeatures {
32+
compose = true
33+
}
34+
}
35+
extensions.configure<KotlinAndroidProjectExtension> {
36+
compilerOptions {
37+
jvmTarget = JvmTarget.fromTarget(getVersionByName("jvmTarget"))
38+
}
39+
}
40+
}
41+
}
42+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.android.developers.androidify.plugin
2+
3+
import com.android.build.api.dsl.LibraryExtension
4+
import org.gradle.api.Plugin
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.apply
7+
import org.gradle.kotlin.dsl.configure
8+
9+
class AndroidComposeLibraryPlugin : Plugin<Project> {
10+
override fun apply(project: Project) {
11+
with(project) {
12+
apply(plugin = "androidify.androidLibrary")
13+
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
14+
apply(plugin = "com.android.compose.screenshot")
15+
16+
extensions.configure<LibraryExtension> {
17+
defaultConfig {
18+
testInstrumentationRunner = "com.android.developers.testing.AndroidifyTestRunner"
19+
}
20+
buildFeatures.compose = true
21+
experimentalProperties["android.experimental.enableScreenshotTest"] = true
22+
}
23+
}
24+
}
25+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.android.developers.androidify.plugin
2+
3+
import com.android.build.api.dsl.LibraryExtension
4+
import org.gradle.api.JavaVersion
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.apply
8+
import org.gradle.kotlin.dsl.assign
9+
import org.gradle.kotlin.dsl.configure
10+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
11+
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
12+
13+
class AndroidLibraryPlugin : Plugin<Project> {
14+
override fun apply(project: Project) {
15+
with(project) {
16+
apply(plugin = "com.android.library")
17+
apply(plugin = "org.jetbrains.kotlin.android")
18+
19+
extensions.configure<LibraryExtension> {
20+
compileSdk = getVersionByName("compileSdk").toInt()
21+
defaultConfig {
22+
minSdk = getVersionByName("minSdk").toInt()
23+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
24+
}
25+
compileOptions {
26+
val javaVersion = JavaVersion.toVersion(getVersionByName("javaVersion"))
27+
sourceCompatibility = javaVersion
28+
targetCompatibility = javaVersion
29+
}
30+
testOptions {
31+
targetSdk = getVersionByName("targetSdk").toInt()
32+
}
33+
lint {
34+
targetSdk = getVersionByName("targetSdk").toInt()
35+
}
36+
}
37+
extensions.configure<KotlinAndroidProjectExtension> {
38+
compilerOptions {
39+
jvmTarget = JvmTarget.fromTarget(getVersionByName("jvmTarget"))
40+
}
41+
}
42+
}
43+
}
44+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.android.developers.androidify.plugin
2+
3+
import org.gradle.api.GradleException
4+
import org.gradle.api.Project
5+
import org.gradle.api.artifacts.VersionCatalog
6+
import org.gradle.api.artifacts.VersionCatalogsExtension
7+
import org.gradle.kotlin.dsl.getByType
8+
9+
private val Project.versionCatalog: VersionCatalog
10+
get() = project.extensions.getByType<VersionCatalogsExtension>().find("libs").get()
11+
12+
internal fun Project.getVersionByName(name: String): String {
13+
val version = versionCatalog.findVersion(name)
14+
return if (version.isPresent) {
15+
version.get().requiredVersion
16+
} else {
17+
throw GradleException("Could not find a version for `$name`")
18+
}
19+
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ plugins {
1212
alias(libs.plugins.android.test) apply false
1313
alias(libs.plugins.baselineprofile) apply false
1414
alias(libs.plugins.spotless) apply false
15+
alias(libs.plugins.composeScreenshot) apply false
1516
}
1617
buildscript {
1718
repositories {

core/network/build.gradle.kts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,15 @@
1414
* limitations under the License.
1515
*/
1616
plugins {
17-
alias(libs.plugins.android.library)
18-
alias(libs.plugins.kotlin.android)
17+
alias(libs.plugins.androidify.androidLibrary)
1918
alias(libs.plugins.serialization)
2019
alias(libs.plugins.kotlin.ksp)
2120
alias(libs.plugins.hilt)
2221
}
2322

2423
android {
2524
namespace = "com.android.developers.androidify.network"
26-
compileSdk = libs.versions.compileSdk.get().toInt()
27-
2825
defaultConfig {
29-
minSdk = libs.versions.minSdk.get().toInt()
3026
testInstrumentationRunner = "com.android.developers.testing.AndroidifyTestRunner"
3127
}
3228
buildFeatures {
@@ -40,14 +36,6 @@ android {
4036
buildConfigField("boolean", "debug", "false")
4137
}
4238
}
43-
44-
compileOptions {
45-
sourceCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
46-
targetCompatibility = JavaVersion.toVersion(libs.versions.javaVersion.get())
47-
}
48-
kotlinOptions {
49-
jvmTarget = libs.versions.jvmTarget.get()
50-
}
5139
}
5240

5341
// Explicitly disable the connectedAndroidTest task for this module

0 commit comments

Comments
 (0)