不管项目架构是组件化、模块化等,我们一般都会把一些基础库放在一个单独工程B中,通过maven或是打包aar的方式集成到主工程项目A中。然而当解决问题需要添加Log日志或是修改基础库时,我们只能在B中进行修改,通过maven或是打包aar集成到A中进行验证。如果验证还有问题,重复操作。
这个时候我们就会想如果直接依赖基础库源码的话就很方便,验证成功之后再上传maven或是打包aar。这篇文档为了记录动态切换本地源码依赖与maven依赖,也就是通过变量控制是否依赖基础库源码还是依赖aar包。
集成配置
源码依赖使用gradle提供的Composing builds功能,通过includeBuild进行集成,使用substitute特性用源码替换maven依赖。
在主工程A目录下创建文件composingConfig.gradle,内容如下:
说明:testlibrary为基础库工程B中对应的基础库moudle。
ext {
composing_dependencies = [
composing_library = [
/** 是否本地依赖*/
isLocal : false,
/** 基础库工程的路径*/
projectPath : "../B",
/** 基础库工程中基础库对应Moudle名称*/
projectName : ":testlibrary",
/** 基础库工程中基础库的maven地址 */
projectMaven : "x.x.x:testlibraryMaven"
]
]
}
在主工程A的settings.gradle文件中引入composingConfig.gradle,使用includeBuild进行配置集成,内容如下:
// 引入composing的设置
apply from: "composingConfig.gradle"
// 遍历composing_dependencies中的所有配置
ext.getProperty("composing_dependencies").each { projectConfig ->
// 如果是本地依赖
if (projectConfig["isLocal"]){
// 使用本地依赖进行替换
includeBuild(projectConfig["projectPath"]) {
dependencySubstitution {
substitute module(projectConfig["projectMaven"]) with project(projectConfig["projectName"])
}
}
}
}
以上配置就实现了通过修改isLocal这个变量值动态控制是本地源码依赖还是maven依赖。
点击sync同步工程发现一系列错误。
解决sync后遇到的问题
sync后会遇到各种各样的问题,这个时候只需要根据提示信息一个一个解决就好,以下是我当时遇到的一些问题。
gradle版本问题
A工程和B工程使用相同的gradle版本,且版本大于等于4.10.1。因为4.10.1之后才能使用以上配置。
直接在gradle-wrapper.properties中进行版本修改。
tools.build版本问题
A工程和B工程的com.android.tools.build:gradle:x使用相同版本。
依赖重复问题
具体需要看具体项目,比如rxjava版本的依赖重复问题,解决方法如下:
使用exclude进行修改。
具体参考 https://blog.csdn.net/jdsjlzx/article/details/97940958
参考
https://juejin.cn/post/6887745699636035598
https://juejin.cn/post/7165144080769351716