Skill v1.0.1
currentAutomated scan100/100~1 modified
version: "1.0.1" name: Android构建逻辑 description: Expert guidance on setting up scalable Gradle build logic using Convention Plugins and Version Catalogs.
Android Gradle Build Logic & Convention Plugins
This skill helps you configure a scalable, maintainable build system for Android apps using Gradle Convention Plugins and Version Catalogs, following the "Now in Android" (NiA) architecture.
Goal
Stop copy-pasting code between build.gradle.kts files. Centralize build logic (Compose setup, Kotlin options, Hilt, etc.) in reusable plugins.
Project Structure
Ensure your project has a build-logic directory included in settings.gradle.kts as a composite build.
root/├── build-logic/│ ├── convention/│ │ ├── src/main/kotlin/│ │ │ └── AndroidApplicationConventionPlugin.kt│ │ └── build.gradle.kts│ ├── build.gradle.kts│ └── settings.gradle.kts├── gradle/│ └── libs.versions.toml├── app/│ └── build.gradle.kts└── settings.gradle.kts
Step 1: Configure settings.gradle.kts
Include the build-logic as a plugin management source.
// settings.gradle.ktspluginManagement {includeBuild("build-logic")repositories {google()mavenCentral()gradlePluginPortal()}}dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}}
Step 2: Define Dependencies in libs.versions.toml
Use the Version Catalog for both libraries and plugins.
[versions]androidGradlePlugin = "8.2.0"kotlin = "1.9.20"[libraries]# ...[plugins]android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }# Define your own plugins herenowinandroid-android-application = { id = "nowinandroid.android.application", version = "unspecified" }
Step 3: Create a Convention Plugin
Inside build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt:
import com.android.build.api.dsl.ApplicationExtensionimport org.gradle.api.Pluginimport org.gradle.api.Projectimport org.gradle.kotlin.dsl.configureclass AndroidApplicationConventionPlugin : Plugin<Project> {override fun apply(target: Project) {with(target) {with(pluginManager) {apply("com.android.application")apply("org.jetbrains.kotlin.android")}extensions.configure<ApplicationExtension> {defaultConfig.targetSdk = 34// Configure common options here}}}}
Don't forget to register it in build-logic/convention/build.gradle.kts:
gradlePlugin {plugins {register("androidApplication") {id = "nowinandroid.android.application"implementationClass = "AndroidApplicationConventionPlugin"}}}
Usage
Apply your custom plugin in your modules (e.g., app/build.gradle.kts):
plugins {alias(libs.plugins.nowinandroid.android.application)}
This drastically cleans up module-level build files.