android组件化方案详解
背景
Android组件化的背景主要来源于大型项目开发和维护过程中遇到的问题,以及技术与业务发展的需求。以下是更详细的背景说明:
1. 项目规模增大
随着业务功能的增加,Android项目变得越来越复杂:
- 代码量庞大:单体架构项目中,所有功能代码集中在一个模块内,难以管理。
- 代码耦合严重:功能模块之间相互依赖,导致修改某一部分功能可能引发全局性问题。
- 编译速度缓慢:代码量的增长直接影响编译时间,大大降低开发效率。
2. 团队协作复杂
在一个大型项目中,团队往往由多个开发人员甚至多个小组组成:
- 协作效率低:多人协作时,单体架构容易导致资源冲突(如文件、命名等)。
- 分工不明确:团队间的职责界限不清晰,功能开发可能相互干扰。
- 合并冲突频繁:代码提交与合并时的冲突处理消耗了大量时间。
3. 业务需求变化频繁
随着互联网产品快速迭代的需求:
- 快速上线的压力:新功能需要快速开发和上线,但单体架构使开发效率受到限制。
- 模块独立需求:某些功能(如支付、登录等)需要独立开发、测试和发布,单体架构难以满足这些要求。
4. 模块复用需求
对于一些大型企业来说,同一团队可能同时开发多个应用:
- 功能复用:登录、支付、消息推送等功能模块需要跨项目复用。
- 减少重复开发:模块化设计能够将通用功能抽离为独立组件,提高开发效率。
5. 持续集成与动态加载
随着技术的发展,对应用构建与交付的要求提高:
- 持续集成(CI/CD):模块化可以加速单个模块的构建和测试,降低整个项目的编译成本。
- 动态加载与按需更新:Google Play 的动态功能模块(Dynamic Feature Module)允许按需加载部分功能,组件化是实现这一特性的基础。
组件化与模块化的关系
模块化: 组件化和模块化是可以绑定存在,我们在构建组件化架构的时候,可以顺便构建模块化,如下图的library_***都是一个特定的单元工具或者是一个功能模块,例如一个升级工具,扫码工具或者是登陆模块等。创建方法也很简单。Android Studio左上角File—>New—>New Moudle—>按需选择,这里的moudle有多种分类,工具例如一个升级或者扫码等类似功能可以选择Android library,项目独立功能模块例如登陆/购物车则选择phone&Table 等等,如下图。
引用模块的方法如下:在对应的moudle添加上需要用到的模块路径即可
组件化和模块化的关系:模块化是独立一个功能出来,可供多个项目使用,而组件化是让这个功能成为一个app,独立调试运行。
组件化
组件化是从模块化的延伸。
moudle根据id的不同,有两种存在的方式如下图显示。
如何可以让moudle独立调试,只需要根基一下步骤执行即可:
步骤一:添加变量
项目的 gradle.properties 文件中添加 isModule = false;
步骤二:更换moudle类型
在对应moudle的 build.gradle 中更换moudle类型
if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
步骤三:根据步骤一的变量更换 applicationId
在对应moudle的 build.gradle 中的 defaultConfig {} 添加
if (isModule.toBoolean()) {
// 独立调试时添加 applicationId ,集成调试时移除
applicationId "com.hotata.login"
}
步骤四:根据步骤一的变量更换 AndroidManifest
sourceSets {
main {
// 独立调试与集成调试时使用不同的 AndroidManifest.xml 文件
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/moduleManifest/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
jniLibs.srcDirs = ['libs']
}
}
如下图新建AndroidManifest,在isModule=true的情况下,则使用路径为’src/main/moduleManifest/AndroidManifest.xml’的AndroidManifest。
‘src/main/moduleManifest/AndroidManifest.xml’
‘src/main/AndroidManifest.xml’
两者区别在于是否需要指定application以及启动activity。
组件化在模块之间使用路由跳转
如何实现不同moudle之间的跳转,我们常使用的有阿里的ARouter、美团的WMRouter。以下主要介绍阿里巴巴开源工具ARouter的使用。
git地址:链接: https://github.com/alibaba/ARouter
步骤一:导入依赖:
1.在项目的Base模块中导入依赖
api com.alibaba:arouter-api:1.4.1
annotationProcessor com.alibaba:arouter-compiler:1.2.1
2.再分别在使用到模块中添加以下依赖
annotationProcessor com.alibaba:arouter-compiler:1.2.1
以及在defaultConfig {} 中添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
步骤二:初始化
//在application中初始化ARouter
if (BuildConfig.isDebug){
ARouter.openLog();
ARouter.openDebug();
//需要在init之前配置才有效
}
ARouter.init(Application.this);
步骤三:定义对应的跳转的路径。
路径严格要求格式:/…/… 例如:/app/activity
并用标签@Route注解,如下图:
@Route(path = “/app/activity”)
public class MainActivity extends BaseActivity<IBaseView, MainPresenter> {
...
}
步骤四:跳转。
ARouter.getInstance().build(“/app/activity”).navigation();
//也可以携带参数或用uri跳转
Uri uri = Uri.parse(”/app/activity“);
ARouter.getInstance()
.build(uri)
// .build(“/app/activity”)
.withInt("key1", 100)
.withString("key2", "ARouter跳转传递的字符串")
.navigation();