好久没写博客了,最近一直在写新项目。这两天基本上把该完成的都完成的差不多了。
正好新项目用到了很多以前没有用过的技术,在此总结一下。

本文我们先来说一下一下模块化。模块化很早就有了,网上也有很多例子。讲的都非常好,我这里也只是把自己在实际使用的情况做一下记录。

因为本来公司项目是多个角色多种任务都在一个App中的。结果等我快完成的差不多的时候,老大说了,要拆开,每个角色单独拆成一个App。
我都快写完了你告诉要拆开?

需求分析(模块划分)


首先我们来分析一下,这个项目实际上是有4个角色,每个角色的任务是不同的,但是像登录,注册,图片上传,消息推送,导航等一些逻辑是基本上一模一样的。也就是说其实只有任务模块是不同的,其他模块的逻辑基本类似。
如果我按照以前的写法,所有的逻辑都是在app模块中的。如果拆成4个App的话,也就是意味着我要复制4分代码,然后没分代码都改一下。这么做实在是有些不合适。
那既然是只有任务模块区分较大,其他模块逻辑基本一样,那么,更好的办法就是把一些业务单独的作为module,然后项目直接依赖就可以了。
于是,我们可以根据业务来划分一下module。(模块的划分根据自身的业务去制定,我这里只是举个例子)
首先我们肯定要有一个common的模块,该模块是一些共用的代码,比如对BaseActivity、BaseFragment、网络框架等业务的封装。 (common)
然后任务肯定单独是个模块 (taskModule)
登录,注册,注销等业务可以放到用户模块中 (userModule)
消息,通知这些可以放到消息模块中 (messageModule)
导航我这里是集成的高德地图的SDK,对地图相关的业务可以单独封一个地图模块,方便以后其他项目使用 (gaodemaplib)
还有一些项目中使用的自定义view的东西,我们也是可以服用的,我这里也单独作为一个模块了 (custom_view)

好了基本上根据业务需求划分了这几个模块。

如图所示,大概结构就是这样。

这样一划分之后,实际上我们的绝大多数业务都是在各个module中完成的,而app则相当于一个组装的module,只需要配置一下启动页面和处理少量的逻辑就可以了,然后剩下的module我们可以直接通过import module的方式复用。这样也大大降低了耦合性。
对于我这个项目,我只需要完成一个app的逻辑,然后其他app依赖通用的module即可。基本上不需要做改动。

统一的gradle配置


模块划分完毕后我们需要解决的就是一些第三方库的依赖,以及默认的一些gradle配置了。
gradle是基于Groovy语言的,用于编写脚本。作为一名Android开发人员,我们很有必要去学习了解一下Groovy。
在我们平时项目中,我们经常会跟gradle文件打交道,因为Android Studio默认就是用gradle来进行构建的,我们在开发中也会对一些gradle文件进行编辑。
比如,依赖一些第三方的库,指定Android的版本,多渠道打包,指定签名文件等等。

首先我们先来解决统一配置的问题,我们多个模块之间对第三方的依赖应该保持一致,特别是官方的support包,必须保持一致,不然编译时会提示版本不一致的错误,关于版本不一致的解决办法可以看我之前的一篇博客
com.android.support冲突的解决办法

首先我们可以新建一个文件,用于声明android默认的配置项,签名文件的信息,以及依赖的第三方库的版本号。
例如
新建一个config.gradle文件,该文件主要是用来声明一些共用的变量。


类似于这样


ext {/*defaultConfig*/compile_sdk_version = 27min_sdk_version = 16target_sdk_version = 27constraint_version = "1.0.2"version_code = 101version_name = "1.0.1"multiDexEnabled = true/*dependencies*/android_support = "27.1.1"butterknife = "8.5.1"eventbus = "3.1.1"glide = "4.7.1"permission = "2.0.0-rc10"retrofit = "2.4.0"ok_http = "3.10.0"rx_android = "2.0.2"rx_java = "2.1.4"rxlifecycle = "2.2.1"dagger2 = "2.16"/*等等*/}

然后我们在project的build.grdle中引用该文件。

apply from: file('config.gradle')

注意路径不要错了,这样引入后我们就可以引用声明的变量了。

然后在module中的build.gradle中就可以使用我们声明好的变量了,这样一来,我们所有模块的版本就保持一致了,而且修改版本号的话只需要修改config.gradle中的变量值即可。
使用方法

模块的单独调试与相互依赖

在多人开发的模式下,可能每个人负责一个module,那么在调试的时候,我们需要把module单独作为一个application来调试。

这个时候,我们就需要准备两套清单配置文件。一套用于作为module时使用,另外一套作为application时使用,作为application时我们需要在清单配置文件中设置启动页面,主题等,而作为module的话,只需要声明一下需要的页面即可。

以userModule为例:

准备两套清单配置文件:

debug模式下的清单配置文件需要指定启动页,主题等

声明一个变量用来确定当前模块是不是一个module,例如

可以在跟目录的gradle.properties文件中声明,用起来也比较方便

isUserModule = true  //true表示当前是个library,false则表示是个application

user模块的build.gradle

我们需要根据是否是module来确定当前模块的类型

if (isUserModule.toBoolean()){apply plugin: 'com.android.library'
}else{apply plugin: 'com.android.application'
}

根据类型加载不同的清单配置文件:

    sourceSets {main {jniLibs.srcDirs = ['libs']if (isUserModule.toBoolean()) {manifest.srcFile 'src/main/release/AndroidManifest.xml'} else {manifest.srcFile 'src/main/debug/AndroidManifest.xml'}}}

其他模块依赖的时候:

如果类型为module,则依赖

    if (isUserModule.toBoolean()) {implementation project(':user')}

这样一来,我们就可以方便的切换当前模块的类型了,也方便我们单独测试。

模块之间的通讯


关于模块之间的通讯,我采用的是使用阿里巴巴开源框架ARouter来解决,通过该框架我们可以实现不同模块之间的页面跳转,传值等。
ARouter Github

详细的使用方法直接查看官方文档即可,这里就不细说了。

建议:我们可以把路由配置信息放到公共库中,这样方便模块之前的跳转


实际上模块化开发的细节还有很多,说的再多都不如自己亲自写一写。
总得来说,模块化的好处就是是的业务划分的比较清晰,方便维护,同时有一定的复用价值,如果公司中有私服的话可直接把耦合低的公用模块上传上去,直接远程依赖使用,往组件化的方向走


如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

Android 模块化总结相关推荐

  1. Android模块化之MicroModule(微信Pins工程)

    微信Pins工程 相信你看过微信关于模块化的分享<微信Android模块化架构重构实践>,也注意到里面提到的pins工程结构. 作者是这样描述的 ------"pins工程能在m ...

  2. Android模块化之MicroModule(微信Pins工程) 1

    微信Pins工程 相信你看过微信关于模块化的分享<微信Android模块化架构重构实践>,也注意到里面提到的pins工程结构. 作者是这样描述的 ------"pins工程能在m ...

  3. 关于Android模块化我有一些话不知当讲不当讲

    关于Android模块化我有一些话不知当讲不当讲 最近公司一个项目使用了模块化设计,本人参与其中的一个小模块开发,但是整体的设计并不是我架构设计的,开发半年有余,在此记录下来我的想法. 关于Andro ...

  4. 美团猫眼android模块化实战-可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://blog.csdn.net/qq_22744433/article/details/7794844 ...

  5. 美团猫眼电影android模块化实战--可能是最详细的模块化实战

    转载请注明出处: 美团猫眼电影android模块化实战–可能是最详细的模块化实战 地址:http://www.jianshu.com/p/d372cc6802e5 目录 1 写这篇博客的初衷 首先一句 ...

  6. 浅谈Android模块化设计(常规思路)

    移动开发从iPhone手机问世之后,也快有十个年头了,随着App功能的不断的变多,代码规模越来越大,也为了适应多项目组协同开发的工程需要,各种移动端的模块化方案应运而生. 这两年来,各大公司以及各路大 ...

  7. 个人自用总结的Android模块化架构模板

    模板项目链接 ArchitectureSample 如果大家觉得有什么问题或者建议,欢迎提issue,这个工程我也会不断改进,虽然比不上大公司.大牛的那些NB架构,但自己不断学习改进也是一种进步吧. ...

  8. 关于Android模块化开发介绍及使用

    模块化浅谈: 1.安卓模块化开发介绍: 模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app.app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自 ...

  9. android模块化 osgi,蚂蚁金融级移动应用 osgi 模块化架构实践.pdf

    蚂蚁金融级移动应用 osgi 模块化架构实践 To p 1 0 0 C a s e S t u d i e s O f T h e Ye a r s - Android To p 1 0 0 C a ...

  10. Android 模块化编程之引用本地的aar

    转: http://www.stormzhang.com/android/2015/03/01/android-reference-local-aar/ 随着项目越来越多,代码的复用就变得异常重要,这 ...

最新文章

  1. dubbo 源码编译记录
  2. windows 10安装gensim、nltk
  3. first-软件工程
  4. 【专场福利Part2】从多维度出发 保障提升实时音视频质量
  5. 幼儿编程学java不_《终于有人说出来了——Java不适合于作为主要编程教学语言》我的看法...
  6. Install VMware tools 解决(物理主机WIN7X64和VM下的REHAT LINUX AS4共享文件)
  7. Vue开发系列三 调试
  8. 三、数学建模之灰色关联分析【清风数学建模个人笔记】
  9. Kubernetes CICD发布架构流程思路
  10. leetcode:6071. 完成所有任务需要的最少轮数【尽可能的多一点3】
  11. Android 高德地图自定义定位图标的显示
  12. 学期博客:学习进度条
  13. 阿里巴巴Java开发规范(终极版v1.3.0)--个人整理
  14. Devops 开发运维基础篇之Jenkins部署与使用
  15. 2022年值得选择的开源低代码平台
  16. python文件操作练习题【学生成绩.txt】
  17. python sum函数的用法
  18. 杰理之LINEIN 左右声道与 DACLR 输入出的注意【篇】
  19. 微积分知识点回顾与总结(八):重积分
  20. 数据结构实践——猴子选大王

热门文章

  1. 计算机启用远程桌面连接失败,解决办法:如何处理win10远程桌面连接失败?
  2. vscode远程连接与控制使用
  3. mq使用replyto队列进行消息回复
  4. 青年志愿者演讲稿范⽂5篇
  5. 城市区号+mysql_中国城市区号脚本-mysql
  6. 网络TDR测试软件,高分辨率TDR测试以及应用
  7. 蓝桥杯(java)个人赛真题:书号验证
  8. codeforces A. Statues
  9. 鸿蒙系统反应很快吗,EMUI11对比未成形的鸿蒙系统反应速度:速度差距较大,但细节赢了...
  10. xcode run跑项目或者Archive打包项目的时候显示Build Succeeded一闪而过但是程序无反应问题解决