Android组件化实现
为什么需要组件化?
组件化顾名思义就是将代码按功能或者业务划分成一个个组件,小的项目一般不需要,只有当项目大到一定程度,代码量足够多的时候我们就需要用到组件化。组件化总体来说有下面几个收益点:
代码隔离:不同的功能收敛到不同的组件里,对一个功能(组件)的修改不会影响到另一个组件,减少开发中误伤别人或者被别人误伤的概率
提高开发效率:隔离开来,每个组件可以单独运行调试,不至于你的一个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组件化实现相关推荐
- 业务逻辑组件化android,AppJoint 极简 Android 组件化方案
AppJoint 极简 Android 组件化方案.仅包含 3 个注解加 1 个 API,超低学习成本,支持渐进式组件化. 开始接入 在项目根目录的 build.gradle 文件中添加 AppJoi ...
- Android组件化打造知乎日报系列(一)—— 项目架构搭建
Android组件化打造第三方知乎日报系列(一)-- 项目架构搭建 本节完整代码可以前往github查看,项目地址:github.com/N0tExpectEr- Android组件化打造知乎日报系列 ...
- 为何需要Android组件化,如何搭建?
为什么需要android组件化? 因为,一个项目(APP)里面有很多功能模块啊,有些功能模块完全可以提出来公用.例如:网络请求(登录.注册).图片处理(压缩.点击)等. 张华洋老师博客说的很多:And ...
- android组件化开发视频教程,教你打造一个Android组件化开发框架
作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...
- 【Android 组件化】路由组件 ( 页面跳转参数依赖注入 )
文章目录 一.参数自动注入 二.自定义注解 三.使用 @Extra 自定义注解 四.注解处理器解析 @Extra 自定义注解 并生成相应 Activity 对应代码 五.博客资源 组件化系列博客 : ...
- 【Android 组件化】路由组件 ( 路由框架概述 )
文章目录 一.路由框架概述 二.路由框架整体流程 三.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 Gradle 实现组件化 ( Gradl ...
- 【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )
文章目录 一.Root 表作用 二.生成 Root 表 三.完整注解处理器代码 及 生成的 Java 代码 ( 仅供参考 ) 1.注解处理器代码 2.app 模块中的注解类生成的 Java 源码 3. ...
- 【Android 组件化】路由组件 ( 组件间共享的服务 )
文章目录 一.组件间共享的服务 二.注解处理器添加对上述 " 组件间共享的服务 " 的支持 三.注解处理器 生成代码规则 四.完整注解处理器代码 及 生成的 Java 代码 1.注 ...
- 【Android 组件化】路由组件 ( 注解处理器调试 )
文章目录 一.添加断点 二.获取调试选项 三.创建 Gradle 调试任务 四.开始调试 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Android 组件化]使用 ...
- 【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
文章目录 一.要生成的路由表类 二.生成 路由表 过程 1.获取其它类节点 2.生成参数 3.路由表结构 4.函数创建 5.Java 类创建 6.写出 Java 源码到文件中 三.完整注解处理器及运行 ...
最新文章
- Know about Oracle RAC Heartbeat
- XILINX资源获取
- 使用 Optional 摆脱 NullPointException 的折磨
- BinaryReader 、BinaryWriter是方便用二进制方式读写int,double,string之类的数据
- 关于Dev-C++的安装以及基本使用方法
- html边缘取消白边,Photoshop巧用边缘蒙版去除锐化后的白边
- 面部识别 vs 情绪状态,你还能守住自己的秘密吗?
- 二流学校的计算机博士,“二流大学”的博士,值得读吗?想的尴尬症都犯了
- Perl脚本使用小总结
- PHP 图片无损压缩
- HBuilderX 快捷键
- Button点击事件的五种写法
- 第四章:字处理软件Word 2010——知识点整理
- Unity刘海屏幕适配
- 【Android 自定义控件】2.画布的基础使用
- drill down roll up
- java.lang.Math中次方与开次方
- 软件工程实践 2017 第一次作业
- html5图片垂直居中
- Dynamics CRM 知识库设置
热门文章
- 回收站清空数据恢复的方法
- 智慧住建工程项目监管数字化管理解决方案
- html背景对联效果-恭喜新禧,web前端开发 —— 一个对联效果
- 关于vue中proxyTable原理及配置
- Excel如何简单快速在行上输入ABC序列?
- 远程桌面出现身份验证错误,要求的函数不受支持 (win10 远程连接)
- 登录远程出现身份验证错误要求函数不受支持
- php如何开启电脑前置摄像头像素高的手机,oppo Reno有前置摄像头吗 自拍开启使用方法介绍...
- 设计营销之交互设计营销
- typora 公式对齐_快速上手丨Typora 中使用Markdown