天天看点

Android组件化框架项目详解简介难点

项目发展到一定阶段时,随着需求的增加以及频繁地变更,项目会越来越大,代码变得越来越臃肿,耦合会越来越多,开发效率也会降低,这个时候我们就需要对旧项目进行重构即模块的拆分,官方的说法就是组件化。

那么,采用组件化能带来什么好处呢?主要有以下两点:

1、现在Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,一般都需要编译5到6分钟。Android Studio 推出 instant run 由于各种缺陷和限制条件(比如采用热修复tinker)一般情况下是被关闭的。而组件化框架可以使模块单独编译调试,可以有效地减少编译的时间。

2、通过组件化可以更好的进行并行开发,因为我们可以为每一个模块进行单独的版本控制,甚至每一个模块的负责人可以选择自己的设计架构而不影响其他模块的开发,与此同时组件化还可以避免模块之间的交叉依赖,每一个模块的开发人员可以对自己的模块进行独立测试,独立编译和运行,甚至可以实现单独的部署。从而极大的提高了并行开发效率。

来看组件化一个简单的例子,图例如下:

Android组件化框架项目详解简介难点
Android组件化框架项目详解简介难点
Android组件化框架项目详解简介难点

对于Android中常用的基类库,主要包括开发常用的一些框架。

1、网络请求(多任务下载和上传,采用 Retrofit+RxJava 框架)

2、图片加载(策略模式,Glide 与 Picasso 之间可以切换)

3、通信机制(RxBus)

4、基类 adapter 的封装(支持 item动画、多布局item、下拉和加载更多、item点击事件)

5、基类 RecyclerView 的封装(支持原生风格的下拉加载,item侧滑等)

6、mvp 框架

7、各组件的数据库实体类

8、通用的工具类

9、自定义view(包括对话框,ToolBar布局,圆形图片等view的自定义)

10、dagger 的封装(用于初始化全局的变量和网络请求等配置)

11、其他等等

music组件 下的 build.gradle 文件,其他组件类似。

为了区分集成模式和组件模式,我们使用isAlone变量来控制。

1、首先需要在 config.gradle 文件中设置 isAlone = false。形如:

2、然后 Sync 下。

3、最后选择 app 运行即可。

1、首先需要在 config.gradle 文件中设置 isAlone = true

3、最后相应的模块(new、chat、live、music、app)进行运行即可。

config.gradle 文件的配置情况如下:

首先,初始化所有的数据信息。

然后在设置每个 item 的点击事件时,启动组件界面跳转。

每个组件入口界面的设置(比如直播 Live 组件,其它组件类似)。

我们通过判断组件处于哪种模式来动态设置项目res资源和Manifest、以及代码的位置。以直播组件为例,其它组件类似。

Android组件化框架项目详解简介难点

作为一个组件模块后,再来看一下直播组件的 build.gradle 文件对代码资源等位置的配置。

采用类似于 Glide 在 Manifest 初始化配置的方式来初始化各个组件的 Application,下面以直播组件为例来完成初始化,其它类似。

在 BaseApplication 中,初始化 ApplicationDelegate 代理类。

ApplicationDelegate 内部是怎样的呢,看一段源码。

组件 Manifest 中 application 的全局配置如下:

ManifestParser 会对其中 value 为 IModuleConfig 的 meta-data 进行解析,并通过反射生成实例。

这样通过以上步骤就可以在 Manifest 文件中配置自己组件的 Application,用于初始化组件内的数据,比如在直播组件中初始化 Dagger注解 的全局配置。

由于每个组件的 BaseUrl 和网络配置等可能不一样,所以每个组件可以在自己配置的 dagger 中的 MainConponent 实现自己的网络请求和拦截器。以直播为例,部分代码内容如下:

MainComponent:

MainModule部分代码:

在项目中使用组件化,可能会遇到很多问题,下面将问题罗列如下:

官方说法是在每个 module 的 build.gradle 文件中配置资源文件名前缀。

这种方法缺点就是,所有的资源名必须要以指定的字符串(moudle_prefix)做前缀,否则会异常报错,而且这方法只限定xml里面的资源,对图片资源并不起作用,所以图片资源仍然需要手动去修改资源名。所以不是很推荐使用这种方法来解决资源名冲突。所以只能自己注意点,在创建资源的时候,尽量不让其重复。例如:

虽然 Butterknife 支持在 lib 中使用,但是条件是用 R2 代替 R ,在组件模式和集成模式的切换中,R2<->R 之间的切换是无法完成转换的,切换一次要改动全身,是非常麻烦的!所以不推荐在组件化中使用 Butterknife。

相信这个问题,大家在平时的开发中都会遇到,所以我们需要将多余的包给排除出去。可以参考如下的配置:

<a href="https://github.com/HelloChenJinJun/TestChat">聊天模块</a>

优秀项目参考:

MVPArms

<a href="https://github.com/JessYanCoding/MVPArms">https://github.com/JessYanCoding/MVPArms</a>

全民直播

<a href="https://github.com/jenly1314/KingTV">https://github.com/jenly1314/KingTV</a>

音乐项目

<a href="https://github.com/hefuyicoder/ListenerMusicPlayer">https://github.com/hefuyicoder/ListenerMusicPlayer</a>

<a href="https://github.com/aa112901/remusic">https://github.com/aa112901/remusic</a>

大象:PHPHub客户端

<a href="https://github.com/Freelander/Elephant">https://github.com/Freelander/Elephant</a>

MvpApp

<a href="https://github.com/Rukey7/MvpApp">https://github.com/Rukey7/MvpApp</a>

CloudReader

<a href="https://github.com/youlookwhat/CloudReader">https://github.com/youlookwhat/CloudReader</a>