对老项目进行组件化改造的几点思考与踩坑

背景

老项目是单一架构,所有的功能都在一个工程里,后期很不好维护,所以对老项目进行组件化改造,关于组件化,我之前写过一篇文章,android组件化开发和总结,写的比较久了,推荐另一篇文章,Android组件化开发,组件化实现的细节写的很清楚。经过几天的改造,踩了不少坑,也有了些想法,记录一下

禁忌

先说一下项目开发中的禁忌,绝对绝对不要在工具类中包含业务逻辑。很简单,举个例子,在工具类中写了主要的业务逻辑,如果有一天,要把工具类抽出来,作为公用的,非常麻烦,就像主工程引用一个jar包,jar包里又包含主工程逻辑,怎么拆分?

基本原则

改造的基本原则,就是解耦,把工具类作为最底层,然后各组件都引用工具类,各组件直接相互隔离,通过arouter通信,最后根据需要,合并到主项目,各组件可移植到其他项目,可以根据需求自由组合功能模块。

老项目的坑

因为项目比较急,老项目为了快速开发,基于网易云信im的demo,在上边加入自己的功能。现在需要重构,发现工具类里都有业务逻辑,试着把业务逻辑抽取出来,十分困难。现在想到的方法就是,A工具类中包含业务逻辑,新建一个类,继承A类,把涉及到业务逻辑的方法,单独抽出来,放在新类中,新类作为组件的方法,将工具类与业务逻辑剥离。其实这个也不算完全解耦,还有有一部分跟工具类绑定,现在是网易云信,万一后边换个腾讯的im,可能还要重写,并不像随便替换一个sdk那么简单

坑1

组件引用模块过程中,报这个错误

Unable to resolve dependency for
 ':Common@compileOptionsUnitTest/compileClasspath':
  Could not resolve project :okhttputils.   

这种错误,是因为library中的buildTypes {}与组件中的不一致
okhttputil配置
在这里插入图片描述
组件的配置
在这里插入图片描述

okhttputils修改后配置
在这里插入图片描述

问题解决:Unable to resolve dependency for ‘:app@common/compileClasspath’: Could not resolve project :XXX

坑2

刚开始,想把一些依赖包,比如butterknife,arouter放在common library,其他library依赖common,发现不行,每个library还得依赖这些包,只能把这些包放在一个配置里

 dependencies=[
            supportV7:'com.android.support:appcompat-v7:26.1.0',
            constraintLayout:'com.android.support.constraint:constraint-layout:1.1.3',
            arouterApi : 'com.alibaba:arouter-api:1.5.1',
            arouterCompiler:'com.alibaba:arouter-compiler:1.5.1',
            butterknife:'com.jakewharton:butterknife:10.2.3',
            butterknifeCompiler:'com.jakewharton:butterknife-compiler:10.2.3'
    ]

其他library引用

 implementation rootProject.ext.dependencies.arouterApi
    annotationProcessor rootProject.ext.dependencies.arouterCompiler

对这个问题的补充,为什么会出现common library中已经有依赖,其他引用common library的组件还要重新引用,问题就出在implementation ,这个修改成api就可以了,被api依赖的项,相当于直接和依赖他的moudle合成了一个moudle。
implementation和api的区别

坑3

Android Butterknife在library模块中的使用问题。
Butterknife在application和library模式下,是两种配置,application模式需要使用R来访问资源,library需要使用R2来进行访问资源,虽然这两种模式可以自由切换,但是现在还没找到自动修改R2和R1的方法,需要手动修改,如果少的话还行,多的话简直是个地狱。所以,如果真需要使用组件化,建议别使用Butterknife,可以使用替代品,比如viewbinding
Android Butterknife在library模块中的使用问题
github
解决组件化使用ButterKnife在Module中的坑
补充:如果一个module,引用的底层library不包含butterknife的使用,有的话可以写成 toolbarTitle = findViewById(R.id.toolbar_title);,这样,这个Module,不管library还是application模式,可以直接使用R2,不需要切换成R
在这里插入图片描述

坑4

引用aar文件,出现

Derect local .aar file dependencies are not supported when building an AAR.

需要这样引用

compileOnly files('aar-sdk/nim_ysfkit_8.2.0.aar')

坑5

如果报这个错误

Manifest merger failed with multiple errors, see logs

可以在android studio Terminal命令行输入

gradlew processDebugManifest --stacktrace

进行查看详细

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值