问题:实际业务变化快,而工程内各个功能模块耦合度太高,不能对功能模块进行快速方便地拆分或组装。团队共同开发中,可能一个文件同时被多人修改,导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改,都需要进行功能测试和系统测试。

目的:解决以上问题,使项目可以灵活配置,功能模块完全解耦,实践组件化之路。

实现:在之前的开发中,一个应用程序,我们将全部功能模块都写在工程app包中。实践组件化,我们将各个功能模块独立出来,最终以依赖包的形式整合到app主Module中去。在这里我写了个项目demo,简单分了几个功能模块,应用结构如下图所示:

项目组件化结构图

说明:每一个组件module是一个子工程,子工程可以依赖基础库baselibrary可独立运行;也可以作为主工程的依赖库。

具体实现:1:配置项目的buildscript,如下图所示:

buildscript配置

关于butterknife的配置及用法:http://jakewharton.github.io/butterknife,butterknife8支持在lib库中注解。

2:在主app module gradle中如下配置:

applyplugin:'com.android.application'

applyplugin:'android-apt'

android {

compileSdkVersion COMPILE_SDK_VERSION as int

buildToolsVersion BUILD_TOOLS_VERSION

defaultConfig {

applicationId APPLICATION_ID

minSdkVersion MIN_SDK_VERSIONas int

targetSdkVersion TARGET_SDK_VERSIONas int

versionCode 1

versionName "1.0"

}

signingConfigs {

debugConfig {

storeFile file("***.jks")

storePassword "******"

keyAlias "*****"

keyPassword "******"

}

releaseConfig {

storeFile file("******.jks")

storePassword "********"

keyAlias "*****"

keyPassword"*******"

}

}

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

dependencies {

if(!isDebug.toBoolean()) {//各个模块作为库加载

compile project(':loginmodule')

compile project(':startmodule')

compile project(':homemodule')

compile project(':msgmodule')

}else{//各模块独立运行

compile project(':baselibrary')

}

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:关于activityrouter的配置及使用,在后面会说到。

3:baselibrary作为各个模块共同依赖的基础库,其gradle配置如下:

applyplugin:'com.android.library'

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(include: ['*.jar'],dir:'libs')

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile'com.android.support:appcompat-v7:24.2.1'

compile'com.jakewharton:butterknife:8.5.1'

apt'com.jakewharton:butterknife-compiler:8.5.1'

compile'com.github.mzule.activityrouter:activityrouter:1.2.2'

}

4:在子工程模块gradle配置如下(以homemodule为例):

if(isDebug.toBoolean()) {

applyplugin:'com.android.application'

}else{

applyplugin:'com.android.library'

}

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

sourceSets {

main{

if(isDebug.toBoolean()) {

manifest.srcFile'src/debug/AndroidManifest.xml'

}else{

manifest.srcFile'src/release/AndroidManifest.xml'

}

}

}

resourcePrefix"home_"

}

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile project(':baselibrary')

apt'com.jakewharton:butterknife-compiler:8.5.1'

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:当module单独运行和作为module运行时,其activity在manifest中设置也会不同,这里可以根据isDebug设置不同的manifest。当分别开发模块时,容易出资源重复命名的问题,可以在build.gradle中设置resourcePrefix "home_",通过给模块设置不同的资源前缀,可以避免重复命名。

Activity跳转问题

从上面的配置中,可以看到,项目引入了apt'com.github.mzule.activityrouter:compiler:1.1.7',我们为什么使用ActivityRouter呢,当我们把各个功能模块抽成独立的lib的时候,各个模块之间难免要进行Activity的跳转及传参。我们不能再像以前那样直接通过startActivity来实现跳转了。关于ActivityRouter的配置及用法:https://github.com/mzule/ActivityRouter

使用在application中注解:@Modules({"app","homeModule","loginModule","startModule","msgModule"})

public class XxxxApplication extends Application {

}

每个module中创建空java类注解:

@Module("homeModule")

public class HomeModule{

}

组件间通信问题:

不同组件Activity之间传递大量数据时可以通过EventBus来进行传递,EventBus原理及用法:https://github.com/greenrobot/EventBus

编译运行

当在gradle.properties中设置isDebug=true时,可以独立运行每个module,独立运行调试,当设置isDebug=false,可以编译运行整个project,注意isDebug变量设置改变时,要重新对gradle进行sync。

可能遇到的一些问题:

1:如果遇到/com/github/mzule/activityrouter/router/RouterInit.java javaError:(7, 5) 错误: 找不到符号 符号:  变量 RouterMapping等错误,请检查app是否把各个Module都依赖进来了。

2:使用butterknife注解时,每个Module会对应生成R2文件,即使在base库里注解过了,Module也要重新注解,组件中不能直接使用。

3:如果项目中使用到menu注意:

@Override

protected void onMenuItemClick(MenuItem item) {

//        switch (item.getItemId()) {

//            case R2.id.xxx:

//                Routers.open(mContext,"");

//                break;

//        }

if (item.getItemId() == R.id.xxx){

Routers.open(mContext,"");

}

super.onMenuItemClick(item);

}

寻找对应的menu id时,用if else 代替 switch,注:itemid 和 R2值不一样,和R是一样的。

android国籍组件,android组件化之路相关推荐

  1. Android:项目模块化/组件化的架构之路(一)

    文章目录 前言 推荐 模块化需要做什么 一.如何拆分项目 二.模块之间的通信 1. 常用的通信方式 2. 改善通信方式 2.1 使用接口进行通信 2.2 如何对外暴露接口 2.3 使用EventBus ...

  2. android path拆分_Android架构进阶之路:Android 组件化方案探索与思考总结

    组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试. 先来一张效果图 好像是因为机制原因上传不了动图,所以截图了一个画面 组件化初衷 APP版 ...

  3. 蘑菇街Android组件与插件化

    插件化的基石 -- apk动态加载 随着我街业务的蓬勃发展,产品和运营随时上新功能新活动的需求越来越强烈,经常可以听到"有个功能我想周x上,行不行".行么?当然是不行啦,上新功能得 ...

  4. Android 学习之路 之 Android应用的基本组件介绍(六)

    Android 应用通常由一个或多个基本组件组成,前面我们看到 Android 应用中最常用的组件就是 Activity.事实上 Android 应用还可能包括 Service.BroadcastRe ...

  5. 蘑菇街App的组件化之路·续

    原文:http://limboy.me/ios/2016/03/14/mgj-components-continued.html 蘑菇街 App 的组件化之路·续 前几天在「移动学习分享群」分享了关于 ...

  6. 组件化之路 - ViewModel一知半解

    新的一年,优先把欠账补齐,关于Jetpack下Lifecycle.ViewModel.LiveData组件库,以及ViewModel+LiveData项目实践,如今也只差ViewModel还没有记录了 ...

  7. Android开发之 Android 的基本组件的概述

    Android是一个为组件化而搭建的平台,它的应用是由一些零散的有联系的组件组成,并通过AndroidManifest.xml文件 把它们绑定起来. Android常用的组件有: Activity(活 ...

  8. 【超强干货】蘑菇街App的组件化之路

    本文为『移动前线』群在3月10日的分享总结整理而成,转载请注明来自『移动开发前线』公众号. 嘉宾介绍 蘑菇街李忠(花名银时,网名 limboy),多年客户端开发经验,目前主要负责移动端基础架构设计及核 ...

  9. 蘑菇街 App 的组件化之路

    在组件化之前,蘑菇街 App 的代码都是在一个工程里开发的,在人比较少,业务发展不是很快的时候,这样是比较合适的,能一定程度地保证开发效率. 慢慢地代码量多了起来,开发人员也多了起来,业务发展也快了起 ...

最新文章

  1. [2016-04-19 15:46:03 - IceHoloReader1.0] Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER [20
  2. ubuntu14.04连接网络 No valid active connections found!
  3. [Android]Fragment自定义动画、动画监听以及兼容性包使用
  4. Echarts与Highcharts的比较
  5. 雅虎yql_从RSS Feed和YQL创建数据表
  6. 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
  7. linux内核input子系统解析【转】
  8. 在docker中配置apt工具与python的源均为国内源
  9. 远程连不上mysql_解决MySQL远程连接不上的问题
  10. 微软vc运行库地址VC9VC11
  11. 终极邮件搜索群发大师 v3.47 绿色
  12. php 控制骰子概率,jQuery+PHP实现的掷色子抽奖游戏实例
  13. LAMP兄弟连 视频教程集
  14. 线程局部存储-pthread_getspecific和pthread_setspecific使用
  15. 携程去哪儿合并可行性研究报告
  16. C++解压zip压缩文件
  17. poi操作PPT读取模板流,生成新PPT文件
  18. 《Android开发偶遇有趣算法问题》---获得地图方圆r米内的一个随机坐标点(求单位圆内随机点)
  19. Vue.js(二) 模板语法
  20. python turtle 海龟绘图详解(官方文档中文版)

热门文章

  1. 《算法竞赛进阶指南》0.4二分
  2. Django:学习笔记(2)——创建第一个应用
  3. Makefile 7——自动生成依赖关系 三颗星
  4. C++ Qt 访问权限总结
  5. 扎实的基础是成功的法宝
  6. kafka exporter v0.3.0 发布: Prometheus官方推荐,欢迎试用
  7. 安装perl5.10.0
  8. redhat oracle 开机自启动
  9. [紧急问题和解决方案] 无法打开被权限管理服务(RMS)加密的Office 2003文档
  10. abap常用系统变量