Android业务组件化开发实践(一)
1.什么是组件化开发,模块化开发,组件化开发和插件化开发的区别?
模块化开发:
模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。模块我们相对熟悉,比如登录功能可以是一个模块,搜索功能可以是一个模块,汽车的发送机也可是一个模块.
组件化开发:
组件化
就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。
插件化开发:
插件化开发
和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包
。
注意:
组件化不是插件化,插件化是在[运行时],而组件化是在[编译时]。换句话说,插件化是基于多 APK 的,而组件化本质上还是只有一个 APK。
2.
组件化优缺点
组件化开发的好处是显而易见:系统级的控制力度细化到组件级的控制力度,一个复杂系统的构建最后就是组件集成的结果.每个组件都有自己独立的版本,可以独立的编译,测试,打包和部署
产品组件化后能够实现完整意义上的按需求进行产品配置和销售,用户可以选择使用那些组件,组件之间可以灵活的组建.
配置管理,开发,测试,打包,发布完全控制到组建层面,并带来很多好处.比如一个组件小版本进行升级,如果对外提供的接口没有发生任何变化,其他组件完全不需要再进行测试.
但是组件化的实施对开发人员和团队管理者提出了更高水平的要求.相对传统方式,在项目的管理和组织上难度加大,要求开发人员对业务有更深层次上的理解.
3.基本实现思路
代码实现上核心思路要紧记一句话:开发时是 application,发版时是 library。
来看一段 gradle 代码: 开发环境()
2、Android组件化项目实施步骤
1)第一步:配置可自动将组件在Application和Library属性之间切换的方法
我们都知道Android Studio中的Module主要有两种属性,分别为 :
- application属性,可以独立运行的Android程序,也就是我们的APP;
apply plugin: ‘com.android.application’
- library属性,不可以独立运行,一般是Android程序依赖的库文件;
apply plugin: ‘com.android.library’
当我们在开发单独组件的时候,这个组件应该处于application模式,而当我们要将单独组件合并到主工程的时候,就需要将单独组从application模式改为library模式,也许你可以每次切换的时候都去build.gradle文件中去修改,但是你的项目要是有十几个组件的时候,你确定一个个去改?所以我们必须有一种能够动态切换组件模式的方法,做到一次修改,全局组件生效,这个问题就需要通过配置Gradle来解决了。
在Android Studio项目的根目录下有一个
gradle.properties
文件,这个文件主要用来配置Gradle settings的,例如JVM参数等,想要了解这个文件的更多作用请查看
http://www.gradle.org/docs/current/userguide/build_environment.html
,我们今天需要关注的是这个文件的一个特点:我们在
gradle.properties
中配置的字段都可以在
build.gradle
文件中直接读取出来,不用任何多余的代码。
现在我们在
gradle.properties
添加了一行代码,定义一个属性isModule(是否是组件开发模式,true为是,false为否):
工程的gradle
dependencies {
classpath
'com.android.tools.build:gradle:2.2.0'
classpath
'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
app壳的gradle
dependencies
{
compile fileTree(
include
: [
'*.jar'
],
dir
:
'libs'
)
if
(isBuildModle.toBoolean()){
compile project(
':zacklibray'
)
}
else
{
compile project(
':moduleone'
)
}
//router
annotationProcessor
'com.github.mzule.activityrouter:compiler:1.1.7'
}
module 的配置
if
(isBuildModle.toBoolean()){
apply
plugin
:
'com.android.application'
}
else
{
apply
plugin
:
'com.android.library'
}
android {
compileSdkVersion
23
buildToolsVersion
"23.0.3"
defaultConfig {
minSdkVersion
15
targetSdkVersion
23
versionCode
1
versionName
"1.0"
}
buildTypes {
release {
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard-rules.pro'
}
}
sourceSets{
main
{
if
(isBuildModle.toBoolean()){
manifest.srcFile
'src/main/debug/AndroidManifest.xml'
java.srcDirs +=
"src/main/java/"
;
}
else
{
manifest.srcFile
'src/main/AndroidManifest.xml'
java.srcDirs +=
"src/main/java/"
;
}
}
}
resourcePrefix
"module1_"
}
dependencies {
compile fileTree(
include
: [
'*.jar'
],
dir
:
'libs'
)
compile project(
':zacklibray'
)
//router
annotationProcessor
'com.github.mzule.activityrouter:compiler:1.1.7'
}
lib包
apply
plugin
:
'com.android.library'
android {
compileSdkVersion
23
buildToolsVersion
"23.0.0"
defaultConfig {
minSdkVersion
14
targetSdkVersion
23
versionCode
1
versionName
"1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled
false
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'
, {
exclude
group
:
'com.android.support'
,
module
:
'support-annotations'
})
compile
'com.android.support:appcompat-v7:23.1.1'
compile
'com.github.mzule.activityrouter:activityrouter:1.2.2'
}
ActivityRouter
中还实现了在浏览器中启动应用的界面,主要思路是启动一个透明activity,然后在activity中解析url,再启动目标activity。
ActivityRouter
也支持直接解析http,打开web界面。本文中不再进行分析,感兴趣的同学可以去看看源码。
在每个页面配置
annotationProcessor
'com.github.mzule.activityrouter:compiler:1.1.7'
compile
'com.github.mzule.activityrouter:activityrouter:1.2.2'
在每个module中新建个
@Module(
"one"
)
public class
TestOne {
}
// 跳转页面的配置
@Router(
"module_one"
)
public class
TestOneActivity
extends
Activity {
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_test_one
);
}
}
application的配置
@Modules({
"main"
,
"one"
})
public class
MyAplication
extends
Application {
@Override
public void
onCreate() {
super
.onCreate();
}
}
// 点击启动
Routers.
open
(MainActivity.
this
,
"modularization://module_one"
);
下载地址
更详细可以看一下文章: