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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值