Android开发之项目模块化实践教程
前言
大家应该都知道,项目模块化是一个大命题,相信各团队都有其合理方案。本文不求涵盖各方面,仅从项目协同、开发调试、业务模块服务调用与通知三个方面简述一个可行方案。下面话不多说了,来一起看看详细的介绍吧。
项目协同
项目协同,也叫多项目协同,是对多个相关且有并行情况项目的管理模式,它是帮助实现项目与企业战略相结合的有效理论和工具[1]。本文的项目协同为Android主APP与其他业务模块的协同。
假设我们的APP目录如下,一个主app,多个modules。并假设我们的主app与各modules为多git repository。一个大APP多git repository管理是合理的。本文使用git repo[2]管理项目(可能有团队使用git submodule[3],在此不推荐,其坑会很多)。
MApp --独立git rep
app
modules
module1 --独立git rep
module2 --独立git rep
module3 --独立git rep
...
使用git repo,团队早期可以不用玩一整套(git repo+gerrit),可以考虑只用repo去管理项目目录,成员提交代码还是继续走git提交。
项目开发与调试
Android模块化的主要目的是业务并行开发,减少编译时间,但又方便业务模块与主App的调试。本文介绍如下方案。
MApp
app --application
modules
module1
demo --application
lib --library
settings.gradle
settings.gradle
settings_debug.gradle
local.properties
MApp的settings.gradle文件:
boolean moduleDebug() {
boolean ret = false
try {
Properties properties = new Properties()
File file = file('local.properties')
if (!file.exists()) {
return false
}
properties.load(file.newDataInputStream())
String debugStr = properties.getProperty("debug")
if (debugStr != null && debugStr.length() 0) {
ret = debugStr.toBoolean()
}
} catch (Throwable throwable) {
throwable.printStackTrace()
ret = false
}
return ret
}
include ':app'
if (moduleDebug()) {
apply from: 'settings_debug.gradle'
}
settings_debug.gradle文件:
//include 'module1'
//project(':module1').projectDir = new File('modules/module1/lib')
...其他业务模块
当module1在需求开发阶段,完全不用考虑主APP,可以在Android Studio中以项目的方式打开。当module1需要和主APP跑流程时,我们只需要把MApp的local.properties的debug属性改为true,并在settings_debug.gradle中打开module1即可。
业务模块服务调用与通知
当APP模块化后,通过Intent(Context packageContext, Class<? cls)
方式去启动其他模块的Activity就不太合理了。模块化后,模块里的Activity或其他组件对其他业务模块最好透明。唤起Activity可以通过App Links[4]的方式,也就是我们常说的url router方式。App Links还可以玩deep link。Github上现在开源项目比如ARouter[5]就是App Link的应用。
当然,模块之间的通信,不局限于启动四大组件,还有服务调用与通知。这的服务不是Android系统的Service。举个服务通知的例子,在电商APP中,店铺详情页点收藏按钮,可能要通知其他模块,变更UI或数据。服务调用的例子,比如模块唤起登陆注册,登陆或注册成功后,做相应业务处理。
服务调用,大部分团队可能没涉及到。服务调用可以用IOC,反射等注册到服务注册中心。本文选一个取巧的方案。利用Applicatin.getSystemService方法,让Application作为ZoomKeep一样成为服务注册中心。只要各Serivce继承同一个Interface,相应模块间服务调用就不难了。
public class MApp extends Application {
@Override
public Object getSystemService(String name) {
return super.getSystemService(name);
}
}
服务通知,稍简单,用广播,EventBus[6]或其他方式都可。本文推荐EventBus,但其有缺点,如Event多起来后,很难找全观察者和通知者之间的关系;一些简单Event对象无法复用,所以最好二次开发。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ZaLou.Cn的支持。
参考
[1] 项目协同: http://www.baike.com/wiki/%E…
[2] git repo:https://gerrit.googlesource.com/git-repo/
[3] git submodule: https://git-scm.com/book/zh/v1/Git…
[4] App Links:https://developer.android.com/training/app-links/deep-linking.html
[5] ARouter:https://github.com/alibaba/ARouter
[6] EventBus:https://github.com/greenrobot/EventBus
- ASP.NET Core的配置(1):读取配置信息
- 权限管理和备份实例
- “协变”、“逆变”与Delegate类型转换
- 如今的人工智能是不是真的已经很聪明了?
- 【Scikit-Learn 中文文档】聚类 - 无监督学习 - 用户指南 | ApacheCN
- Delegate如何进行类型转换?
- 个性化推荐系统(一)---今日头条等的内容划分、分类
- ASP.NET Core的配置(2):配置模型详解
- 如何解决jQuery Validation针对动态添加的表单无法工作的问题?
- 数据结构 链表改进
- 数据结构 栈&队列
- 终端品牌域名过期被拍卖 价值六位数
- TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
- ASP.NET的路由系统:路由映射
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- VCS入门教程(三)
- VCS入门教程(二)
- VCS入门教程(一)
- WebRTC架构图说明
- java安全编码指南之:Mutability可变性
- RocketMQ 消息丢失场景分析及如何解决!
- Gopro Ardunio控制库.3
- GoPro Arduino控制库.阅读源码.1
- [漏洞复现] 二.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
- 本地scratch-gui和blockly安装
- 用Python打造一款文件搜索工具,所有功能自己定义!
- 解决SSH登录缓慢
- Html ul、li Css标签详解 使用图片自定义样式 隐藏小点样式齐全
- TRTC Android端开发接入学习之实现视频通话(五)
- 让WordPress默认用户无法进入后台