在上一篇文章中提到,最近项目中需要接入google分析,接入google分析需要在项目中添加google-services
插件。
项目是对外提供的SDK,已经让用户集成了我们自定义的插件,出于减少用户额外操作的目的,决定试试看能不能在自定义插件中集成google-services
插件。
项目中插件集成
以google-services
插件为例,常规集成插件需要在项目下的build.gradle中加入google-services
插件的classpath:
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath('com.android.tools.build:gradle:4.1.3')
//google-services插件
classpath('com.google.gms:google-services:4.3.10')
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
并且需要在app moudle下 build.gradle的顶部添加插件:
apply plugin: 'com.google.gms.google-services'
android {
}
dependencies {
}
在自定义插件中集成
由项目中插件集成可知,集成插件需要指定classpath,并apply插件。那么在自定义插件中该如何做呢。
成功方案
在插件项目的build.gradle中添加google-services
插件依赖:
plugins {
id 'groovy'
}
dependencies {
implementation(gradleApi())
implementation("com.android.tools.build:gradle:4.1.3")
//google-services插件
implementation("com.google.gms:google-services:4.3.10")
}
在自定义插件中通过project获取到的PluginManager来添加google-services
插件
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.afterEvaluate {
PluginManager manager = project.getPluginManager()
manager.apply("com.google.gms.google-services")
}
}
}
方案优化尝试
上面的成功方案已经可以实现我需要的功能,但是当需要更新google-services
插件的版本时,我的自定义插件就必须发布新的版本。
之前的Android 自定义Gradle插件(三):动态添加依赖文章中,我们通过project.dependencies
动态添加了依赖。这给了我一些灵感。
我们可以试试通过project.buildscript.dependencies
来添加classpath。
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.afterEvaluate {
//通过rootProject来获取根项目,并添加依赖
project.rootProject.buildscript.dependencies {
classpath("com.google.gms:google-services:4.3.10")
}
PluginManager manager = project.getPluginManager()
manager.apply("com.google.gms.google-services")
}
}
}
尝试结果:
根据错误信息我尝试调整了一下:
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.rootProject.afterEvaluate {
project.rootProject.buildscript.dependencies {
classpath 'com.google.gms:google-services:4.3.10'
}
}
project.afterEvaluate {
PluginManager manager = project.getPluginManager()
manager.apply("com.google.gms.google-services")
}
}
}
尝试结果:
project.rootProject.afterEvaluate代码块并没有执行。
小结
因为我对于gradle编译的生命周期其实并没有那么熟悉,在成功方案的基础之上做的优化尝试以失败告终,幸好还是有成功方案的。 之后如果有时间,熟悉了gradle编译的生命周期之后会再对成功方案优化进行尝试。