关于Gradle插件及Android Build Gradle

544 阅读2分钟

Gradle插件

Gradle的插件根据是否内置又分为核心插件和社区插件,核心插件是Gradle必要的插件(如java插件),核心插件随着Gradle安装已经解析好了,只需要应用即可;社区插件是共享在社区上的插件,在需要时才被解析到本地。

社区插件会被共享在一些在线仓库中,例如jcenter、Maven仓库等,Gradle还提供了一个专门共享Gradle插件的仓库:Gradle plugin portal,Gradle官方推荐将插件共享在这里。

核心插件可以在下图的gralde-kotlin-dsl-extensions中看到

image.png

核心插件一般可以像下面这样写,其实也是kotlin扩展PluginDependenciesSpec而来的, 这样写之后,跳转到实现就会到上图的源码实现中。

plugins {
    `java-gradle-plugin`
    java
}

上面核心插件一般实现在如下库中

image.png

社区插件比如下面的就是发布到社区插件的

plugins {
    kotlin("android")
}

有时候看到这种写法不知道什么意思,它其实就是一个PluginDependenciesSpec的扩展函数,我们在Android Studio中查看源码时会跳转到KotlinDependencyExtensionsKt.class中,但是找不到其源码文件,是因为该文件其实是编译时动态生成的,所以找不到源码。

下面为通过StackOverflow找到的具体源码实现

/**
* Applies the given Kotlin plugin [module].
* For example: `plugins { kotlin("jvm") version "$embeddedKotlinVersion" }` 
* Visit the [plugin portal](https://plugins.gradle.org/search?term=org.jetbrains.kotlin) to see the list of available plugins. 
* @param module simple name of the Kotlin Gradle plugin module, for example "jvm", "android", "kapt", "plugin.allopen" etc...
*/
fun PluginDependenciesSpec.kotlin(module: String): PluginDependencySpec =  
id("org.jetbrains.kotlin.${'$'}module")

通过源码发现,其实没有什么特别的,就是扩展封装了包了一层,和普通的id应用plugin没有区别,还有其他plugin也可以通过插件社区找到,下图为kotlin android插件在插件社区的说明。当然我们还可以搜到“kapt”,“jvm”等

image.png

Android Build Gradle

plugins {
    id("com.android.application")
}

com.android.application为android build gradle(AGP)提供的gradle插件,也就是我们传统开发classpath中设置的AGP,它除了提供com.android.application还提供下图的com.android.library等插件。

dependencies {
    classpath("com.android.tools.build:gradle:7.2.0")
}

image.png

以com.android.application为例,通过下面com.android.application.properties文件的描述我们可以看到它的实现代码为AppPlugin

implementation-class=com.android.build.gradle.AppPlugin

上面代码怎么看呢,也就是android build gradle的源码怎么看呢,通过下面代码依赖AGP最终即可在External Libraries中查看到AGP的源码,也就能查看到有哪些plugin及其实现。

dependencies {
    implementation(gradleApi())
    implementation("com.android.tools.build:gradle:7.2.0")
}

参考:

juejin.cn/post/697496…

blog.csdn.net/LiMubai_CN/…

plugins.gradle.org/search?term…

stackoverflow.com/questions/7…