Android 模块化实践之路 (1)
来源:互联网 发布:人工智能语言有哪些 编辑:程序博客网 时间:2024/05/22 09:42
[TOC]
模块化的好处
- 多团队并行开发测试;
- 模块间解耦、重用;
- 可单独编译打包某一模块,提升开发效率。
概念说明:
- 组件:指的是单一的功能组件,如地图组件、支付组件、路由组件(Router)等等;
- 模块:指的是独立的业务模块,以目前大家中医的业务模块来划分,就包括:工作室模块、经典模块、患教模块、IM模块等;模块相对于组件来说粒度更大。
模块Debug和Release处理
对于模块化项目,每个单独的 Business Module 都可以单独编译成 APK。在开发阶段需要单独打包编译,项目发布的时候又需要它作为项目的一个 Module 来整体编译打包。简单的说就是开发时是 Application,发布时是 Library。因此需要在 Business Module 的 build.gradle 中加入如下代码:
if(isBuildModule.toBoolean()){ apply plugin: 'com.android.application'}else{ apply plugin: 'com.android.library'}
isBuildModule 在项目根目录的 gradle.properties 中定义:
isBuildModule=false
同样 Manifest.xml 也需要有两套:
sourceSets { main { if (isBuildModule.toBoolean()) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' } }}
debug 模式下的 AndroidManifest.xml :
<application ... > <activity android:name="com.baronzhang.android.newhouse.NewHouseMainActivity" android:label="@string/new_house_label_home_page"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity></application>
realease 模式下的 AndroidManifest.xml :
<application ... > <activity android:name="com.baronzhang.android.newhouse.NewHouseMainActivity" android:label="@string/new_house_label_home_page"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <action android:name="android.intent.action.VIEW" /> <data android:host="com.baronzhang.android.newhouse" android:scheme="router" /> </intent-filter> </activity></application>
同时针对模块化我们也定义了一些自己的游戏规则:
- 对于 Business Module Layer,各业务模块之间不允许存在相互依赖关系,它们之间的跳转通讯采用路由框架 Router 来实现(后面会介绍 Router 框架的实现);
- 对于 Business Component Layer,单一业务组件只能对应某一项具体的业务,个性化需求对外部提供接口让调用方定制;
- 合理控制各组件和各业务模块的拆分粒度,太小的公有模块不足以构成单独组件或者模块的,我们先放到类似于 CommonBusiness 的组件中,在后期不断的重构迭代中视情况进行进一步的拆分;
- 上层的公有业务或者功能模块可以逐步下放到下层,合理把握好度就好;
- 各 Layer 间严禁反向依赖,横向依赖关系由各业务 Leader 和技术小组商讨决定。
模块之间通信
问题1: 模块之间跳转
对业务进行模块化拆分后,为了使各业务模块间解耦,因此各个 Bussiness Module 都是独立的模块,它们之间是没有依赖关系。那么各个模块间的跳转通讯如何实现呢?
比如业务上要求从新房的列表页跳转到二手房的列表页,那么由于是 NewHouseModule 和 SecondHouseModule 之间并不相互依赖,我们通过想如下这种显式跳转的方式来实现 Activity 跳转显然是不可能的实现的。
Intent intent = new Intent(NewHouseListActivity.this, SecondHouseListActivity.class);startActivity(intent)
有的同学可能会想到用隐式跳转,通过 Intent 匹配规则来实现:
Intent intent = new Intent(Intent.ACTION_VIEW, "<scheme>://<host>:<port>/<path>");startActivity(intent);
正确的路由方式应该如下:
Router框架的调用形式如下:
@Router("main")public class MainActivity extends Activity { ...}
@Router("user/:userId")public class UserActivity extends Activity { ...}@Router("user/statistics")public class UserStatisticsActivity extends Activity { ...}
可以采用Router框架
灵活的组件化路由框架:
https://github.com/chenenyu/Router
Android 平台一个简单的路由框架,包含路由和参数注入两部分功能:
https://github.com/BaronZ88/Router
问题2: 模块之间接口调用
资源名冲突
重复依赖问题
模块如何划分
参考链接
http://baronzhang.com/blog/Framework/Android-%E6%A8%A1%E5%9D%97%E5%8C%96%E6%8E%A2%E7%B4%A2%E4%B8%8E%E5%AE%9E%E8%B7%B5/
- Android 模块化实践之路 (1)
- Android Studio模块化编程实践之aar
- Android 模块化探索与实践
- Servlet3.0 新特性之模块化实践
- 二维火Android云收银模块化实践
- android模块化思想之application
- Android架构设计之模块化
- JavaScript模块化之路
- 前端模块化之路
- android插件化实践之路-1
- (0026)iOS 开发之模块化封装初步实践
- 微信Android模块化架构重构实践
- 微信 Android 模块化架构重构实践
- 微信Android模块化架构重构实践
- 微信Android模块化架构重构实践
- javascript模块化开发之路
- Android功能模块化之版本更新
- css 模块化实践
- Android技术前沿:DBFlow的实践
- 并发(十四):异步Servlet与AJAX的区别与联系
- Android Native-Web交互框架
- 【Web】CSS 经典样式及问题思考
- Daggger2 概念解读、使用姿势及源码分析(1)
- Android 模块化实践之路 (1)
- Daggger2 概念解读、使用姿势及源码分析(2)
- Android自定义键盘:数字键盘和字母键盘
- Android动画学习(七)之转场动画
- 算法(一):全排列实现与尾递归
- Oracle中distinct的用法实例以及Oracle distince 用法和删除重复数据
- 2017 Multi-University Training Contest
- Mongodb 查询表达式(时间、子集)
- db2查看数据库代码集(字符集、编码)