前言
下载代码-----》码云下载
下载代码-----》github下载
本篇是Android最新的依赖架构设计,gradle版本要8.0以上,代码实现基于8.5.1。好多年开发过程中,我们碰到config.gradle,buildSrc,composing builds等依赖编译管理,目的在对引入库依赖可以统一版本,做到组件化(业务拆分可单独编译),模块化(功能库拆分解耦复用),单独编译测试业务组件打包apk。
直接说这次Catalogs依赖构建带来什么好处,gradle8后完全可用kotlin进行脚本kts的编写,gradle脚本直接用kotlin写,版本统一依赖。以简化插件代码方式插入各个库的build.gradle,精简写法,自由限制引入库。一次写完业务库后,就不需要再改代码也可以独立运行apk。
依赖构建目的
- 统一修改相关sdk依赖的版本号
- 统一 自动添加Library/module的依赖库,不需要写太多重复的脚本代码
- 依赖结构清晰,coreLib包括所有功能模块,apkBuild包括所有独立编译的业务组件,不需要修改代码去达到独立编译apk,容易出错
- 组件间可自由通信,这里没用外部sdk,因为组件通信 其实就是接口数据的回调,要明白后其实写法很简单,就少了类似Arouter的IProvider的拦截等,可关注coreLib/bridge
- 各个组件可完成内部的Application创建时的sdk初始化,统一监听所有Activity的生命周期,埋点逻辑等,关注ModuleInitDelegate
- 现阶段比Groovy的编译期构建耗时少,多少大项目打包几分钟的o(╥﹏╥)o
下为项目目录架构
构建的插件库
整个catalogs的重要逻辑在buildSrc插件库,但是不需要在其他module显式的引入buildSrc,这是跟之前composingbuild的很大不同,更简单,内部实现插件代码类DefaultGradlePlugin.kt,只要库的build.gradle显示的引入该类就完成所有脚本代码的复用。苦groovy的升级语法很久了,用kotlin有多爽,不需要每次升级就不能执行task,各种报错。Dependencies类用函数的方式拆分和聚合相关的依赖库,升级版本号巨简单。
代码实例
登录跳转ExampleFragment,ToolsActivity
clickFilter(R.id.btnLogin) {
btnLogin.text = "click"
//调用另外Tools组件的api显示
val url = "https://malloss.gree.com/gree-mall-v2/cc06e180c9004c85acd309128d18ff81.jpg"
ModuleFactory.instance.getToolService()?.showMedia(url, this)
delayTask {
// DRouter.build(RoutePath.TOOLS_PLAY).start()
DRouter.build(RoutePath.TOOLS_PLAY)
.setActivityResultLauncher(launcher)
.start()
}
}
clickFilter(R.id.btnEx) {
DRouter.build( RoutePath.TOOLS_EX)//"didi://router"
.putExtra("ex", "333")
// .putExtra(
// Extend.START_ACTIVITY_FLAGS,
// Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
// )
.start(LoginPhoneActivity@ this, object : RouterCallback {
override fun onResult(result: Result) {
result.fragment?.let {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container_view, it)
.commit()
}
}
})
}
private val launcher =
registerForActivityResult(object : ActivityResultContract<Intent, String?>() {
override fun createIntent(context: Context, input: Intent): Intent {
val bundle = Bundle()
bundle.putString("key", "China")
input.putExtra("data", bundle)
return input
}
override fun parseResult(resultCode: Int, intent: Intent?): String {
if (null == intent) {
return ""
} else {
if (resultCode == Activity.RESULT_OK) {
val data = intent.getBundleExtra("back")
val result = data?.getString("key")
return result!!
}
}
return "null"
}
},
object : ActivityResultCallback<String?> {
override fun onActivityResult(result: String?) {
printD("out>$result")
}
})
/**
* @author by jason-何伟杰,2024/10/18
* des:壳 模块app 不应存在任何代码类,只提供个上下文管理
* apps上线集成要引用init{}的代码
*/
class CBApp : CoreApplicationProvider() {
init {
ModuleInitDelegate.register(ModuleInitLogin(), ModuleInitTools())
}
}
独立编译apk
大项目有上几十个libs,module几十个,单单把这些library的名字显示一屏幕都不够,所有我对他们在外包了文件夹coreLib和apkBuild,创建module时依然右键根项目,再拖动module到文件夹,然后去修改 settings.gradle文件对应的include路径。代码里除了壳app,还有业务组件登录apk-login,工具组件 apk-tools,有3个可独立编译,因为apk-login创建后移动过路径,那么点击run configuration删除错误路径下的编译项就行。
关注点
这里用的滴滴的路由库,阿里的Arouter早就停止维护了,组件化很重要就是路由库,不能因为gradle的升级就无法使用,这里滴滴一直更新我用着两年都没啥问题,它也支持组件通信拦截等功能。
里面很多依赖库都是很新的版本号,我在外网github比较多,国内的开发者基本都是低版本代码跑到底,最近360插件库更新支持7.4了,很久没更o(╥﹏╥)o,真的是3年不开张,开张吃3年。
最后
本文总结了Catalogs的Android依赖管理方式,提供源码自行学习,有好的意见提出来,我也是不停地总结探索,找适合自己的开发模式,我不太喜欢依赖注入和牛油刀,全是注解,把布局文件都打乱了。
码云下载
github下载