Android组件化、模块化、Catalogs

前言

下载代码-----》码云下载
下载代码-----》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

下为项目目录架构
project

构建的插件库

整个catalogs的重要逻辑在buildSrc插件库,但是不需要在其他module显式的引入buildSrc,这是跟之前composingbuild的很大不同,更简单,内部实现插件代码类DefaultGradlePlugin.kt,只要库的build.gradle显示的引入该类就完成所有脚本代码的复用。苦groovy的升级语法很久了,用kotlin有多爽,不需要每次升级就不能执行task,各种报错。Dependencies类用函数的方式拆分和聚合相关的依赖库,升级版本号巨简单。
yilai

代码实例

登录跳转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下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值