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测试没有问题。