真香系列之Android(安卓)组件化开发
随着项目日益变得复杂、庞大,单一结构项目变得越来越难以维护,平时改个很小的功能,往往有种牵一发而动全身的赶脚,特别难受。最近简单尝试了下组件化后,嗯~真香。
先上个项目结构图,简单分了壳app、主页main、登录模块login和个人中心模块member,另外还简单拆分了公共组件、基础组件和路由。
开始搭建
首先创建壳工程,app模块下里面什么也不需要,它只是个空客,如果不小心默认生成了MainActivity,删掉;然后修改AndroidManifest.xml
,去掉启动Activity相关,修改后如下
业务模块创建
将模块main、login和member相继创建出来,这里演示创建main模块,其他模块的创建类似。
1、创建Module
2、选择Module类型
这里选 Phoen & Tablet Module ,因为开发阶段每个Module都可以作为一个app独立运行。选 Next
3、配置Module信息
命名Module名称、包名语言(Java or Kotlin)和最低支持Android SDK。Next后选择Activity,这里可以不选,我选了Empty Activity。再Next后默认使用MainActivity点Finish。这里需要注意一点的是,后面新建其他模块的时候,建议各模块新建的类不要重复,虽然可能不会报错,但是后面编译的时候可能会遇到一些奇怪的问题。
其他的模块也如法炮制的创建就好了,这块还是很简单的。
统一版本管理
统一版本管理是必要的,这样做的好处是便于管理,避免依赖冲突等等。
1、配置文件config.gradle
在项目根目录新建config.gradle配置文件,配置文件中统一管理SDK,Android库和第三方库
然后在project的build.gradle中依赖它
apply from: 'config.gradle'buildscript { repositories { google() jcenter() } ...
2、Module中版本管理
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时,各个模块就是项目的一部分,不能独立运行,可以观察模块图标。
AndroidManiFest资源合并
做完上面的工作后,isApplication
等于false项目并不能跑起来。原因是各个模块都有属于自己的LAUNCHER Activity,所以还需要做处理。这里我以Login模块为例
1、不同模式下的Manifest
在main目录下新建manifest文件夹(文件名自定),制作一份AndroidManifest.xml在次目录,当Login作为module时使用,里面只声明组件。
2、module下build.gradle配置
在 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,距离成型的组件化项目还有很多坑要爬,慢慢爬呗,迈出了这第一步,下一步的落下就没那么恐惧了。
源码地址:戳我
欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点
更多相关文章
- Android(安卓)合并AAR踩坑之旅
- 如何去准备Android技术面试(简历,技术面)
- 软件工程之四则运算开发感悟与收获
- 解决 Android(安卓)Studio 创建项目时极其的慢的尴尬
- Android(安卓)小项目之---Toast对象详细使用
- Cordova实现文件创建和读写操作(支持Android和IOS等)
- github上开源的优秀android项目
- Android(安卓)5.0 Material Design酷炫风格的开源项目集合
- android冷启动与热启动面试知识小结