随着项目日益变得复杂、庞大,单一结构项目变得越来越难以维护,平时改个很小的功能,往往有种牵一发而动全身的赶脚,特别难受。最近简单尝试了下组件化后,嗯~真香。

先上个项目结构图,简单分了壳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,距离成型的组件化项目还有很多坑要爬,慢慢爬呗,迈出了这第一步,下一步的落下就没那么恐惧了。

源码地址:戳我

欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点

更多相关文章

  1. Android(安卓)合并AAR踩坑之旅
  2. 如何去准备Android技术面试(简历,技术面)
  3. 软件工程之四则运算开发感悟与收获
  4. 解决 Android(安卓)Studio 创建项目时极其的慢的尴尬
  5. Android(安卓)小项目之---Toast对象详细使用
  6. Cordova实现文件创建和读写操作(支持Android和IOS等)
  7. github上开源的优秀android项目
  8. Android(安卓)5.0 Material Design酷炫风格的开源项目集合
  9. android冷启动与热启动面试知识小结

随机推荐

  1. android 学习八 android selector的使用
  2. Android自己动手实现下拉刷新控件(1)----典
  3. repo 切换分支一种简单的方法
  4. Android 4.4.2 exfat 移植
  5. Android基础开发之手势识别
  6. React Native Android ScrollView 去除阴
  7. 简述Android消息机制及解惑
  8. Android矢量图(二)--VectorDrawable所有
  9. Android应用项目绑定appcom_v7打包时,出现
  10. Android零基础入门第15节:掌握Android Stu