最近利用业余时间,开发了一款基于懂球帝接口数据的足球资讯app,整体的UI也是仿照懂球帝设计的。这是一个比较综合的项目,用到了不少以前没用过的组件和api,而且产生了很多新的开发思路,有些实现方式也是自己琢磨的,所以值得做一些记录,可能还存在瑕疵和可以优化的地方,也希望大家给我多指正。
项目主要采用的是模块组件化的架构。
组件化或者说模块化实现业务分离一直是项目研发与管理的大势所趋,所以本项目虽然是由我个人开发的,但是也采取了组件化的方式,一是方便项目管理,二是作为对组件化的学习。
箭头所指为引用库
App壳工程:没有实际开发业务,主要负责程序的打包,gradle配置等工作;
module_main:主要负责引导页、主页面,作为程序的主入口;
module_news/module_match/module_circle/module_rank:根据不同业务需求,独立成不同的组件;
lib_common:所有公用的组件库、所需权限、全局通用的Application等;
项目的目录结构:
在实际的开发过程中,开发人员根据任务划分,构建自己的业务组件。开发时将自己的组件切换为application进行开发、调试等工作,我们这里称之为组件工程模式;开发完成后,将各个业务组件切换为library,调试、运行app,我们这里称之为组件集成模式;
1、组件工程模式和集成模式的切换
通过在build.gradle中设置 apply plugin: 'com.android.application'和apply plugin: 'com.android.library',可以实现将组件作为主工程或者库来使用;为了方便切换,我们可以在gradle.properties中添加相应的标志位,通过标志位进行切换:
moduleNewsAsMain=false
if(moduleNewsAsMain.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
如果将moduleNewsAsMain设置为true,就将module_news这个业务组件作为主工程来运行;反之,则作为库供引用者调用;
2、AndroidManifest切换
当开发者开发、调试某个组件时,一定会设置组件内的LauncherActivity和Application;当切换回集成模式之后,每个组件都存在自己独立的manifest文件设置和Application,众所周知,一个项目只允许有一个manifest文件和Application,为了解决这个冲突,我们需要在组件工程中设置两个不同的manifest文件位置。根据不同模式切换manifest;
在build.gradle设置:
sourceSets {
main {
if (moduleNewsAsMain.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成开发模式下排除debug文件夹中的所有Java文件
java{
exclude 'debug/**'
}
}
}
}
3、第三方库管理
每个模块在开发过程中都会需要引入第三方库,为了避免引入重复的库,我们需要将第三方库进行统一管理。
在项目的根目录下新建一个gradle类型的文件,可以命名为versions.gradle:
ext {
android = [
compileSdkVersion: 28
]
dependencies = [
'recyclerview': 'androidx.recyclerview:recyclerview:1.0.0'
]
}
在组件的build.gradle中引用相应的库:
implementation rootProject.ext.dependencies["recyclerview"]
项目基本搭建完成了,还要考虑一个问题,在开发过程中,有可能遇到模块间的Activity需要相互跳转的情况,我们可以采用组件库引用的方式来实现,不过这样会存在第三方库重复引用的问题,最重要的一点是,我们使用模块化这种思路不就是希望模块之间尽可能的独立吗?这种方式显然没有意义。因此,我们这里需要引入路由了。
本项目使用的是阿里的路由框架——Arouter,这里就不介绍Arouter有什么优点了,直接单刀直入,介绍一下如何在项目中使用它。
1、配置Arouter:
1.1、首先在versions.gradle中引入Arouter库:
'arouter': 'com.alibaba:arouter-api:1.4.0'
1.2、在lib_common的build.gradle下声明该库:
api rootProject.ext.dependencies["arouter"]
1.3、在Project下的build.gradle—>buildscript—>dependencies下添加:
classpath "com.alibaba:arouter-register:1.0.2"
1.4、在每一个业务组件的build.gradle中添加annotationProcessor:
annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
1.5、在Application中初始化Arouter:
ARouter.init(mApplication);
至此,Arouter的配置工作就完成了;
2、使用Arouter实现界面跳转(假定由A界面跳转到B界面)
2.1、设置路由:在B界面中添加Route(path="/xx/xx")注解,声明路由的路径;
2.2、跳转:在A界面中添加ARouter.getInstance().build("/xx/xx").navigation();
2.3、带参数跳转:在A界面中添加ARouter.getInstance().build("/xx/xx").withString("key", value).navigation();
ARouter.getInstance().build("/xx/xx").withSerializable("key", value).navigation();
同时,在B界面中也需要对接收的参数进行注解,并且在onCreate()中inject Arouter
本篇文章主要总结了自己是如何一步步构建组件化项目的。相比于单一工程的项目,组件化项目可以进一步的降低程序的耦合度;提高了单组件下程序调试、编译的速度;以组件为单位划分业务模块,使得代码结构更加清晰,方便项目后期的迭代与维护;上述的这种组件化结构只是我个人通过网络、实践摸索出的,可能还存在一些问题,希望大家看完之后能多多提出宝贵意见~