什么要组件化开发?

看一下普通项目的结构 , 一个项目下有多个Module(左侧图黑体目录),但是只有一个application,0个或多个library(在每个medel下的build.gradle文件下可以看到)。

apply plugin: 'com.android.application'

apply plugin: 'com.android.library'

这样架构的缺点:

1、每一次编译都是编译整个项目,项目大的时候编译几分钟几分钟的浪费

2、业务集中,修改一处可能需要注意别处会影响的部分,需要开发人员都尽可能的熟悉整个项目代码。

    

组件化开发即:

开发期间(组件模式),将每一个Module都作为一个application , 使其可以单独编译,运行。

发布时(集成模式),只留一个application(app壳) , 其他的Module都作为library。

组件化的优点:

1、加快编译效率,单个组件可以单独编译,运行,不需要再每次都编译运行整个项目,大大减少开发时间。

2、降低开发成员熟悉项目的成本,只需要熟悉负责模块的代码即可,不需要熟悉整个项目的代码。

3、控制代码权限,开发人员只可以控制部分模块的代码,不会影响到他人的代码,提高整体开发效率。

4、组件模式中,各个组件基本是相互独立的。

如何组件化开发?

一、组件模式和集成模式的转换

首先,Module分为两种类型:

、application属性,可以独立运行的Android程序,通常是默认创建的app

apply plugin: ‘com.android.application’

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

apply plugin: ‘com.android.library’ 这两种类型可以在各个Module里面的build.gradle 文件中设置

很显然,当组合模式开发的时候,每个组件设为application,集成模式的时候,只留一个application,其他都为library。

方式知道了,接下来实现,当很少的每个组件的时候,我们可以手动控制每一个每个组件的类型,但是多了的情况下就显得很麻烦了。

解决方式就是使用项目根目录下的gradle.properties文件,因为项目中所有的build.gradle文件都可以获取gradle.properties的常量,所以只需要写一个参数,例如:isModule = false (注意的是gradle.properties中所有的数据类型都是String)

接下来除了壳组件的其他所有build.gradle里面只需要根据这个参数来控制类型即可:

if (isModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}

经过上面的流程我们就可以很轻松的控制项目当前是集成模式还是组件模式。

二、AndroidManifest合并问题

相对于application和library对应的AndroidManifest文件内容是不同的,所以每一个组件需要根据当前是集成模式还是组件模式来动态的更换对应模式下的AndroidManifest.xml文件

所以我们只需给除了壳(一般是app目录)以外的其他组件的目录下再添加一个AndroidManifest.xml 文件  该文件写成 application对应的内容即可。

举例:

我们可以在组件目录下的main下添加一个module文件夹,添加一个application对应的AndroidManifest.xml

    

这样对于一个组件,就有两个AndroidManifest.xml 文件了,一个内容对应application ,一个内容对应library

接下来只需要和切换集成模式和组件模式一样,动态控制用哪一个即可。

在组件下的build.gradle下添加代码:

  sourceSets {
main {
if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}

注意application和library的AndroidManifest.xml 内容:

application下的:

library下的:

-----------------------------------------------------------------------------------------------------------------------

未完待续。。。

Android项目实战(四十八):架构之组件化开发的更多相关文章

  1. Android项目实战(十四):TextView显示html样式的文字

    项目需求: TextView显示一段文字,格式为:(消息个数,不确定)条消息 这段文字中名字和数字的长度是不确定的,还要求名字和数字各自有各自的颜色. 一开始我想的是用(转) SpannableStr ...

  2. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  3. Android项目实战(十):自定义倒计时的TextView

    项目总结 -------------------------------------------------------------------------------------------- 有这 ...

  4. android 项目学习随笔十八(三级缓存)

    xUtils的BitmapUtils模块用的就是三级缓存,在项目中尽量还是应用BitmapUtils 三级缓存(机制) import com.itheima.zhsh66.R; import andr ...

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十八之铭文升级版

    铭文一级: 功能二:功能一+从搜索引擎引流过来的 HBase表设计create 'imooc_course_search_clickcount','info'rowkey设计:也是根据我们的业务需求来 ...

  6. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: .QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对于 ...

  7. Android项目实战(十二):解决OOM的一种偷懒又有效的办法

    在程序的manifest文件的application节点加入android:largeHeap=“true” 即可. 对,只需要一句话! 那么这行代码的意思是什么呢? 简单的说就是使该APP获取最大可 ...

  8. Android笔记(四十八) Android中的资源访问——SDCard

    访问存储在SD卡中的文件 使用 Environment.getExternalStorageState(); 判断是否存在内存卡 使用 Environment.getExternalStorageDi ...

  9. Android项目实战(十五):自定义不可滑动的ListView和GridView

    不可滑动的ListView (RecyclweView类似) public class NoScrollListView extends ListView { public NoScrollListV ...

随机推荐

  1. ubuntu 16.04 安装cuda的方法

    很多神经网络架构都需要安装CUDA,安装这个的确费了我不少时间,是要总结一下流程了. 安装这个,最好使用官网的安装步骤和流程,不然,会走很多弯路: https://developer.nvidia.c ...

  2. python基础-字典(8)

    一.字典介绍 字典和列表一样,也是存储多个数据的容器,只不过存储和读取的方式不同 字典的语法格式: 字典名 = {key1 : value1,key2:value2,key3:value3,……} 说 ...

  3. ASP.NET Core微服务+Tabler前端框架搭建个人博客1--开始前想说的话

    写在前面 本人为在读研究生,特别喜欢.NET,觉得.NET的编程方式.语法都特别友好,学习.NET Core已经差不多有一年半了,从一开始不知道如何入门到现在终于可以编写一些小的应用程序,想一想还是非 ...

  4. 课程回顾-Neural Network & Deep Learning

    为什么深度学习发展了数据计算算法发展Logistics RegressionNumpyreshape的计算代价很小,所以你不确定数据维度的时候都可以放上一些解决潜在bug的trick做了归一化之后梯度 ...

  5. Android内存管理篇 - adj的概念与进程adj级别控制

    本文主要介绍Android的lowmemorykiller的oom_adj的相关概念,以及根据一些案例来阐述了解oom_adj对于做Android应用开发的重要意义. 一.lowmeorykiller ...

  6. SharePoint之使用Jquery Mobile定制自己的手机页面

    最近一直很忙,既要创业,又要工作,还有弄弄自己的小项目(已暂停,http://www.codelove1314.com/,如果你不愿意浪费你的业余时间,喜欢弄点小东西,请联系我),所以虽然有很多东西分 ...

  7. WEB安全之垃圾信息防御措施

    防止垃圾评论与机器人的攻击手段如下: 1)IP限制.其原理在于IP难以伪造.即使是对于拨号用户,虽然IP可变,但这也会大大增加共攻击的工作量. 2)验证码.其重点是让验证码难于识别,对于“字母+数字” ...

  8. Http系列目录

    1.Http简史 2.Http协议基本术语 3.Http1.1 4.Http2.0

  9. Asp.Net项目的部署到Linux中(Linux + Jexus+Nginx )

    因为老项目用的Asp.Net Web API技术开发部署到Window系统上,而新项目用的是.Net Core部署到Ubuntu系统中,所以在管理切换上有些不便.于是决定将老项目的测试服部署到Ubun ...

  10. GVRP 的工作机制和工作模式

    GVRP 简介 GVRP 基于 GARP 的工作机制来维护设备中的 VLAN 动态注册信息,并将该信息向其他设备传播:当设备启动了 GVRP 之后,就能够接收来自其他设备的 VLAN 注册信息,并动态 ...