媒介
万维网创造人 Tim Berners-Lee 谈到设计道理时说过:“简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。” 由此可见模块化之于软件工程范畴的重要性。
大年夜 2016 年开端,模块化在 Android 社区越来越多的被说起。跟着移动平台的赓续成长,移动平滔喔赡软件慢慢走向复杂化,体积也变得痴肥宏大年夜;为了降低大年夜型软件复杂性和耦合度,同时也为了适应模块重用、多团队并行开辟测试等等需求,模块化在 Android 平台上变得势在必行。阿里 Android 团队在岁首?年代开源了他们的容器化框架 Atlas 就很大年夜程度说清楚明了当前 Android 平台开辟大年夜型贸易项目所面对的问题。
什么是模块化
对于多个 Bussines Module 中资本名冲突的问题,可以经由过程在 build.gradle 定义前缀的方法解决:
那么什么是模块化呢?《 Java 应用架构设计:模块化模式与 OSGi 》一书中对它的定义是:模块化是一种处理复杂体系分化为更好的可治理模块的方法。
膳绫擎这种描述太过生涩难解,不敷直不雅。下面这种类比的方法则可能加轻易懂得。
我们可以把软件看做是一辆汽车,开辟一款软件的过程就是临盆一辆汽车的过程。一辆汽车由车架、发念头、变数箱、车轮等一系列模块构成;同样,一款大年夜型贸易软件也是由各个不合的模块构成的。
一款发念头、一款变数箱都弗成能只应用于一个车型,比如同一款 Jatco 的 6AT 主动变速箱既可能被安装在 BMW 的车型上,也可能被安装在 Mazda 的车型上。这就如同软件开辟范呈攀里的模块重用。
到了冬天,特别是在北方我们可能须要开着车走雪路,为了安然起见往往我们会将汽车的公路胎进级为雪地胎;轮胎可以很随便马虎的改换,这就是我们在软件开辟范畴谈到的低耦合。一个模块的进级调换不会影响到其它模块,也不会受其它模块的限制;同时这也类似于我们在软件开辟范畴提到的可插拔。
模块化分层设计
膳绫擎的类比很清楚的解释的模块化带来的好处:
- 多团队并行开辟测试;
- 模块间解耦、重用;
- 可零丁编译打包某一模块,晋升开辟效力。
在《安居客 Android 项目架构演进》这篇文┞仿中,我介绍了安居客 Android 端的模块化设计筹划,这里我照样拿它来举例。但起重要对本文中的组件和模块做个差别定义
- 组件:指的是单一的功能组件,如地图组件(MapSDK)、付出组件(AnjukePay)、路由组件(Router)等等;
- 模块:指的是自力的营业模块,如新房模块(NewHouseModule)、二手房模块(SecondHouseModule)、即时通信模块(InstantMessagingModule)等等;模块相对于组件来说粒度更大年夜。
反复依附
具体设计筹划如下图:
全部项目分为三层,大年夜下至上分别是:
- Basic Component Layer: 基本组件层,顾名思义就是一些基本组件,包含了各类开源库以及和营业无关的各类自研对象库;
- Business Component Layer: 营业组件层,这一层的所有组件都是营业相干的,例如上图中的付出组件 AnjukePay、数据模仿组件 DataSimulator 等等;
- Business Module Layer: 营业 Module 层,在 Android Studio 中每块营业对应一个零丁的 Module。例如安居客用户 App 我们就可以拆分成新房 Module、二手房 Module、IM Module 等等,每个零丁的 Business Module 都必须准遵守我们本身的 MVP 架构。
我们在谈模块化的时刻,其实就是将营业模块层的各个功能营业拆分层自力的营业模块。所以我们进行模块化的第一步就是营业模块划分,然则模块划分并没有一个业界通用的标准,是以划分的粒度须要根据项目情况进行合理把控,这就须要对营业和项目有较为透辟的懂得。拿安居客来举例,我们会将项目划分为新房模块、二手房模块、IM 模块等等。
每个营业模块在 Android Studio 中的都是一个 Module ,是以在定名方面我们请求每个营业模块都以 Module 为后缀。如下图所示:
对于模块化项目,每个零丁的 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=
推荐阅读
【51CTO.com原创稿件】提到Linux,我们就会想到红帽,就跟提到Windows就会想到微软一样。作为一家专注于架构平>>>详细阅读
本文标题:Android模块化探索与实践
地址:http://www.17bianji.com/lsqh/35300.html
1/2 1