Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c98a987
commit e7d7f22
Showing
25 changed files
with
4,036 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
#### 目录介绍 | ||
- 01.为何组件化 | ||
- 02.现阶段遇到的问题 | ||
|
||
|
||
|
||
|
||
### 好消息 | ||
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢! | ||
- **链接地址:https://github.com/yangchong211/YCBlogs** | ||
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变! | ||
|
||
|
||
|
||
|
||
### 01.为何组件化 | ||
- APP迭代维护成本增高 | ||
- 投资界,新芽,项目工厂等APP自身在飞速发展,版本不断迭代,新功能不断增加,业务模块数量不断增加,业务上的处理逻辑越变越复杂,同时每个模块代码也变得越来越多,这就引发一个问题,所维护的代码成本越来越高,稍微一改动可能就牵一发而动全身,改个小的功能点就需要回归整个APP测试,这就对开发和维护带来很大的挑战。 | ||
- 多人组合需要组件化 | ||
- APP 架构方式是单一工程模式,业务规模扩大,随之带来的是团队规模扩大,那就涉及到多人协作问题,每个移动端软件开发人员势必要熟悉如此之多代码,如果不按照一定的模块组件机制去划分,将很难进行多人协作开发,随着单一项目变大,而且Andorid项目在编译代码方面就会变得非常卡顿,在单一工程代码耦合严重,每修改一处代码后都需要重新编译打包测试,导致非常耗时。 | ||
|
||
|
||
|
||
### 02.现阶段遇到的问题 | ||
- 结合投资界,新芽客户端分析 | ||
- 代码量膨胀,不利于维护,不利于新功能的开发。项目工程构建速度慢,在一些电脑上写两句代码,重新编译整个项目,测试的话编译速度起码 10-20 分钟,有的甚至更长。 | ||
- 不同模块之间代码耦合严重,有时候修改一处代码而牵动许多模块。每个模块之间都有引用第三方库,但有些第三方库版本不一致,导致打包APP时候代码冗余,容易引起版本冲突。 | ||
- 现有项目基于以前其他人项目基础上开发,经手的人次过多,存在着不同的代码风格,项目中代码规范乱,类似的功能写法却不一样,导致不统一。 | ||
|
||
|
||
|
||
|
||
|
||
|
||
### 其他介绍 | ||
#### 01.关于博客汇总链接 | ||
- 1.[技术博客汇总](https://www.jianshu.com/p/614cb839182c) | ||
- 2.[开源项目汇总](https://blog.csdn.net/m0_37700275/article/details/80863574) | ||
- 3.[生活博客汇总](https://blog.csdn.net/m0_37700275/article/details/79832978) | ||
- 4.[喜马拉雅音频汇总](https://www.jianshu.com/p/f665de16d1eb) | ||
- 5.[其他汇总](https://www.jianshu.com/p/53017c3fc75d) | ||
|
||
|
||
|
||
#### 02.关于我的博客 | ||
- github:https://github.com/yangchong211 | ||
- 知乎:https://www.zhihu.com/people/yczbj/activities | ||
- 简书:http://www.jianshu.com/u/b7b2c6ed9284 | ||
- csdn:http://my.csdn.net/m0_37700275 | ||
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/ | ||
- 开源中国:https://my.oschina.net/zbj1618/blog | ||
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1 | ||
- 邮箱:yangchong211@163.com | ||
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV | ||
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles | ||
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#### 目录介绍 | ||
- 01.什么是组件化 | ||
- 02.区分模块化与组件化 | ||
- 03.组件化优势好处 | ||
- 04.区分组件化和插件化 | ||
- 05.application和library | ||
- 06.注意第三方sdk拆分问题 | ||
|
||
|
||
|
||
### 好消息 | ||
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢! | ||
- **链接地址:https://github.com/yangchong211/YCBlogs** | ||
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变! | ||
|
||
|
||
|
||
### 01.什么是组件化 | ||
- 什么是组件化呢? | ||
- 组件(Component)是对数据和方法的简单封装,功能单一,高内聚,并且是业务能划分的最小粒度。 | ||
- 组件化是基于组件可重用的目的上,将一个大的软件系统按照分离关注点的形式,拆分成多个独立的组件,使得整个软件系统也做到电路板一样,是单个或多个组件元件组装起来,哪个组件坏了,整个系统可继续运行,而不出现崩溃或不正常现象,做到更少的耦合和更高的内聚。 | ||
|
||
|
||
### 02.区分模块化与组件化 | ||
- 模块化 | ||
- 模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容,模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块等等。 | ||
- 组件化 | ||
- 组件化就是更关注可复用性,更注重关注点分离,如果从集合角度来看的话,可以说往往一个模块包含了一个或多个组件,或者说模块是一个容器,由组件组装而成。简单来说,组件化相比模块化粒度更小,两者的本质思想都是一致的,都是把大往小的方向拆分,都是为了复用和解耦,只不过模块化更加侧重于业务功能的划分,偏向于复用,组件化更加侧重于单一功能的内聚,偏向于解耦。 | ||
|
||
|
||
|
||
### 03.组件化优势好处 | ||
- 简单来说就是提高工作效率,解放生产力,好处如下: | ||
- 1.提高编译速度,从而提高并行开发效率。 | ||
- 问题:那么如何提高编译速度的呢?组件化框架可以使模块单独编译调试,可以有效地减少编译的时间。 | ||
- 2.稳定的公共模块采用依赖库方式 | ||
- 提供给各个业务线使用,减少重复开发和维护工作量。代码简洁,冗余量少,维护方便,易扩展新功能。 | ||
- 3.每个组件有自己独立的版本,可以独立编译、测试、打包和部署。 | ||
- 针对开发程序员多的公司,组件化很有必要,每个人负责自己的模块,可以较少提交代码冲突。 | ||
- 为新业务随时集成提供了基础,所有业务可上可下,灵活多变。 | ||
- 各业务线研发可以互不干扰、提升协作效率,并控制产品质量。 | ||
- 4.避免模块之间的交叉依赖,做到低耦合、高内聚。 | ||
- 5.引用的第三方库代码统一管理,避免版本统一,减少引入冗余库。 | ||
- 这个可以创建一个公共的gradle管理的文件,比如一个项目有十几个组件,想要改下某个库或者版本号,总不至于一个个修改吧。这个时候提取公共十分有必要 | ||
- 6.定制项目可按需加载,组件之间可以灵活组建,快速生成不同类型的定制产品。 | ||
|
||
|
||
|
||
### 04.区分组件化和插件化 | ||
- 组件化和插件化的区别 | ||
- 组件化不是插件化,插件化是在【运行时】,而组件化是在【编译时】。换句话说,插件化是基于多APK的,而组件化本质上还是只有一个 APK。 | ||
- 组件化和插件化的最大区别(应该也是唯一区别)就是组件化在运行时不具备动态添加和修改组件的功能,但是插件化是可以的。 | ||
- 组件化的目标 | ||
- 组件化的目标之一就是降低整体工程(app)与组件的依赖关系,缺少任何一个组件都是可以存在并正常运行的。app主工程具有和组件进行绑定和解绑的功能。 | ||
|
||
|
||
### 05.application和library | ||
- 在studio中,对两种module进行区分,如下所示 | ||
- 一种是基础库library,比如常见第三方库都是lib,这些代码被其他组件直接引用。 | ||
- 另一种是application,也称之为Component,这种module是一个完整的功能模块。比如分享module就是一个Component。 | ||
- 为了方便,统一把library称之为依赖库,而把Component称之为组件,下面所讲的组件化也主要是针对Component这种类型。 | ||
- 在项目的build.gradle文件中 | ||
``` | ||
//控制组件模式和集成模式 | ||
if (rootProject.ext.isDouBanApplication) { | ||
//是Component,可以独立运行 | ||
apply plugin: 'com.android.application' | ||
} else { | ||
//是lib,被依赖 | ||
apply plugin: 'com.android.library' | ||
} | ||
``` | ||
|
||
|
||
### 06.注意第三方sdk拆分问题 | ||
- 看了很多博客,几乎没有博客说出在拆分业务组件时,遇到第三方sdk集成的问题。比如:当你的app可以使用微信登陆,在app主工程时,登陆是正常的,这个时候你是通过主工程app的包名去微信开放平台申请id和key值。但是当你将登陆注册拆分出独立的业务组件时,则该组件的包名是跟app主工程包名不一样的,那么这个时候,如果切换成组件模式则第三方登陆就有可能出现问题。 | ||
- 也就是说,你使用某些第三方sdk时,当初用app的包名去申请得到key值[这个值是根据包名生成的],然后当你拆分业务组件时,自然组件包名和app包名不一样,那么当切换成组件application可以独立运行时,则可能会出现bug,由包名导致的问题。个人建议,涉及到第三方sdk拆分,可以封装成lib被依赖即可,或者你刻意把包名弄成一样的。 | ||
|
||
|
||
|
||
|
||
|
||
### 其他介绍 | ||
#### 01.关于博客汇总链接 | ||
- 1.[技术博客汇总](https://www.jianshu.com/p/614cb839182c) | ||
- 2.[开源项目汇总](https://blog.csdn.net/m0_37700275/article/details/80863574) | ||
- 3.[生活博客汇总](https://blog.csdn.net/m0_37700275/article/details/79832978) | ||
- 4.[喜马拉雅音频汇总](https://www.jianshu.com/p/f665de16d1eb) | ||
- 5.[其他汇总](https://www.jianshu.com/p/53017c3fc75d) | ||
|
||
|
||
|
||
#### 02.关于我的博客 | ||
- github:https://github.com/yangchong211 | ||
- 知乎:https://www.zhihu.com/people/yczbj/activities | ||
- 简书:http://www.jianshu.com/u/b7b2c6ed9284 | ||
- csdn:http://my.csdn.net/m0_37700275 | ||
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/ | ||
- 开源中国:https://my.oschina.net/zbj1618/blog | ||
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1 | ||
- 邮箱:yangchong211@163.com | ||
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV | ||
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles | ||
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
#### 目录介绍 | ||
- 01.传统APP架构图 | ||
- 02.组件化需要考虑问题 | ||
- 03.组件化架构图 | ||
- 04.组件通信是通过路由转发 | ||
- 05.业务组件的生命周期 | ||
|
||
|
||
|
||
|
||
### 好消息 | ||
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢! | ||
- **链接地址:https://github.com/yangchong211/YCBlogs** | ||
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变! | ||
|
||
|
||
|
||
|
||
### 01.传统APP架构图 | ||
- 传统APP架构图 | ||
- 如图所示,从网上摘来的…… | ||
- ![image](http://upload-images.jianshu.io/upload_images/4432347-1047b1cdf15fd59a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) | ||
- 存在的问题 | ||
- 普遍使用的 Android APP 技术架构,往往是在一个界面中存在大量的业务逻辑,而业务逻辑中充斥着各种网络请求、数据操作等行为,整个项目中也没有模块的概念,只有简单的以业务逻辑划分的文件夹,并且业务之间也是直接相互调用、高度耦合在一起的。单一工程模型下的业务关系,总的来说就是:你中有我,我中有你,相互依赖,无法分离。如下图: | ||
- ![image](https://upload-images.jianshu.io/upload_images/4432347-ab213414e69fef5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) | ||
|
||
|
||
|
||
### 02.组件化需要考虑问题 | ||
- 考虑的问题 | ||
- 分而治之,并行开发,一切皆组件。要实现组件化,无论采用什么样的技术方式,需要考虑以下七个方面问题: | ||
- 代码解耦。 | ||
- 如何将一个庞大的工程分成有机的整体?这个需要一步步来了! | ||
- 对已存在的项目进行模块拆分,模块分为两种类型,一种是功能组件模块,封装一些公共的方法服务等,作为依赖库对外提供;另一种是业务组件模块,专门处理业务逻辑等功能,这些业务组件模块最终负责组装APP。 | ||
- 组件单独运行。 | ||
- 因为每个组件都是高度内聚的,是一个完整的整体,如何让其单独运行和调试? | ||
- 通过 Gradle脚本配置方式,进行不同环境切换,我自己操作是添加一个boolean值的开关。比如只需要把 Apply plugin: 'com.android.library' 切换成Apply plugin: 'com.android.application' 就可以独立运行呢! | ||
- 需要注意:当切换到application独立运行时,需要在AndroidManifest清单文件上进行设置,因为一个单独调试需要有一个入口的Activity。 | ||
- 组件间通信。 | ||
- 由于每个组件具体实现细节都互相不了解,但每个组件都需要给其他调用方提供服务,那么主项目与组件、组件与组件之间如何通信就变成关键? | ||
- 这个我是直接用阿里开源的路由框架,当然你可以根据需要选择其他大厂的开源路由库。引用阿里的ARouter框架,通过注解方式进行页面跳转。 | ||
- 组件生命周期。 | ||
- 这里的生命周期指的是组件在应用中存在的时间,组件是否可以做到按需、动态使用、因此就会涉及到组件加载、卸载等管理问题。 | ||
- 集成调试。 | ||
- 在开发阶段如何做到按需编译组件?一次调试中可能有一两个组件参与集成,这样编译时间就会大大降低,提高开发效率。 | ||
- 代码隔离。 | ||
- 组件之间的交互如果还是直接引用的话,那么组件之间根本没有做到解耦,如何从根本上避免组件之间的直接引用?目前做法是主项目和业务组件都会依赖公共基础组件库,业务组件通过路由服务依赖库按需进行查找,用于不同组件之间的通信。 | ||
- 告别结构臃肿,让各个业务变得相对独立,业务组件在组件模式下可以独立开发,而在集成模式下又可以变为AAR包集成到“APP壳工程”中,组成一个完整功能的 APP。 | ||
|
||
|
||
|
||
|
||
### 03.组件化架构图 | ||
- 组件化架构图 | ||
- 业务组件之间是独立的,互相没有关联,这些业务组件在集成模式下是一个个 Library,被 APP 壳工程所依赖,组成一个具有完整业务功能的 APP 应用,但是在组件开发模式下,业务组件又变成了一个个Application,它们可以独立开发和调试,由于在组件开发模式下,业务组件们的代码量相比于完整的项目差了很远,因此在运行时可以显著减少编译时间。 | ||
- ![image](https://upload-images.jianshu.io/upload_images/4432347-7b3a2c6d4a583e05.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) | ||
|
||
|
||
|
||
### 04.组件通信是通过路由转发 | ||
- 传统以前工程下模块 | ||
- 记得刚开始进入Android开发工作时,只有一个app主工程,后期几乎所有的需求都写在这个app主工程里面。只有简单的以业务逻辑划分的文件夹,并且业务之间也是直接相互调用、高度耦合在一起的。 | ||
- 导致后期改项目为组件化的时候十分痛苦,不同模块之间的业务逻辑实在关联太多,但还是没办法,于是目录4步骤一步步实践。终极目标是,告别结构臃肿,让各个业务变得相对独立,业务组件在组件模式下可以独立开发。 | ||
- 组件化模式下如何通信 | ||
- 这是组件化工程模型下的业务关系,业务之间将不再直接引用和依赖,而是通过“路由”这样一个中转站间接产生联系。在这个开源项目中,我使用的阿里开源的路由框架。关于Arouter基础使用和代码分析,可以看我这篇博客:[Arouter使用与代码解析](https://github.com/yangchong211/YCBlogs) | ||
- ![image](https://upload-images.jianshu.io/upload_images/4432347-b68c6a71b703765a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) | ||
|
||
|
||
|
||
|
||
### 05.业务组件的生命周期 | ||
- 按照理想状态的来看待的话 | ||
- 各个业务组件之间没有任何依赖关系,这时我们可以把每个独立的业务组件看成一个可运行的app,所以业务组件的生命周期和应与独立的app保持一致。 | ||
|
||
|
||
|
||
|
||
|
||
|
||
### 其他介绍 | ||
#### 01.关于博客汇总链接 | ||
- 1.[技术博客汇总](https://www.jianshu.com/p/614cb839182c) | ||
- 2.[开源项目汇总](https://blog.csdn.net/m0_37700275/article/details/80863574) | ||
- 3.[生活博客汇总](https://blog.csdn.net/m0_37700275/article/details/79832978) | ||
- 4.[喜马拉雅音频汇总](https://www.jianshu.com/p/f665de16d1eb) | ||
- 5.[其他汇总](https://www.jianshu.com/p/53017c3fc75d) | ||
|
||
|
||
|
||
#### 02.关于我的博客 | ||
- github:https://github.com/yangchong211 | ||
- 知乎:https://www.zhihu.com/people/yczbj/activities | ||
- 简书:http://www.jianshu.com/u/b7b2c6ed9284 | ||
- csdn:http://my.csdn.net/m0_37700275 | ||
- 喜马拉雅听书:http://www.ximalaya.com/zhubo/71989305/ | ||
- 开源中国:https://my.oschina.net/zbj1618/blog | ||
- 泡在网上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1 | ||
- 邮箱:yangchong211@163.com | ||
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV | ||
- segmentfault头条:https://segmentfault.com/u/xiangjianyu/articles | ||
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e | ||
|
||
|
||
|
Oops, something went wrong.