随着项目日益变得复杂、庞大,单一结构项目变得越来越难以维护,平时改个很小的功能,往往有种牵一发而动全身的赶脚,特别难受。最近简单尝试了下组件化后,嗯~真香。
先上个项目结构图,简单分了壳app、主页main、登录模块login和个人中心模块member,另外还简单拆分了公共组件、基础组件和路由。
首先创建壳工程,app模块下里面什么也不需要,它只是个空客,如果不小心默认生成了MainActivity,删掉;然后修改AndroidManifest.xml
,去掉启动Activity相关,修改后如下
将模块main、login和member相继创建出来,这里演示创建main模块,其他模块的创建类似。
这里选 Phoen & Tablet Module ,因为开发阶段每个Module都可以作为一个app独立运行。选 Next
命名Module名称、包名语言(Java or Kotlin)和最低支持Android SDK。Next后选择Activity,这里可以不选,我选了Empty Activity。再Next后默认使用MainActivity点Finish。这里需要注意一点的是,后面新建其他模块的时候,建议各模块新建的类不要重复,虽然可能不会报错,但是后面编译的时候可能会遇到一些奇怪的问题。
其他的模块也如法炮制的创建就好了,这块还是很简单的。
统一版本管理是必要的,这样做的好处是便于管理,避免依赖冲突等等。
在项目根目录新建config.gradle配置文件,配置文件中统一管理SDK,Android库和第三方库
然后在project的build.gradle中依赖它
apply from: 'config.gradle'
buildscript {
repositories {
google()
jcenter()
}
...
isApplication
是config.gradle的配置,为true时,各模块作为独立应用运行,反之则是项目的一个module。各模块如下配置
if (rootProject.ext.android.isApplication) {
apply plugin: 'com.android.application'
}else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
if (rootProject.ext.android.isApplication) {
applicationId "com.smart.main"//作为module时,不允许有自己的applicationId
}
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
//略...
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
rootProject.ext.dependencies.commonModuleDependencies.each {
implementation project(it)
}
annotationProcessor project(path: ':anotation_compiler')
testImplementation rootProject.ext.dependencies.testDependencies
androidTestImplementation rootProject.ext.dependencies.androidTestImplementation
}
到这里,组件化项目基本成型了,修改config.gradle中的isApplication
等于true时,各个模块可独立运行;等于false时,各个模块就是项目的一部分,不能独立运行,可以观察模块图标。
做完上面的工作后,isApplication
等于false项目并不能跑起来。原因是各个模块都有属于自己的LAUNCHER Activity,所以还需要做处理。这里我以Login模块为例
在main目录下新建manifest文件夹(文件名自定),制作一份AndroidManifest.xml在次目录,当Login作为module时使用,里面只声明组件。
在 android 下添加 sourceSets,isApplication
为true时使用默认的,为false时使用自定义的 AndroidManifest.xml
sourceSets{
main{
if (rootProject.ext.android.isApplication){
manifest.srcFile 'src/main/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
}
}
}
到此,无论出于哪种模式下,项目都能正常跑起来了。当然了,这只是一个很简单的Demo,距离成型的组件化项目还有很多坑要爬,慢慢爬呗,迈出了这第一步,下一步的落下就没那么恐惧了。
源码地址:戳我
欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点