All Downloads are FREE. Search and download functionalities are using the official Maven repository.

un.conventions.1.0.source-code.AbsAndroidConfig.kt Maven / Gradle / Ivy

import com.android.build.gradle.BasePlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.plugins.PluginManager
import org.gradle.kotlin.dsl.DependencyHandlerScope
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import wing.AndroidCommonExtension
import wing.AndroidComponentsExtensions
import wing.androidExtensionComponent
import wing.log
import wing.vlibs


/**
 *
 * 学习如何使用 agp api
 * https://github.com/android/gradle-recipes/tree/agp-8.4
 *
 * https://developer.android.google.cn/build/extend-agp?hl=zh-cn#variant-api-artifacts-tasks
 *
 * https://docs.gradle.org/current/userguide/writing_plugins.html
 *
 * https://medium.com/androiddevelopers/gradle-and-agp-build-apis-taking-your-plugin-to-the-next-step-95e7bd1cd4c9
 *
 * https://medium.com/androiddevelopers/new-apis-in-the-android-gradle-plugin-f5325742e614
 *
 */
open class AbsAndroidConfig : Plugin {

    /**
     * ```kotlin
     *     override fun pluginConfigs(): PluginManager.() -> Unit = {
     *         //有需要的话执行父类逻辑
     *         super.pluginConfigs().invoke(this)
     *         //执行自己的逻辑
     *         apply("kotlin-android")
     *     }
     * ```
     */
    open fun pluginConfigs(): PluginManager.() -> Unit = {}

    /**
     * ```kotlin
     *     override fun androidExtensionConfig(): AndroidExtension.(Project, VersionCatalog) -> Unit {
     *         return { project, versionCatalog ->
     *             //有需要的话执行父类逻辑
     *             super.androidExtensionConfig().invoke(this,project,versionCatalog)
     *             //自己特有的逻辑
     *         }
     *     }
     * ```
     */
    open fun androidExtensionConfig(): AndroidCommonExtension.(Project, VersionCatalog) -> Unit = { project, versionCatalog -> }

    open fun androidComponentsExtensionConfig(): AndroidComponentsExtensions.(Project, VersionCatalog) -> Unit = { _, _ -> }


    open fun kotlinOptionsConfig(): KotlinCommonToolOptions.(Project) -> Unit = { project -> }

    /**
     * ```kotlin
     *     override fun dependenciesConfig(): DependencyHandlerScope.(VersionCatalog) -> Unit = { vlibs: VersionCatalog ->
     *         //有需要的话执行父类逻辑
     *         super.dependenciesConfig().invoke(this, vlibs)
     *         //自己特有的逻辑
     *     }
     * ```
     */
    open fun dependenciesConfig(): DependencyHandlerScope.(VersionCatalog) -> Unit = { versionCatalog -> }

    override fun apply(target: Project) {
        // Registers a callback on the application of the Android Application plugin.
        // This allows the CustomPlugin to work whether it's applied before or after
        // the Android Application plugin.
        target.plugins.withType(BasePlugin::class.java) {
            //application or library
            with(target) {
                log("=========================== START【${this@AbsAndroidConfig}】 =========================")
                log("常见构建自定义的即用配方,展示如何使用Android Gradle插件的公共API和DSL:")
                log("https://github.com/android/gradle-recipes")
                with(pluginManager) {
                    pluginConfigs()()
                }
                val catalog = vlibs
                androidExtensionComponent?.apply {
                    finalizeDsl { android ->
                        with(android) {
                            androidExtensionConfig()(target, catalog)
                        }
                    }
                    androidComponentsExtensionConfig()(target, catalog)
                }
                tasks.withType().configureEach {
                    kotlinOptions {
                        kotlinOptionsConfig()(target)
                    }
                }
                dependencies {
                    dependenciesConfig()(catalog)
                }
                log("=========================== END【${this@AbsAndroidConfig}】 =========================")
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy