Android plugin如何兼容App插件和library插件

Android插件的开发,在网上有很多资料,如:Android Gradle 插件开发入门指南:https://juejin.cn/post/6887581345384497165,最近由于工作需要,开发了一个jacoco与记录用例执行顺序的插件,整体功能开发没有问题,但是在应用到项目的时候,就出错了。被测试的项目是个多模块的项目,原则上需要对app和libraries都添加插件,不然library中的代码没有插入jacoco的桩,也没有记录用例执行顺序的桩,无法达到目的。但是,在将插件引用到library中时,就会报如下错误:

Transforms with scopes '[SUB_PROJECTS, EXTERNAL_LIBRARIES]' cannot be applied to library projects.

分析了一下,原来是TransformManager中的scopes的问题,具体定义如下:

作用域描述
TransformManager.SCOPE_FULL_PROJECT作用于整个工程,包括当前工程、所有子工程及外部依赖库
TransformManager.PROJECT_ONLY仅作用于当前工程,不包括子工程或外部依赖库
TransformManager.SCOPE_FULL_WITH_FEATURES作用于整个工程以及Dynamic Feature工程
TransformManager.SCOPE_FULL_LIBRARY_WITH_LOCAL_JARS作用于当前工程以及本地依赖库

所以需要对getscope的返回值做兼容,同时在applay函数中,注册transform的操作也要做兼容。

解决方案

1,对getScopes函数做兼容,具体代码如下:

@Override
public Set<? super QualifiedContent.Scope> getScopes() {
    if (project.getPlugins().hasPlugin("com.android.library")) {
        return TransformManager.PROJECT_ONLY;
    } else {
        return TransformManager.SCOPE_FULL_PROJECT;
    }
}

2,对apply函数中添加注册transform的兼容

// Register a task
//优化插件,兼容module相关
if (project.getPlugins().hasPlugin("com.android.library")) {
    //组件
    LibraryExtension lbandroid = project.getExtensions().findByType(LibraryExtension.class);
    assert lbandroid != null;
    lbandroid.registerTransform(this);
    System.out.println("组件引用插件!");
} else {
    AppExtension android = project.getExtensions().findByType(AppExtension.class);
    assert android != null;
    android.registerTransform(this);
    System.out.println("应用引用插件!");
}

通过这两个地方的兼容处理,就可以保证插件在app插件和library插件中同时使用,经过Demo测试没有问题。

转自:https://zhuanlan.zhihu.com/p/700253254

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值