Android项目实战(四十八):架构之组件化开发

什么要组件化开发?

看一下普通项目的结构 , 一个项目下有多个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分为两种类型:

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

apply plugin: ‘com.android.application’

2、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下的:

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

 未完待续。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码神联盟

Nginx | Java工程师必备课 之 Linux下安装Nginx

2523
来自专栏JAVA技术站

maven常用命令

mvn deploy:deploy-file -DgroupId=组名 -DartifactId=唯一标识 -Dversion=版本号 -Dpackaging=...

712
来自专栏有困难要上,没有困难创造困难也要上!

Python进程间通信之命名管道

42110
来自专栏蓝天

MOOON-agent发布:MOOON-agent系统设计与使用说明

6) 可选多种心跳方式,简单心跳不附带数据,富心跳可携带系统状态数据,如CPU使用率、内存使用情况等

1201
来自专栏Java成神之路

Linux_异常_01_CentOS7无法ping 百度

当时设置的网关为:  GATEWAY=192.168.1.1    。是因为这个网关设置错了。这个网关的值要从虚拟机——编辑——虚拟网络编辑器下面去查看。如下图

941
来自专栏信安之路

为Nmap添砖加瓦

Nmap作为一款优秀的端口扫描器,被所有渗透测试人员当作工作中必不可少的辅助工具,它不仅支持多种扫描方式,还支持添加漏洞测试脚本,在强大的lua脚本支持下,使得...

770
来自专栏云计算教程系列

如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

Redis是一个开源键值缓存和存储系统,由于其对多种数据类型(如散列,列表,集合和位图等)的高级支持,也称为数据结构服务器。它还支持群集,使其在高度可用和可扩展...

1473
来自专栏IT技术精选文摘

浅析Nginx的工作模式及原理

(微信公众号:IT技术精选文摘, 微信号:ITHK01, 欢迎订阅) 同Apache http server的Perfork工作模型类似,Nginx也有mast...

5957
来自专栏JavaEdge

Spring Schedule + Redission构建分布式任务调度

所用源码已上传 https://github.com/Wasabi1234/mmall4.0 介绍 ? ? 官网 ? ? ? 集成 ? ? ? image.p...

4433
来自专栏代码GG之家

Scoops android app多主题架构(一)

简要说明 Scoops是一个android应用库,主要解决的是多主题实现方案。通过配置多个R.style.Theme ,代码进行动态设置主题,重启当前界面实现...

25010

扫码关注云+社区

领取腾讯云代金券