Android组件化开发探索及项目实践
2017-08-10 17:31
746 查看
转载请注明出处:drawthink的简书:http://www.jianshu.com/u/70318c7e4b5f
一直忙,最近才有时间将组件化技术在以往实际项目开发遇到的坑写出来,毕竟有些坑,别人趟过的,我们就没必要前赴后继的作死了。
相信众多安卓开发猿在项目开发中一定遇到过这样的项目结构:
当我们在开发一个项目时,通常将APP按功能分包,比如所有的页面放一个包,网络相关的放一个包等等,当项目业务场景单一,团队构成简单时,这样的开发模式没问题。
但当我们的APP业务场景越来越多,业务逻辑越来越复杂,类与类之间,功能模块与功能模块之间耦合度也越来越大,这时候问题就来了。往往是小张改了A处的BUG,结果导致B处,C处又有了新的BUG。万一在再碰上老板要求:那谁谁,明天把某个模块给我单独装手机上看看时。这个时候整个开发团队无疑是奔溃的。
介于以上种种原因,我们不得不重新考虑我们在设计APP的时候,要设计出一个满足以下要求的架构来:降低模块耦合度,高复用,利于团队开发等。这个时候可以考虑考虑组件化开发。
其实在之前的项目开发中,为着解决上述的问题,已经懵懂的将项目分成多个模块来开发了。但是不知道这个东东叫组件化开发(囧)。以项目为例,前些天在做一个类似滴滴的打车软件,因为项目初期,不可能将司机端和用户端做两个APP,成本太大,所以合二为一,做成一个APP。
common::项目的统一基础信息配置,公用类库等。
driver: 司机模块,依赖common。
customer:用户端,依赖common。
main:项目入口,依赖driver,customer,负责对driver,costomer模块的请求转发。
在项目根build.gradle中配置构建工具版本,编译sdk版本,当然也可以配置一些三方库的版本信息,然后在其他模块中引用就OK,达到项目库版本的统一配置开关。
2.2全局调试开关配置(用法在下面2.3章节中会讲)
在项目根gradle.properties中加入调试开关
2.3具体模块配置()
common模块:build.gradle
driver模块build.gradle配置 :当我们要单独调试driver模块时,需要
而作为被main模块依赖时需要
这个时候我们在2.2中的调试开关就可以用到了,我们可以这样进行配置
**注意一:
就是当我们将driver作为被lirbary时,在AndroidManifest.xml中是不能有category为android.intent.category.LAUNCHER,因为APP在打包后会将所有的模块的AndroidManifest.xml合并,这时候如果合并的AndroidManifest.xml中有两个category为android.intent.category.LAUNCHER的activity时会在手机同时安装两个apk。**
所以需要针对Module作为library和application单独编写AndroidManifest.xml,然后在library目录下的AndroidManifest.xml去掉application的相关配置就好。
类似:
然后在build.gradle中android节点下添加:
注意二:当该module作为library时,build.gradle不能存在applicationId。
customer模块的配置参见driver。
配置基本到此,这时候通过开关isLirbary就可以对项目模块进行单独调试或整体调试。
一直忙,最近才有时间将组件化技术在以往实际项目开发遇到的坑写出来,毕竟有些坑,别人趟过的,我们就没必要前赴后继的作死了。
组件化开发:
组件化开发就是一个解耦的过程,将一个app分成多个模块,每个模块都是一个组件(Module,该Model为Android Library),开发的过程中我们可以对这些组件进行单独调试,但是最终发布的时候是将这些组件统一成一个apk,这就是组件化开发。相信众多安卓开发猿在项目开发中一定遇到过这样的项目结构:
当我们在开发一个项目时,通常将APP按功能分包,比如所有的页面放一个包,网络相关的放一个包等等,当项目业务场景单一,团队构成简单时,这样的开发模式没问题。
但当我们的APP业务场景越来越多,业务逻辑越来越复杂,类与类之间,功能模块与功能模块之间耦合度也越来越大,这时候问题就来了。往往是小张改了A处的BUG,结果导致B处,C处又有了新的BUG。万一在再碰上老板要求:那谁谁,明天把某个模块给我单独装手机上看看时。这个时候整个开发团队无疑是奔溃的。
介于以上种种原因,我们不得不重新考虑我们在设计APP的时候,要设计出一个满足以下要求的架构来:降低模块耦合度,高复用,利于团队开发等。这个时候可以考虑考虑组件化开发。
其实在之前的项目开发中,为着解决上述的问题,已经懵懂的将项目分成多个模块来开发了。但是不知道这个东东叫组件化开发(囧)。以项目为例,前些天在做一个类似滴滴的打车软件,因为项目初期,不可能将司机端和用户端做两个APP,成本太大,所以合二为一,做成一个APP。
一.项目分为四个Module:
common::项目的统一基础信息配置,公用类库等。
driver: 司机模块,依赖common。
customer:用户端,依赖common。
main:项目入口,依赖driver,customer,负责对driver,costomer模块的请求转发。
二.具体模块配置
2.1项目统一基础信息配置在项目根build.gradle中配置构建工具版本,编译sdk版本,当然也可以配置一些三方库的版本信息,然后在其他模块中引用就OK,达到项目库版本的统一配置开关。
ext { compileSdkVersion = 25 buildToolsVersion = "25.0.2" minSdkVersion = 14 targetSdkVersion = 23 }
2.2全局调试开关配置(用法在下面2.3章节中会讲)
在项目根gradle.properties中加入调试开关
isLibrary=true
2.3具体模块配置()
common模块:build.gradle
apply plugin: 'com.android.library' android { 引用项目根build.gradle的配置 compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion } } //driver,customer模块都会用到的三方库 dependencies { compile 'com.squareup.retrofit2:retrofit:2.3.0'//Retrofit2所需要的包 compile 'com.squareup.retrofit2:converter-gson:2.3.0'//ConverterFactory的Gson依赖包 compile 'com.squareup.retrofit2:converter-scalars:2.3.0'//ConverterFactory的String依赖包 compile 'com.android.support:appcompat-v7:25.0.0' //高德地图 compile 'com.amap.api:navi-3dmap:latest.integration' compile 'com.amap.api:search:latest.integration' compile 'com.amap.api:location:latest.integration' compile 'com.jakewharton:butterknife:8.4.0' compile 'com.android.support:design:25.0.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' }
driver模块build.gradle配置 :当我们要单独调试driver模块时,需要
apply plugin: 'com.android.application'
而作为被main模块依赖时需要
apply plugin: 'com.android.library'
这个时候我们在2.2中的调试开关就可以用到了,我们可以这样进行配置
if (! isLibrary.toBoolean()) { apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' }
**注意一:
就是当我们将driver作为被lirbary时,在AndroidManifest.xml中是不能有category为android.intent.category.LAUNCHER,因为APP在打包后会将所有的模块的AndroidManifest.xml合并,这时候如果合并的AndroidManifest.xml中有两个category为android.intent.category.LAUNCHER的activity时会在手机同时安装两个apk。**
所以需要针对Module作为library和application单独编写AndroidManifest.xml,然后在library目录下的AndroidManifest.xml去掉application的相关配置就好。
类似:
然后在build.gradle中android节点下添加:
sourceSets { main { if (isLibrary.toBoolean()) { manifest.srcFile 'src/main/library/AndroidManifest.xml' } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' java { //当该module作为library时,library目录下的AndroidManifest.xml文件不需要合并到主工程 exclude 'library/**' } } } }
注意二:当该module作为library时,build.gradle不能存在applicationId。
if (!isLibrary.toBoolean()){ applicationId "com.XXX" }
customer模块的配置参见driver。
配置基本到此,这时候通过开关isLirbary就可以对项目模块进行单独调试或整体调试。
相关文章推荐
- Android组件化开发探索及项目实践
- 三、东软实践项目2-基于android平台的应用开发:打电话功与发短信功能
- Android 实践项目开发二
- Android 项目实践(一)——开发流程
- Android业务组件化开发实践
- android 开发教程之日历项目实践
- Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
- Android业务组件化开发实践(二)
- Android项目开发实践之项目结构规划
- Android开发项目实践(集)
- Android开发实践-项目工程结构
- 从零开始的Android新项目11 - 组件化实践(1)
- android 开发教程之日历项目实践(一)
- Android业务组件化开发实践(转载)
- [Android] 项目实践之开发规范
- android 开发教程之日历项目实践(三)
- [转]Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
- 一、东软实践项目2-基于android平台的应用开发:实现页面之间的跳转
- Android 业务组件化开发实践
- 二、东软实践项目2-基于android平台的应用开发:简单用户登陆