为什么需要组件化?

组件化顾名思义就是将代码按功能或者业务划分成一个个组件,小的项目一般不需要,只有当项目大到一定程度,代码量足够多的时候我们就需要用到组件化。组件化总体来说有下面几个收益点:

  • 代码隔离:不同的功能收敛到不同的组件里,对一个功能(组件)的修改不会影响到另一个组件,减少开发中误伤别人或者被别人误伤的概率

  • 提高开发效率:隔离开来,每个组件可以单独运行调试,不至于你的一个bug影响我几天

  • 提高协作效率:代码划分清晰,人员自然也可以清晰划分,每个组件有对应的owner,没有三不管地带;每个组件只暴露自己需要对外暴露的方法,其他组件不需理解该组件的具体实现,需要就调用就好

  • 可复用性:对于一些通用的功能抽象成一个组件,便于复用

怎样组件化?

将不同功能的代码收敛到各自独立的module,做好代码隔离,A业务不能直接引用到B业务module里的代码,也就限制了B的改动会对A造成的影响。module之间的依赖关系分层级,顶层依赖底层,底层不能依赖顶层,这样可以让顶层的改动影响限制在自己module,其他顶层module因为没有引用到改动的module所以不会受影响。

如图,不同的组件已经划分成不同的module,代码层面已经完全隔离开了,就是说组件A不能直接引用到组件B,这时候,如果A要用到B的能力,要么让整个组件A依赖组件B,implementation project(':B'),但是如果B又要用到A的能力,又依赖A,继续implementation project(':A'),那这两个组件互相依赖,A的改动会影响到B,B的改动也会影响A,跟我们原来的预期背道而驰。所以我们需要一个通信框架,组件只暴露必要的方法供其他组件调用,且组件间不能互相依赖。

A功能拆成两个组件,A-api表示A组件对外暴露的能力,这里只写接口;A-impl作为A组件能力的实现,代码逻辑写在这里;实现一个base组件,impl层依赖base层,base层依赖api层,base里面通过反射创建和缓存impl的实例,存储一个servicemap,key为接口,value为对应反射创建的impl(service实例),其他的B、C组件同理,这样A,B,C等组件不会互相依赖,但都可以通过依赖base,通过接口方法调用到对应的组件能力。比如A要用到B的能力,可以拿到B-api的接口,到base层取对应的实例,base层通过反射创建B-impl里对接口的实现并缓存起来,返回给A,这样,A就可以调用到B-api里暴露的方法。

中转组件base和反射创建是去除双向依赖的关键。

可以看到,只要维护好各个组件间的依赖关系,可以做到,对顶层组件的修改不会影响到其他组件,对底层组件的修改只影响依赖它的组件。

代码划分清晰,人员协作清晰,这就是组件化带来的效果。

Q&&A

组件化后如何独立调试?

独立调试本质上就是你的组件不再是一个library,而是一个application。

想要灵活切换可以在gradle.properties配置变量,build.gradle判断变量去执行不同逻辑

核心改动点:

  • 切换library为application:在build.gradle修改apply plugin: 'com.android.library'为apply plugin: 'com.android.application',可判断变量动态切换

  • 配置入口activity:application是需要入口activity的,需要在AndroidManifest.xml配置好,可判断变量再根据sourceset指定不同的AndroidManifest.xml

  • 配置application信息:因为已经作为一个application了,需要配置android{}块里的applicationId、compileSdkVersion等

sync后你会发现你的组件已经被Android studio识别为app了,选择后点击运行即可

Android组件化实现相关推荐

  1. 业务逻辑组件化android,AppJoint 极简 Android 组件化方案

    AppJoint 极简 Android 组件化方案.仅包含 3 个注解加 1 个 API,超低学习成本,支持渐进式组件化. 开始接入 在项目根目录的 build.gradle 文件中添加 AppJoi ...

  2. Android组件化打造知乎日报系列(一)—— 项目架构搭建

    Android组件化打造第三方知乎日报系列(一)-- 项目架构搭建 本节完整代码可以前往github查看,项目地址:github.com/N0tExpectEr- Android组件化打造知乎日报系列 ...

  3. 为何需要Android组件化,如何搭建?

    为什么需要android组件化? 因为,一个项目(APP)里面有很多功能模块啊,有些功能模块完全可以提出来公用.例如:网络请求(登录.注册).图片处理(压缩.点击)等. 张华洋老师博客说的很多:And ...

  4. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  5. 【Android 组件化】路由组件 ( 页面跳转参数依赖注入 )

    文章目录 一.参数自动注入 二.自定义注解 三.使用 @Extra 自定义注解 四.注解处理器解析 @Extra 自定义注解 并生成相应 Activity 对应代码 五.博客资源 组件化系列博客 : ...

  6. 【Android 组件化】路由组件 ( 路由框架概述 )

    文章目录 一.路由框架概述 二.路由框架整体流程 三.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 Gradle 实现组件化 ( Gradl ...

  7. 【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )

    文章目录 一.Root 表作用 二.生成 Root 表 三.完整注解处理器代码 及 生成的 Java 代码 ( 仅供参考 ) 1.注解处理器代码 2.app 模块中的注解类生成的 Java 源码 3. ...

  8. 【Android 组件化】路由组件 ( 组件间共享的服务 )

    文章目录 一.组件间共享的服务 二.注解处理器添加对上述 " 组件间共享的服务 " 的支持 三.注解处理器 生成代码规则 四.完整注解处理器代码 及 生成的 Java 代码 1.注 ...

  9. 【Android 组件化】路由组件 ( 注解处理器调试 )

    文章目录 一.添加断点 二.获取调试选项 三.创建 Gradle 调试任务 四.开始调试 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 ...

  10. 【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )

    文章目录 一.要生成的路由表类 二.生成 路由表 过程 1.获取其它类节点 2.生成参数 3.路由表结构 4.函数创建 5.Java 类创建 6.写出 Java 源码到文件中 三.完整注解处理器及运行 ...

最新文章

  1. Know about Oracle RAC Heartbeat
  2. XILINX资源获取
  3. 使用 Optional 摆脱 NullPointException 的折磨
  4. BinaryReader 、BinaryWriter是方便用二进制方式读写int,double,string之类的数据
  5. 关于Dev-C++的安装以及基本使用方法
  6. html边缘取消白边,Photoshop巧用边缘蒙版去除锐化后的白边
  7. 面部识别 vs 情绪状态,你还能守住自己的秘密吗?
  8. 二流学校的计算机博士,“二流大学”的博士,值得读吗?想的尴尬症都犯了
  9. Perl脚本使用小总结
  10. PHP 图片无损压缩
  11. HBuilderX 快捷键
  12. Button点击事件的五种写法
  13. 第四章:字处理软件Word 2010——知识点整理
  14. Unity刘海屏幕适配
  15. 【Android 自定义控件】2.画布的基础使用
  16. drill down roll up
  17. java.lang.Math中次方与开次方
  18. 软件工程实践 2017 第一次作业
  19. html5图片垂直居中
  20. Dynamics CRM 知识库设置

热门文章

  1. 回收站清空数据恢复的方法
  2. 智慧住建工程项目监管数字化管理解决方案
  3. html背景对联效果-恭喜新禧,web前端开发 —— 一个对联效果
  4. 关于vue中proxyTable原理及配置
  5. Excel如何简单快速在行上输入ABC序列?
  6. 远程桌面出现身份验证错误,要求的函数不受支持 (win10 远程连接)
  7. 登录远程出现身份验证错误要求函数不受支持
  8. php如何开启电脑前置摄像头像素高的手机,oppo Reno有前置摄像头吗 自拍开启使用方法介绍...
  9. 设计营销之交互设计营销
  10. typora 公式对齐_快速上手丨Typora 中使用Markdown