Android 组件化开发
前言
以前我在一家公司遇到这样的问题,他们时专门给客户做各种各样的app的,写了很多应用,基本上都有一些通用的功能,本来是有一个功能齐全的项目,可是随着人员的进出,标准项目没人维护,于是git上建了一堆不同功能的app分支,后来的人每当修改完这个分支的bug,又得去修改其他分支的问题,至少十几个的分支,维护起来相当耗费精力,在这种情况下,网上查了一堆资料,知道了有个东西叫组件化开发,当然还有个插件化,但本篇文章只讲组件化的一些个人理解。
目的
将整个app按模块分成几个Module,公用的部分封装成一个单独的Module,降低代码之间的耦合性,每个不同的app只需要调用不同的Module就行,处理bug时也只需要修复有问题的Module就可以,然后调用调用最新的Module就可以。
原理
我们的项目中主要是各种Module组成的,可运行的在对应的build.gradle配置为apply plugin: ‘com.android.application’,不能运行的在对应的build.gradle配置为apply plugin: ‘com.android.library’,而组件化的开发其实就是将各种Module动态配置,开发的时候每个Module都设置为application,变成可单独运行的apk,做release版本时在将其他的Module都设置为library。
-
组件化
-
下图我是我一个登录的demo,其他的Module默认是library,现在如何将这个项目组件化
组件化就是为了在开发的时候将各个Module变成单独可以运行的apk,而发布时合成到一起变成一个完整功能的apk。所以
-
步骤一:
先在项目的gradle.properties中添加IsBuildMudle=false|true这句话,false代表其他的Module以library的形式存在,而true代表以application的形式存在。
-
步骤二:
在app Module的gradle中dependencies下重新配置引入其他Module的方式,原来的时这样写compile project(path: ‘:loginlibrary’),而现在需要这么写
if (!IsBuildMudle.toBoolean()) {
compile project(path: ‘:loginlibrary’)
} else {
compile project(path: ‘:baselibrary’)
}修改loginlibrary中gradle中默认以library引入的方式
apply plugin: ‘com.android.library’,改为if (IsBuildMudle.toBoolean()) {
apply plugin: ‘com.android.application’
} else {
apply plugin: ‘com.android.library’
} -
步骤三:
切换状态的Module还需要配置不同的AndroManifest.xml文件,应为作为application的时候是需要配置启动Activity的
而作为library时,AndroidManifest.xml中是这样的
如何切换使用这俩个文件呢,在对应Module的gradle中的android中添加一下代码:
sourceSets {
main {
if (IsBuildMudle.toBoolean()) {
manifest.srcFile ‘src/main/debug/AndroidManifest.xml’
} else {
manifest.srcFile ‘src/main/release/AndroidManifest.xml’
}
}
}
resourcePrefix “modulelogin_”resourcePrefix的意思的是通过给模块设置不同的资源前缀,可以避免重复命名。
完整的Module结构图
总结
组件化的就是为了将项目中的Module可以单独出来开发测试,便于以后的项目维护。不管项目有几个Module,都需要有切换application,library的判断,Moudle中的AndroidManifest也要记得在gradle中android下添加配置做切换
注:baselibrary不要管,它就是一个公用的library,其他的Module都需要调用到它,所以不需要这种配置,每次更换IsBuildMudle配置时需要重新同步一下项目,个人见解,希望对大家有用。