转载请标明出处:【顾林海的博客】

个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持!

##前言
在以前的项目中都是建一个基础库,项目依赖基础库,主项目中集成了所有的功能,这样的化导致主项目的臃肿,并且功能难以拆分,如果是有规模的公司,一般有好几个业务部门,业务部门之间的交流成本高,2015年所在的同程旅游亦是如此,所有项目组的代码都是在同一个项目中,虽然做了包的划分,但还是难以维护,业务的不断增加,代码的数量也会越来越多,单一工程下的架构势必会阻碍开发进度。为此提出组件化开发,组件化开发将业务拆分成一个个组件,每一个组件可以单独编译,并且可以相互依赖,通过路由协议,达到Activity之间的解耦,为此,可以将项目进行分层,基础组件包含(三方SDK、网络请求操作、图片加载操作、公共工具类、日志分析、公共View),其次是业务组件依赖与基础组件,如果有必要可以在业务组件与基础组件之间增加一层公共业务组件用于公共业务的操作(比如账户相关的操作)。划分后的分层图如下:

##组件化开发

下面会同一个项目的框架讲解组件化开发的具体流程,讲解过程中并没有把公共业务组件添加进去,如果大家有这层需求可以自行添加。

这里需要了解一些概念:

application属性,可以独立运行的Android程序,也就是我们的APP;

apply plugin: ‘com.android.application’

2、library属性,不可以独立运行,一般是Android程序依赖的库文件;

apply plugin: ‘com.android.library’

项目的目录结构如下:

在项目中app是我们的主项目,一般包含引导页和主界面,可以称它为壳,baselibrary是我们的基础库,module下是我们的业务组件,这里的两个业务组件分别是咨询组件和订单组件,我们的业务组件和壳都会依赖基础库。
在业务组件下,比如订单组件下我又创建了两个module,分别是用于编译成APK的工程和作为library的工程。

apply plugin: 'com.android.application'
android {compileSdkVersion 26buildToolsVersion "26.0.0"defaultConfig {minSdkVersion 17targetSdkVersion 26versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"javaCompileOptions {annotationProcessorOptions {arguments = [moduleName: project.getName()]}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')testCompile 'junit:junit:4.12'compile 'com.alibaba:arouter-api:1.2.1'annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'compile project(':module:order:orderlibrary')compile project(':baselibrary')
}

这是ordermanager的工程gradle,可以看出它依赖于基础库和具体的订单组件,可以把ordermanager看做是订单组件的入口,并直接进行编译生成APK,consultingmanager也是如此。

apply plugin: 'com.android.library'
android {compileSdkVersion 26buildToolsVersion "26.0.0"defaultConfig {minSdkVersion 17targetSdkVersion 26versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"javaCompileOptions {annotationProcessorOptions {arguments = [moduleName: project.getName()]}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'com.alibaba:arouter-api:1.2.1'annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'testCompile 'junit:junit:4.12'compile project(':baselibrary')
}

这是orderlibrary的gradle,orderlibrary依赖与基础库,并且它才是真正订单的组件,内部是一系列订单实现的功能。

单独编译ordermanager,并通过路由协议进行跳转,这里使用的是阿里的ARouter,查看ordermanager的入口代码:

package com.glh.ordermanager;import android.view.View;
import android.widget.Button;import com.alibaba.android.arouter.launcher.ARouter;
import com.glh.baselibrary.BaseActivity;/*** 订单模块* Created by glh on 2017-09-12.*/
public class MainActivity extends BaseActivity {private Button mOrderButton;@Overrideprotected int layout() {return R.layout.order_layout;}@Overrideprotected void initView() {mOrderButton = findViewById(R.id.btn_order);mOrderButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {orderModule();}});}public void orderModule() {ARouter.getInstance().build("/orderlibrary/order/main").navigation();}}

编译并运行:

同理,app主项目依赖与基础库,并根据需求依赖相应的业务组件。

apply plugin: 'com.android.application'android {compileSdkVersion 26buildToolsVersion "26.0.0"defaultConfig {applicationId "com.glh.tcproject"minSdkVersion 17targetSdkVersion 26versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"javaCompileOptions {annotationProcessorOptions {arguments = [moduleName: project.getName()]}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'com.android.support.constraint:constraint-layout:1.0.2'compile 'com.alibaba:arouter-api:1.2.1'annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'compile project(':module:order:orderlibrary')compile project(':module:consulting:consultinglibrary')compile project(':baselibrary')
}
package com.glh.tcproject;import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import com.alibaba.android.arouter.launcher.ARouter;
import com.glh.baselibrary.BaseActivity;
import com.glh.consultinglibrary.ConsultingManActivity;
import com.glh.orderlibrary.OrderMainActivity;public class MainActivity extends BaseActivity {private Button mOrderButton;private Button mConsultingButton;@Overrideprotected int layout() {return R.layout.activity_main;}@Overrideprotected void initView() {mOrderButton = findViewById(R.id.id_main_order);mConsultingButton = findViewById(R.id.id_main_consulting);mOrderButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ARouter.getInstance().build("/orderlibrary/order/main").navigation();}});mConsultingButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ARouter.getInstance().build("/consultinglibrary/consulting/main").navigation();}});}
}

编译app主项目,并运行:

除了以上操作,不同业务组件也是可以相互依赖,比如想在订单组件中使用咨询组件,可以在orderlibrary中引入consultinglibrary:


dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'com.alibaba:arouter-api:1.2.1'annotationProcessor 'com.alibaba:arouter-compiler:1.1.2'testCompile 'junit:junit:4.12'compile project(':baselibrary')compile project(':module:consulting:consultinglibrary')
}
package com.glh.orderlibrary;import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.glh.baselibrary.BaseActivity;/*** 订单模块* Created by glh on 2017-09-12.*/
@Route(path = "/orderlibrary/order/main")
public class OrderMainActivity extends BaseActivity {private Button mOrderButton;private Button mConsultingButton;@Overrideprotected int layout() {return R.layout.module_order_layout;}@Overrideprotected void initView() {mOrderButton = findViewById(R.id.id_order);mConsultingButton = findViewById(R.id.id_consulting);mOrderButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {orderModule();}});mConsultingButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ARouter.getInstance().build("/consultinglibrary/consulting/main").navigation();}});}public void orderModule() {Toast.makeText(this, "订单项目", Toast.LENGTH_SHORT).show();}}

重新编译ordermanager,并运行:

组件化开发已经讲解完,关于组件化开发网上有很多文章,这里只是给出了组件化开发的思路,最后有关组件化开发导致的资源冲突,我的解决方案是规范,是的,可以规定每个业务组件的资源文件已组件名开头,这样的话就不会造成资源冲突。

项目的github地址在这里,大家可以下载下来看看,如果对你有一丁点帮助,那么写这篇文章也是值得的。

Android之组件化开发相关推荐

  1. Android进阶——组件化开发实践(一)

    一.组件化的意义 随着Android 项目代码和结构逐渐复杂,维护成本会指数型上升,通常我们会利用Android Studio自带的Module去拆分项目代码.但这种拆分显然需要基于一定逻辑和结构,目 ...

  2. android 登录组件开发,Android组件化开发路由的设计

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的. VpRouter路由框架主要应用于组件化开 ...

  3. android组件化开发视频教程,教你打造一个Android组件化开发框架

    作者简介 本篇来自 lucky_billy 的投稿,分享了他的开源组件化框架,详细地讲解框架形成的思路,希望对大家有所帮助. lucky_billy 的博客地址: 解读开源框架设计思想 B站学习视频 ...

  4. 架构:Android 组件化开发

    前言 强烈推荐先阅读这篇文章 Android 组件化最佳实践 本文是阅读实践后的思考总结,更倾向实践步骤. 组件化开发架构 组件化开发大体就是这样的架构,最关键的是base 和 base_custom ...

  5. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  6. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...

    组件化开发有什么好处? 1.当项目越来越大时,app的业务越来越复杂,会出现业务功能复杂混乱,各功能块.页面相互依赖,相互调用太多导致耦合度高,而采用组件化开发,我们就可以将功能模块合理的划分,降低功 ...

  7. Android组件化开发,其实就这么简单

    组件化,在实际的业务开发中,越来越多的会使用这种方式,特别是业务逻辑复杂,功能模块较多的项目,越能凸显出组件化的优点,比如各个模块拆分,使其业务分明,比如耦合度低,组件之间相互独立,再比如编译运行速度 ...

  8. android组件设计,Android组件化开发路由的设计实践

    调研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技术 编译时注解,个人想法是一口吃不成胖子,先做个比较实用的. VpRouter路由框架主要应用于组件化开 ...

  9. Android模块化和组件化开发

    目录 一.模块化介绍 1.1:模块化简介 1.2:模块化和组件化的区别 1.3:模块化的优点 1.4:模块化的层级介绍 二.如何实现组件化 2.1:实现模块化需要解决的问题 2.2:各个问题的解决方法 ...

最新文章

  1. WCF优化的几个常规思路
  2. Struts2漏洞的前因后果
  3. Windows下Git的安装和基本使用、搭建Git服务器
  4. Linux getcwd()的实现【转】
  5. 聊聊JVM(六)理解JVM的safepoint
  6. 大数据分析实战-信用卡欺诈检测(三)- 模型评估
  7. This blog has been cancelled for a long time
  8. Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
  9. bzoj3209 花神的数论题——数位dp
  10. Java并发容器J.U.C
  11. iostream stdlib fstream io.h 头文件的作用
  12. 复杂纹理复制及纹理叠加效果
  13. windows 线程核心内容
  14. Ubuntu下Maven安装和使用
  15. 微信 公众号 网页授权登录(静默授权)
  16. 网站使用微软雅黑需要版权吗
  17. oracle条件索引查询,Oracle复合索引用于范围查询条件
  18. div p、divp、div+p、div~p、div.a 、p,span的用法和区别
  19. 水泥行业工业互联网平台(CCPS)解决方案
  20. 仿微信朋友圈点击评论自动定位到对应位置

热门文章

  1. vue 数据更新不及时_陈词懒调的《未来天王》正式完结,再也不用担心她更新不及时了!...
  2. solidworks经典实例网盘下载_Solidworks自学视频教程(附源文件)讲解详细到位,成就设计高手...
  3. How Does Maven Work
  4. Spring Cloud-Honghu Cloud分布式微服务云系统(一)
  5. Vue计算属性和监听属性
  6. vagrant学习记录
  7. 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty
  8. 连接到localhost后提示要求用户名和密码
  9. c# 如何让tooltip显示文字换行
  10. 鼠标滑过GridView的数据行时修改行的背景颜色