组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试。

先来一张效果图

好像是因为机制原因上传不了动图,所以截图了一个画面

组件化初衷

  • APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。
  • 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。
  • Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。
  • 方便单元测试,改动单独一个业务模块,不需要着重于关注其他模块被影响。

什么是组件化

组件化就是将一个app分成多个Module,如下图,每个Module都是一个组件(也可以是一个基础库供组件依赖),开发的过程中我们可以单独调试部分组件,组件间不需要互相依赖,但可以相互调用,最终发布的时候所有组件以lib的形式被主app工程依赖并打包成一个apk。

组件化优势

  • 组件化就是将通用模块独立出来,统一管理,以提高复用,将页面拆分为粒度更小的组件,组件内部除了包含UI实现,还包含数据层和逻辑层。
  • 每个工程都可以独立编译、加快编译速度,独立打包。
  • 每个工程内部的修改,不会影响其他工程。
  • 业务库工程可以快速拆分出来,集成到其他App中。
  • 迭代频繁的业务模块采用组件方式,业务线研发可以互不干扰、提升协作效率,并控制产品质量,加强稳定性。
  • 并行开发,团队成员只关注自己的开发的小模块,降低耦合性,后期维护方便等。

指导思想

  • 组件拆分:将一个project划分成业务组件、基础组件、路由组件。其中业务组件是相互隔离的,可以单独调试,基础组件提供业务组件所公用的功能,路由组件为业务组件之间通信提供支持。
  • 组件隔离:业务组件之间的隔离,可以单独调试。
  • 核心法则:编译期隔离,运行期按需依赖。

依赖关系

组件化需要考虑的问题

  • 模式切换:如何使得APP在单独调试跟整体调试自由切换
  • 资源冲突:当我们创建了多个Module的时候,如何解决相同资源文件名合并的冲突
  • 依赖关系:多个Module之间如何引用一些共同的library以及工具类
  • 组件通信:组件化之后,Module之间是相互隔离的,如何进行UI跳转以及方法调用
  • 入口参数:我们知道组件之间是有联系的,所以在单独调试的时候如何拿到其它的Module传递过来的参数

组件化后项目结构如下图

理论说了那么多,下面开始撸代码

实现步骤

1、全局设置Gradle,每一个业务Module需要的版本都定义在这里方便后期维护多个Module版本号

ext { // Sdk and tools minSdkVersion = 16 targetSdkVersion = 26 compileSdkVersion = 26 buildToolsVersion = '26.0.2' supportLibraryVersion = '26.1.0' // App dependencies aRouter = '1.2.2' leakcanaryVersion = '1.3' glideVersion = '3.7.0'} ####每个业务Module编译依赖版本 compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion

2、模式切换

组件化后的每一个业务的module都可以是一个单独的APP(isModuleRun=false), release 包的时候各个业务module作为lib依赖,这里完全由一个变量控制,在根项目 gradle.properties里面的 isModuleRun=true。

isModuleRun状态不同,加载application和AndroidManifest都不一样,以此来区分是独立的APK还是lib,

实现方式如下

在build.grade里面配置

if (isModuleRun.toBoolean()) { apply plugin: 'com.android.application'} else { apply plugin: 'com.android.library'}##单Module运行需要配置sourceSets { main { if (isModuleRun.toBoolean()) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' java { //全部Module一起编译的时候剔除debug目录 exclude '**/debug/**' } } } }

3、资源冲突

业务Module和BaseModule资源文件名称重复会产生冲突,解决方案在

每个 module 都有 app_name,为了不让资源名重名,在每个组件的 build.gradle 中增加 resourcePrefix “xxx_强行检查资源名称前缀。

固定每个组件的资源前缀。但是 resourcePrefix 这个值只能限定 xml 里面的资源,并不能限定图片资源。

个人认为约定大于配置,团队内协定好规范,可以避免冲突。

4、组件通讯

组件通讯框架在github上有star最多的有ARouter和ActivityArouter,前者是个人项目,后者是阿里巴巴开源,权衡之下选择阿里的ARouter,

各业务Module之前不需要任何依赖可以通过路由跳转,完美解决业务之间耦合

使用方式如下。

 if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) }

跳转方法

在目标Activity上添加path

@Route(path = ARouterManager.BModuleActivity)public class BModuleActivity extends BaseActivity { @Autowired public String name; @Autowired(name = "age") int age; TextView txt; @Override protected int getLayoutId() { return R.layout.b_module_layout; } @Override protected void initView() { txt = findViewById(R.id.txt); //String name = getIntent().getStringExtra("name"); 也可以这样接受参数 ARouter.getInstance().inject(this); txt.setText("name:" + name + 

android path拆分_Android架构进阶之路:Android 组件化方案探索与思考总结相关推荐

  1. android path拆分_Android知识总结——Path常用方法解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程:Android开发之从零开始系列 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言:开发过程中很容易忘记一些API的使用方法 ...

  2. Android组件化方案及组件消息总线modular-event实战

    背景 组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向.美团内部各个Android开发团队也在尝试和实践不同的组件化方案,并且在组件化通信框架上也有很多高质量的产 ...

  3. Android彻底组件化方案实践

    本文讲的是Android彻底组件化方案实践,一.模块化.组件化与插件化 项目发展到一定程度,随着人员的增多,代码越来越臃肿,这时候就必须进行模块化的拆分.在我看来,模块化是一种指导理念,其核心思想就是 ...

  4. 回归初心:极简 Android 组件化方案 — AppJoint

    Android 组件化的概念大概从两年前开始有人讨论,到目前为止,技术已经慢慢沉淀下来,越来越多团队开源了自己组件化框架.本人所在团队从去年开始调研组件化框架,在了解社区众多组件化方案之后,决定自研组 ...

  5. Android工程师进阶之路 Android开发进阶 从小工到专家 上市啦

    封面 目录1 目录2 - 当当购买链接 - 京东购买链接 为什么写这本书 写这本书的念头由来已久了.也许是从我打算写<Android源码设计模式解析与实战>那时起就萌生了这个念头,因为设计 ...

  6. android 字符串替换_Android开发之旅:android架构

    第一次观看我文章的朋友,可以关注.点赞.转发一下,每天分享各种干货技术和程序猿趣事 目录 1.架构图直观 2.架构详解 2.1.Linux Kernel 2.1.Android Runtime 2.3 ...

  7. android 通知写法_Android架构设计MVP模式第(二)篇,如何减少类爆炸

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LooperJing 链接:https://www.jianshu.com/p/3a17382d44de 声明: ...

  8. android动画帧率_Android动画进阶—使用开源动画库nineoldandroids

    前言 Android系统支持原生动画,这为应用开发者开发绚丽的界面提供了极大的方便,有时候动画是很必要的,当你想做一个滑动的特效的时候,如果苦思冥想都搞不定,那么你可以考虑下动画,说不定动画轻易就搞定 ...

  9. android path 合并_Android合并音频文件

    /** * 需求:将两个amr格式音频文件合并为1个 * 注意:amr格式的头文件为6个字节的长度 * @param partsPaths      各部分路径 * @param unitedFile ...

最新文章

  1. 携程是如何把大数据用于实时风控的
  2. flash中Stage,stage,root和this的区别用法
  3. python装饰器函数执行后日志_Python装饰器使用规范案例详解
  4. 开源公司被云厂商“寄生”,咋整?
  5. 算法导论第三版第十一章11.1-4
  6. MVC应用程序与单选列表
  7. 高德地图10.0版本正式发布,升级为国民出行平台
  8. idea任务栏图标变白色,桌面快捷方式变白色
  9. linux 中etc全拼,英语etc_英语中“等等”缩写成为etc吗要加一点吗全拼是什么谢谢大家_淘题吧...
  10. Java学Web——day09【SQL多表联合查询】
  11. 基于MATLAB颜色的植物虫害检测识别
  12. c语言输入名字判断姓是否缩写,C语言复习笔记
  13. C语言 吃鱼还是吃肉
  14. 巴比特 | 元宇宙每日必读:HTC 宣布推出首款元宇宙手机,售价约2700元人民币,都有哪些新玩法?...
  15. win10如何获得管理员权限
  16. 虚拟试鞋行业分析及首篇论文解读
  17. ManualResetEvent 说明
  18. 汇报工作就使用麦肯锡的结构化思考、SCQA表达框架
  19. DLink_RCE_CVE-2019-17621浅析
  20. java 航班_Java实现简单航班查询系统-Go语言中文社区

热门文章

  1. oracle中pga指什么,oracle中pga内存分配原则
  2. mysql存储过程迭代自己获取所有子孙
  3. 大数据可视化陈为智慧树_智慧树知到_大数据可视化_答案新版
  4. oracle的sql的substr用法,oracle中substr函数的用法(sqlserver right)
  5. php mysql时间倒序,php mysql时间已过去计算
  6. mysql数据库字段字符转数字批量语句_MySQL数据库批量替换指定字段字符串SQL语句命令...
  7. idea 自动生成补全变量名 快捷键
  8. mybatis update 返回值
  9. C# List集合求交集
  10. Android开发笔记(二十五)assets目录下的文件读取