refactor: Rework buildSrc

Co-authored-by: AntsyLich <59261191+antsylich@users.noreply.github.com>
This commit is contained in:
Ahmad Ansori Palembani 2024-12-25 08:46:48 +07:00
parent b201e410a3
commit c09c4045e2
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
19 changed files with 218 additions and 86 deletions

View file

@ -7,9 +7,8 @@ import java.time.format.DateTimeFormatter
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(androidx.plugins.application) id("yokai.android.application")
alias(kotlinx.plugins.android) id("yokai.android.application.compose")
alias(kotlinx.plugins.compose.compiler)
alias(kotlinx.plugins.serialization) alias(kotlinx.plugins.serialization)
alias(kotlinx.plugins.parcelize) alias(kotlinx.plugins.parcelize)
alias(libs.plugins.aboutlibraries) alias(libs.plugins.aboutlibraries)
@ -122,7 +121,6 @@ android {
buildFeatures { buildFeatures {
viewBinding = true viewBinding = true
compose = true
// If you're here because there's not BuildConfig, build the app first, it'll generate it for you // If you're here because there's not BuildConfig, build the app first, it'll generate it for you
buildConfig = true buildConfig = true
@ -284,13 +282,12 @@ tasks {
// "-opt-in=kotlin.Experimental", // "-opt-in=kotlin.Experimental",
"-opt-in=kotlin.RequiresOptIn", "-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlin.ExperimentalStdlibApi", "-opt-in=kotlin.ExperimentalStdlibApi",
"-opt-in=coil3.annotation.ExperimentalCoilApi",
"-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi",
"-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
"-opt-in=androidx.compose.ui.ExperimentalComposeUiApi", "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
"-opt-in=androidx.compose.foundation.ExperimentalFoundationApi", "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
"-opt-in=androidx.compose.animation.ExperimentalAnimationApi", "-opt-in=androidx.compose.animation.ExperimentalAnimationApi",
// "-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi",
"-opt-in=coil3.annotation.ExperimentalCoilApi",
// "-opt-in=com.google.accompanist.permissions.ExperimentalPermissionsApi", // "-opt-in=com.google.accompanist.permissions.ExperimentalPermissionsApi",
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-opt-in=kotlinx.coroutines.FlowPreview", "-opt-in=kotlinx.coroutines.FlowPreview",
@ -298,19 +295,6 @@ tasks {
"-opt-in=kotlinx.coroutines.InternalCoroutinesApi", "-opt-in=kotlinx.coroutines.InternalCoroutinesApi",
"-opt-in=kotlinx.serialization.ExperimentalSerializationApi", "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
) )
if (project.findProperty("tachiyomi.enableComposeCompilerMetrics") == "true") {
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" +
(project.layout.buildDirectory.asFile.orNull?.absolutePath ?: "/tmp/yokai") + "/compose_metrics",
)
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
(project.layout.buildDirectory.asFile.orNull?.absolutePath ?: "/tmp/yokai") + "/compose_metrics",
)
}
} }
// Duplicating Hebrew string assets due to some locale code issues on different devices // Duplicating Hebrew string assets due to some locale code issues on different devices

View file

@ -8,12 +8,6 @@ import java.util.*
plugins { plugins {
alias(libs.plugins.kotlinter) alias(libs.plugins.kotlinter)
alias(libs.plugins.gradle.versions) alias(libs.plugins.gradle.versions)
alias(androidx.plugins.application) apply false
alias(androidx.plugins.library) apply false
alias(kotlinx.plugins.android) apply false
alias(kotlinx.plugins.compose.compiler) apply false
alias(kotlinx.plugins.multiplatform) apply false
alias(kotlinx.plugins.parcelize) apply false
alias(kotlinx.plugins.serialization) apply false alias(kotlinx.plugins.serialization) apply false
alias(libs.plugins.aboutlibraries) apply false alias(libs.plugins.aboutlibraries) apply false
alias(libs.plugins.firebase.crashlytics) apply false alias(libs.plugins.firebase.crashlytics) apply false
@ -22,46 +16,6 @@ plugins {
alias(libs.plugins.sqldelight) apply false alias(libs.plugins.sqldelight) apply false
} }
subprojects {
tasks.withType<KotlinCompile> {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
}
}
tasks.withType<Test> {
useJUnitPlatform()
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}
plugins.withType<BasePlugin> {
configure<BaseExtension> {
compileSdkVersion(AndroidConfig.compileSdk)
ndkVersion = AndroidConfig.ndk
defaultConfig {
minSdk = AndroidConfig.minSdk
targetSdk = AndroidConfig.targetSdk
ndk {
version = AndroidConfig.ndk
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
isCoreLibraryDesugaringEnabled = true
}
dependencies {
add("coreLibraryDesugaring", libs.desugar)
}
}
}
}
tasks.named("dependencyUpdates", com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask::class.java).configure { tasks.named("dependencyUpdates", com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask::class.java).configure {
rejectVersionIf { rejectVersionIf {
val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { candidate.version.uppercase(Locale.ROOT).contains(it) } val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { candidate.version.uppercase(Locale.ROOT).contains(it) }

View file

@ -1,6 +1,21 @@
plugins { plugins {
`kotlin-dsl` `kotlin-dsl`
} }
dependencies {
implementation(androidx.gradle)
implementation(kotlinx.gradle)
implementation(kotlinx.compose.compiler.gradle)
implementation(gradleApi())
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
implementation(files(androidx.javaClass.superclass.protectionDomain.codeSource.location))
implementation(files(compose.javaClass.superclass.protectionDomain.codeSource.location))
implementation(files(kotlinx.javaClass.superclass.protectionDomain.codeSource.location))
}
repositories { repositories {
gradlePluginPortal()
mavenCentral() mavenCentral()
} google()
}

View file

@ -1 +1,18 @@
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
create("androidx") {
from(files("../gradle/androidx.versions.toml"))
}
create("compose") {
from(files("../gradle/compose.versions.toml"))
}
create("kotlinx") {
from(files("../gradle/kotlinx.versions.toml"))
}
}
}
rootProject.name = "yokai-buildSrc" rootProject.name = "yokai-buildSrc"

View file

@ -1,6 +1,9 @@
import org.gradle.api.JavaVersion as GradleJavaVersion
object AndroidConfig { object AndroidConfig {
const val compileSdk = 35 const val COMPILE_SDK = 35
const val minSdk = 23 const val MIN_SDK = 23
const val targetSdk = 35 const val TARGET_SDK = 35
const val ndk = "27.2.12479018" const val NDK = "27.2.12479018"
val JavaVersion = GradleJavaVersion.VERSION_17
} }

View file

@ -0,0 +1,10 @@
import yokai.build.configureCompose
plugins {
id("com.android.application")
kotlin("android")
}
android {
configureCompose(this)
}

View file

@ -0,0 +1,15 @@
import yokai.build.configureAndroid
import yokai.build.configureTest
plugins {
id("com.android.application")
kotlin("android")
}
android {
defaultConfig {
targetSdk = AndroidConfig.TARGET_SDK
}
configureAndroid(this)
configureTest()
}

View file

@ -0,0 +1,9 @@
import yokai.build.configureCompose
plugins {
id("com.android.library")
}
android {
configureCompose(this)
}

View file

@ -0,0 +1,11 @@
import yokai.build.configureAndroid
import yokai.build.configureTest
plugins {
id("com.android.library")
}
android {
configureAndroid(this)
configureTest()
}

View file

@ -1,6 +1,98 @@
package yokai.build package yokai.build
import com.android.build.api.dsl.CommonExtension
import org.gradle.accessors.dm.LibrariesForAndroidx
import org.gradle.accessors.dm.LibrariesForCompose
import org.gradle.accessors.dm.LibrariesForKotlinx
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.kotlin.dsl.the
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.io.File import java.io.File
val Project.androidx get() = the<LibrariesForAndroidx>()
val Project.compose get() = the<LibrariesForCompose>()
val Project.kotlinx get() = the<LibrariesForKotlinx>()
val Project.libs get() = the<LibrariesForLibs>()
val Project.generatedBuildDir: File get() = project.layout.buildDirectory.asFile.get().resolve("generated/yokai") val Project.generatedBuildDir: File get() = project.layout.buildDirectory.asFile.get().resolve("generated/yokai")
internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) {
commonExtension.apply {
compileSdk = AndroidConfig.COMPILE_SDK
defaultConfig {
minSdk = AndroidConfig.MIN_SDK
ndk {
version = AndroidConfig.NDK
}
}
compileOptions {
sourceCompatibility = AndroidConfig.JavaVersion
targetCompatibility = AndroidConfig.JavaVersion
isCoreLibraryDesugaringEnabled = true
}
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = AndroidConfig.JavaVersion.toString()
// freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
// freeCompilerArgs += "-Xcontext-receivers"
// Treat all Kotlin warnings as errors (disabled by default)
// Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties
// val warningsAsErrors: String? by project
// allWarningsAsErrors = warningsAsErrors.toBoolean()
}
}
dependencies {
"coreLibraryDesugaring"(libs.desugar)
}
}
internal fun Project.configureCompose(commonExtension: CommonExtension<*, *, *, *, *, *>) {
pluginManager.apply(kotlinx.plugins.compose.compiler.get().pluginId)
commonExtension.apply {
buildFeatures {
compose = true
}
dependencies {
"implementation"(platform(compose.bom))
}
}
extensions.configure<ComposeCompilerGradlePluginExtension> {
featureFlags.set(setOf(ComposeFeatureFlag.OptimizeNonSkippingGroups))
val enableMetrics = project.providers.gradleProperty("enableComposeCompilerMetrics").orNull.toBoolean()
val enableReports = project.providers.gradleProperty("enableComposeCompilerReports").orNull.toBoolean()
val rootBuildDir = rootProject.layout.buildDirectory.asFile.get()
val relativePath = projectDir.relativeTo(rootDir)
if (enableMetrics) {
rootBuildDir.resolve("compose-metrics").resolve(relativePath).let(metricsDestination::set)
}
if (enableReports) {
rootBuildDir.resolve("compose-reports").resolve(relativePath).let(reportsDestination::set)
}
}
}
internal fun Project.configureTest() {
tasks.withType<Test> {
useJUnitPlatform()
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}
}

View file

@ -1,8 +1,8 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(androidx.plugins.library) id("yokai.android.library")
alias(kotlinx.plugins.multiplatform) kotlin("multiplatform")
alias(kotlinx.plugins.serialization) alias(kotlinx.plugins.serialization)
} }

View file

@ -1,7 +1,7 @@
plugins { plugins {
alias(kotlinx.plugins.multiplatform) id("yokai.android.library")
kotlin("multiplatform")
alias(kotlinx.plugins.serialization) alias(kotlinx.plugins.serialization)
alias(androidx.plugins.library)
alias(libs.plugins.sqldelight) alias(libs.plugins.sqldelight)
} }

View file

@ -1,7 +1,7 @@
plugins { plugins {
alias(kotlinx.plugins.multiplatform) id("yokai.android.library")
kotlin("multiplatform")
alias(kotlinx.plugins.serialization) alias(kotlinx.plugins.serialization)
alias(androidx.plugins.library)
} }
kotlin { kotlin {

View file

@ -4,6 +4,8 @@ agp = "8.7.3"
lifecycle = "2.8.7" lifecycle = "2.8.7"
[libraries] [libraries]
gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" }
activity = { module = "androidx.activity:activity-ktx", version.ref = "activity" } activity = { module = "androidx.activity:activity-ktx", version.ref = "activity" }
activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" } activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" }
annotation = { module = "androidx.annotation:annotation", version = "1.9.1" } annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }

View file

@ -4,6 +4,9 @@ serialization = "1.7.3"
xml_serialization = "0.90.3" xml_serialization = "0.90.3"
[libraries] [libraries]
gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
compose-compiler-gradle = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version = "1.10.1" } coroutines-bom = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-bom", version = "1.10.1" }
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android" } coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android" }
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core" } coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core" }
@ -26,4 +29,4 @@ android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize" }

View file

@ -2,8 +2,8 @@ import yokai.build.generatedBuildDir
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(kotlinx.plugins.multiplatform) id("yokai.android.library")
alias(androidx.plugins.library) kotlin("multiplatform")
alias(libs.plugins.moko) alias(libs.plugins.moko)
} }

View file

@ -1,6 +1,7 @@
plugins { plugins {
alias(androidx.plugins.library) id("yokai.android.library")
alias(kotlinx.plugins.android) id("yokai.android.library.compose")
kotlin("android")
} }
android { android {
@ -12,6 +13,22 @@ android {
} }
} }
kotlin {
compilerOptions {
freeCompilerArgs.addAll(
"-opt-in=androidx.compose.animation.ExperimentalAnimationApi",
"-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi",
"-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
"-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi",
"-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
"-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
"-opt-in=kotlinx.coroutines.FlowPreview",
)
}
}
dependencies { dependencies {
api(libs.material) api(libs.material)
implementation(compose.bundles.compose)
} }

View file

@ -1,9 +1,9 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(androidx.plugins.library) id("yokai.android.library")
alias(kotlinx.plugins.android) id("yokai.android.library.compose")
alias(kotlinx.plugins.compose.compiler) kotlin("android")
} }
android { android {

View file

@ -1,8 +1,8 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
alias(androidx.plugins.library) id("yokai.android.library")
alias(kotlinx.plugins.multiplatform) kotlin("multiplatform")
alias(kotlinx.plugins.serialization) alias(kotlinx.plugins.serialization)
} }