Skip to content

Commit 60cceaf

Browse files
committed
start adding conventions
1 parent b698a6a commit 60cceaf

7 files changed

Lines changed: 245 additions & 3 deletions

File tree

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
uses: actions/setup-java@v4
1818
with:
1919
distribution: 'temurin'
20-
java-version: '11'
20+
java-version: '21'
2121

2222
- name: Setup Gradle
2323
uses: gradle/actions/setup-gradle@v4
@@ -33,4 +33,4 @@ jobs:
3333
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
3434
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY }}
3535
ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.GPG_KEY_ID }}
36-
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_KEY_PASSWORD }}
36+
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_KEY_PASSWORD }}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2+
3+
plugins {
4+
`kotlin-dsl`
5+
alias(libs.plugins.android.lint)
6+
}
7+
8+
group = "com.seanproctor.datatable.buildlogic"
9+
10+
// Configure the build-logic plugins to target JDK 17
11+
// This matches the JDK used to build the project, and is not related to what is running on device.
12+
java {
13+
sourceCompatibility = JavaVersion.VERSION_17
14+
targetCompatibility = JavaVersion.VERSION_17
15+
}
16+
17+
kotlin {
18+
compilerOptions {
19+
jvmTarget = JvmTarget.JVM_17
20+
}
21+
}
22+
23+
dependencies {
24+
compileOnly(libs.android.gradlePlugin)
25+
compileOnly(libs.android.tools.common)
26+
compileOnly(libs.compose.gradlePlugin)
27+
compileOnly(libs.kotlin.gradlePlugin)
28+
implementation(libs.truth)
29+
lintChecks(libs.androidx.lint.gradle)
30+
}
31+
32+
tasks {
33+
validatePlugins {
34+
enableStricterValidation = true
35+
failOnWarning = true
36+
}
37+
}
38+
39+
gradlePlugin {
40+
plugins {
41+
register("androidLibrary") {
42+
id = libs.plugins.nowinandroid.android.library.asProvider().get().pluginId
43+
implementationClass = "AndroidLibraryConventionPlugin"
44+
}
45+
}
46+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright 2022 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import com.android.build.api.variant.LibraryAndroidComponentsExtension
18+
import com.android.build.gradle.LibraryExtension
19+
import com.google.samples.apps.nowinandroid.configureFlavors
20+
import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
21+
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
22+
import com.google.samples.apps.nowinandroid.configurePrintApksTask
23+
import com.google.samples.apps.nowinandroid.disableUnnecessaryAndroidTests
24+
import com.google.samples.apps.nowinandroid.libs
25+
import org.gradle.api.Plugin
26+
import org.gradle.api.Project
27+
import org.gradle.kotlin.dsl.configure
28+
import org.gradle.kotlin.dsl.dependencies
29+
30+
class AndroidLibraryConventionPlugin : Plugin<Project> {
31+
override fun apply(target: Project) {
32+
with(target) {
33+
with(pluginManager) {
34+
apply("com.android.library")
35+
apply("org.jetbrains.kotlin.android")
36+
apply("nowinandroid.android.lint")
37+
}
38+
39+
extensions.configure<LibraryExtension> {
40+
configureKotlinAndroid(this)
41+
defaultConfig.targetSdk = 35
42+
defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
43+
testOptions.animationsDisabled = true
44+
configureFlavors(this)
45+
configureGradleManagedDevices(this)
46+
// The resource prefix is derived from the module name,
47+
// so resources inside ":core:module1" must be prefixed with "core_module1_"
48+
resourcePrefix = path.split("""\W""".toRegex()).drop(1).distinct().joinToString(separator = "_").lowercase() + "_"
49+
}
50+
extensions.configure<LibraryAndroidComponentsExtension> {
51+
configurePrintApksTask(this)
52+
disableUnnecessaryAndroidTests(target)
53+
}
54+
dependencies {
55+
"androidTestImplementation"(libs.findLibrary("kotlin.test").get())
56+
"testImplementation"(libs.findLibrary("kotlin.test").get())
57+
58+
"implementation"(libs.findLibrary("androidx.tracing.ktx").get())
59+
}
60+
}
61+
}
62+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.seanproctor.datatable
2+
3+
import com.android.build.api.dsl.CommonExtension
4+
import org.gradle.api.JavaVersion
5+
import org.gradle.api.Project
6+
import org.gradle.api.plugins.JavaPluginExtension
7+
import org.gradle.kotlin.dsl.assign
8+
import org.gradle.kotlin.dsl.configure
9+
import org.gradle.kotlin.dsl.dependencies
10+
import org.gradle.kotlin.dsl.provideDelegate
11+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
12+
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
13+
import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension
14+
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
15+
16+
/**
17+
* Configure base Kotlin with Android options
18+
*/
19+
internal fun Project.configureKotlinAndroid(
20+
commonExtension: CommonExtension<*, *, *, *, *, *>,
21+
) {
22+
commonExtension.apply {
23+
compileSdk = 35
24+
25+
defaultConfig {
26+
minSdk = 21
27+
}
28+
29+
compileOptions {
30+
// Up to Java 11 APIs are available through desugaring
31+
// https://developer.android.com/studio/write/java11-minimal-support-table
32+
sourceCompatibility = JavaVersion.VERSION_11
33+
targetCompatibility = JavaVersion.VERSION_11
34+
isCoreLibraryDesugaringEnabled = true
35+
}
36+
}
37+
38+
configureKotlin<KotlinAndroidProjectExtension>()
39+
40+
dependencies {
41+
"coreLibraryDesugaring"(libs.findLibrary("android.desugarJdkLibs").get())
42+
}
43+
}
44+
45+
/**
46+
* Configure base Kotlin options for JVM (non-Android)
47+
*/
48+
internal fun Project.configureKotlinJvm() {
49+
extensions.configure<JavaPluginExtension> {
50+
// Up to Java 11 APIs are available through desugaring
51+
// https://developer.android.com/studio/write/java11-minimal-support-table
52+
sourceCompatibility = JavaVersion.VERSION_11
53+
targetCompatibility = JavaVersion.VERSION_11
54+
}
55+
56+
configureKotlin<KotlinJvmProjectExtension>()
57+
}
58+
59+
/**
60+
* Configure base Kotlin options
61+
*/
62+
private inline fun <reified T : KotlinBaseExtension> Project.configureKotlin() = configure<T> {
63+
// Treat all Kotlin warnings as errors (disabled by default)
64+
// Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties
65+
val warningsAsErrors: String? by project
66+
when (this) {
67+
is KotlinAndroidProjectExtension -> compilerOptions
68+
is KotlinJvmProjectExtension -> compilerOptions
69+
else -> TODO("Unsupported project extension $this ${T::class}")
70+
}.apply {
71+
jvmTarget = JvmTarget.JVM_11
72+
allWarningsAsErrors = warningsAsErrors.toBoolean()
73+
freeCompilerArgs.add(
74+
// Enable experimental coroutines APIs, including Flow
75+
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
76+
)
77+
freeCompilerArgs.add(
78+
/**
79+
* Remove this args after Phase 3.
80+
* https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-consistent-copy-visibility/#deprecation-timeline
81+
*
82+
* Deprecation timeline
83+
* Phase 3. (Supposedly Kotlin 2.2 or Kotlin 2.3).
84+
* The default changes.
85+
* Unless ExposedCopyVisibility is used, the generated 'copy' method has the same visibility as the primary constructor.
86+
* The binary signature changes. The error on the declaration is no longer reported.
87+
* '-Xconsistent-data-class-copy-visibility' compiler flag and ConsistentCopyVisibility annotation are now unnecessary.
88+
*/
89+
"-Xconsistent-data-class-copy-visibility"
90+
)
91+
}
92+
}

build-logic/settings.gradle.kts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
pluginManagement {
2+
repositories {
3+
gradlePluginPortal()
4+
google()
5+
}
6+
}
7+
8+
dependencyResolutionManagement {
9+
repositories {
10+
google()
11+
mavenCentral()
12+
}
13+
versionCatalogs {
14+
create("libs") {
15+
from(files("../gradle/libs.versions.toml"))
16+
}
17+
}
18+
}
19+
20+
rootProject.name = "build-logic"
21+
include(":convention")

gradle/libs.versions.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
66
android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
7+
android-lint = { id = "com.android.lint", version.ref = "androidGradlePlugin" }
78
compose = { id = "org.jetbrains.compose", version.ref = "compose" }
89
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
910
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
@@ -14,12 +15,23 @@ vanniktech-base = { id = "com.vanniktech.maven.publish.base", version.ref = "van
1415

1516
activityCompose = "1.9.3"
1617
androidGradlePlugin = "8.7.3"
18+
androidTools = "31.7.3"
19+
androidxLintGradle = "1.0.0-alpha03"
1720
compose = "1.7.3"
1821
junit = "4.13.2"
1922
kotlin = "2.1.0"
23+
truth = "1.4.4"
2024
vanniktech = "0.30.0"
2125

2226
[libraries]
2327

2428
activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" }
2529
junit = { module = "junit:junit", version.ref = "junit" }
30+
truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
31+
32+
# Dependencies of the included build-logic
33+
android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" }
34+
android-tools-common = { group = "com.android.tools", name = "common", version.ref = "androidTools" }
35+
androidx-lint-gradle = { group = "androidx.lint", name = "lint-gradle", version.ref = "androidxLintGradle" }
36+
compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
37+
kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }

settings.gradle.kts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
pluginManagement {
2+
includeBuild("build-logic")
23
repositories {
34
google()
4-
gradlePluginPortal()
55
mavenCentral()
6+
gradlePluginPortal()
67
}
78
}
89

@@ -23,3 +24,11 @@ refreshVersions {
2324
candidate.stabilityLevel.isLessStableThan(current.stabilityLevel)
2425
}
2526
}
27+
28+
check(JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) {
29+
"""
30+
Now in Android requires JDK 17+ but it is currently using JDK ${JavaVersion.current()}.
31+
Java Home: [${System.getProperty("java.home")}]
32+
https://developer.android.com/build/jdks#jdk-config-in-studio
33+
""".trimIndent()
34+
}

0 commit comments

Comments
 (0)