Android 自定义Gradle插件(五):在自定义插件中添加其他插件

754 阅读2分钟

在上一篇文章中提到,最近项目中需要接入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")
        }
    }
}

尝试结果: image.png

根据错误信息我尝试调整了一下:

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代码块并没有执行。

企业微信截图_ba6fe9dd-d481-456a-92db-15029cc61791.png

小结

因为我对于gradle编译的生命周期其实并没有那么熟悉,在成功方案的基础之上做的优化尝试以失败告终,幸好还是有成功方案的。 之后如果有时间,熟悉了gradle编译的生命周期之后会再对成功方案优化进行尝试。