Android 模块化实践之路 (1)

来源:互联网 发布:人工智能语言有哪些 编辑:程序博客网 时间:2024/05/22 09:42

[TOC]

模块化的好处

  • 多团队并行开发测试;
  • 模块间解耦、重用;
  • 可单独编译打包某一模块,提升开发效率。

概念说明:

  • 组件:指的是单一的功能组件,如地图组件、支付组件、路由组件(Router)等等;
  • 模块:指的是独立的业务模块,以目前大家中医的业务模块来划分,就包括:工作室模块、经典模块、患教模块、IM模块等;模块相对于组件来说粒度更大。

WX20170616-105532.png

模块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/

原创粉丝点击