【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点,本着研究透这玩意的精神,从组件化的简介开始说起。

目录

  • 简介
  • 组件化、模块化与插件化
  • 开始
  • 创建配置共享文件
  • 打包模式配置
  • APT与JavaPoet

简介

什么是组件化?

将多个功能模板拆分、重组的过程。

为什么要使用组件化?

1、加快编译速度,提高开发效率,增强可维护性、移植性。
2、高内聚(软件模块是由相关性很强的代码组成,只负责一项任务,即单一责任原则)、低耦合(模块间的依赖关系低)。
3、使每个业务模块变得相对独立,各个组件在组件模式下可以独立开发调试,集成模式下又可以集成到”app壳工程”中,从而得到一个具有完整功能的APP。

组件化架构构成:
【Android】从零搭建组件化项目_第1张图片

组件化、模块化与插件化

/ 概念 优点
组件化 解耦复杂系统时,将多个功能模板拆分、重组的过程。 1、提高组件复用性。
2、提高工程编译速度。
3、降低组件间的耦合。
4、能够独立运行在设备上。
5、利于多人团队协作开发。
模块化 将代码库组织为多个松散耦合的独立部分的做法。 1、提高代码复用性。
2、降低组件间的耦合。
3、利于多人团队协作开发。
插件化 插件化源于免安装运行apk的想法,免安装的apk可以理解为插件,支持插件的app成为宿主。 1、动态更新插件。
2、解决方法数超过65535的问题。
3、宿主和插件分开编译,提升开发效率。
4、减少安装Apk的体积、按需下载模块。

组件化和插件化的区别

  • 组件化:组件化开发就是将一个app分成多个模块,每一个模块都是一个组件,开发过程中让这些组件相互依赖或者单独调试。最终发布将这些组件合并统一成一个apk。
  • 插件化:插件化开发是将整个app拆分成多个模块,这些模块包含一个宿主和多个插件,每个模块都是一个apk,最终打包的时候宿主apk和插件apk分开打包。

开始

启动Android Studio创建一个Android项目,在项目里new Module,弹出的Create New Module中选择Android LibaryPhone & Tablet,配置完成Module name等参数后点击finish完成创建。

【Android】从零搭建组件化项目_第2张图片
在上图中,创建了commonorder组件,common组件推荐作为一个基础库,第三方的一些都在该库进行依赖,其它组件库使用第三方库直接引用common组件即可,一定程度上避免了组件库重复引用的问题。

创建好的Module文件目录下都有一个属于自己的build.gradle文件,Gradle文件执行顺序:settings.gradle > Project build.gradle > Module build.gradle

Module build.gradle中可以通过plugins修改当前Modelapplicationlibrary,如下:

plugins {
    id 'com.android.application'  // application,可以作为app独立运行
    id 'com.android.library'      // library,可作为aar包引入application包使用
}

com.android.applicationcom.android.library无法共存,同一个Model只能存在一个。不同的Model可以相互使用implementation引入到Model中,使得Model里的方法可以相互调用。

创建配置共享文件

在Android项目中,每个Module都有自己的.gradle文件,Gradle是一个使用Groovy语言(核心代码是 Java )编写的构建工具,具体使用教程可参考:来自Gradle开发团队的Gradle入门教程

使用组件化的项目一般会有多个 Module ,为了使不同 Module 的版本库配置使用相同的参数,需要在项目根目录创建一个app_config.gradle,用以共享组件间相同的配置,避免过度碎片化。

app_config.gradle:

ext {
    app_android = [
            compileSdk : 32,
            minSdk     : 21,
            targetSdk  : 32,
            versionCode: 1,
            versionName: "1.0"
    ]
}

app_config.gradle 要想使其它 Module 都可以引用,需要在 Projectbuild.gradle 中对其进行全局引用。

apply from: 'app_config.gradle'

这样一来,所有 Modulebuild.gradle 就可以使用 app_config.gradle 的共享参数了

android {
    compileSdk app_android.compileSdk

    defaultConfig {
        minSdk app_android.minSdk
        targetSdk app_android.targetSdk
        versionCode app_android.versionCode
        versionName app_android.versionName
    }
}

打包模式配置

组件化的优点中有一个加快编译速度、提升开发效率的功能。
上面说到:在 Modulebuild.gradle 可以通过修改 applicationlibrary 控制当前组件为打包或集成模式。为了方便后续修改打包模式,app_config.gradle 增加了一个 isRelease 的打包配置参数。

ext {
    // 控制打包的模式
    isRelease = true
}

通过控制 isRelease 的布尔值,即可实现自动配置对应的 build.gradle 值,当然,前提是自动配置的代码提前写好。

// 公用的插件
plugins {
    id 'org.jetbrains.kotlin.android'
}
// 根据打包模式使用的插件
if (isRelease){
    apply plugin : 'com.android.library'
} else {
    apply plugin : 'com.android.application'
}

当模块处于打包模式时,为避免安装一次出现两个应用图标的问题,整个App工程的所有 AndroidManifest.xml 只能出现一个带android.intent.action.MAINintent-filter

针对这种情况需要额外对不同打包模式下的 AndroidManifest.xml 文件做处理。

为此,我们可以在除主工程以外,需要在 debug 期间作为 application 工程独立运行项目的 build.gradle 文件添加以下配置。

android {
	// 源集 —— 用来设置Java目录或者资源目录
	sourceSets {
	    main {
	        if (!isRelease) {
	            // 如果是组件化模式,需要单独运行时使用该文件
	            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
	        } else {
	            // 集成化模式,整个项目打包时使用该文件
	            manifest.srcFile 'src/main/AndroidManifest.xml'
	            java {
	                // release 时 debug 目录下的Java文件不需要合并到主工程
	                exclude '**/debug/**'
	            }
	        }
	    }
	}
}

接着在main文件夹添加debug文件,将用到的 AndroidManifest.xml 文件放入里面,并将 src/main/AndroidManifest.xml 文件的配置设置为集成模式,可参考如下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <activity
            android:name=".MainActivity"
            android:exported="true" >
        activity>
    application>
manifest>

APT与JavaPoet

组件化的进一步使用需要用到APTAPT全称为Annotation Processing Tool,即注解处理器。有很多的框架都是基于APT实现,例如:ButterKnifeDaggerEvenBusARouter等。

关于 APTJavaPoet 的相关知识已整理好相关文章 【Android】APT与JavaPoet学习与实战

前往本文项目 【Android】从零搭建组件化项目

参考文档
1、Android 组件化实战(视频)

你可能感兴趣的:(Android,android,组件化,kotlin,java)