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

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

目录

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

简介

什么是组件化?

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

为什么要使用组件化?

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

组件化架构构成:
在这里插入图片描述

组件化、模块化与插件化

/概念优点
组件化解耦复杂系统时,将多个功能模板拆分、重组的过程。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完成创建。

完成创建
在上图中,创建了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.compileSdkdefaultConfig {minSdk app_android.minSdktargetSdk app_android.targetSdkversionCode app_android.versionCodeversionName 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><activityandroid:name=".MainActivity"android:exported="true" ></activity></application>
</manifest>

APT与JavaPoet

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

量子近似优化算法(QAOA)入门(1):从量子绝热算法(QAA)角度的直观理解

文章目录 前言&#xff1a;量子计算的本质是测量一、基于量子逻辑电路的常用算法1.NISQ&#xff1a;Noisy Intermediate-Scale Quantum&#xff08;含噪声中等规模量子&#xff09; 二、量子绝热算法&#xff08;QAA&#xff1a;Quantum Adiabatic Algorithm&#xff09;1.QAA的…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

查看某个三方依赖jar包是在哪个pom引入的(springboot+idea)

项目springboot1升级2版本&#xff0c;日志框架使用的是log4j&#xff0c;升级到springboot2版本某些依赖引入了logback依赖包&#xff0c;然后项目启动报错&#xff1a; 查看这个SLF4JLoggerContextFactory这个类是在哪个jar包下 使用idea的maven依赖图查看功能寻找是哪个p…

page_dewarp实现弯曲文本矫正

朋友们&#xff0c;如果你使用ocr&#xff0c;再识别的时候会遇到文本扭曲的问题&#xff0c;为了解决这个问题&#xff0c;需要进行弯曲文本矫正&#xff0c;这里推荐一个开源项目&#xff0c;可以使用上面的功能进行矫正&#xff0c;不过里面可能需要改动一些代码&#xff0c…

Go []uint8和string的爱恨情仇

先上代码&#xff1a; package mainimport "fmt"func main() {byteSlice : []uint8{52, 44, 51} // 示例字节切片str : string(byteSlice)fmt.Printf("byteSlice:%v\r\n", str) }// 执行-输出 byteSlice:4,3 干货&#xff1a; 在Go语言中&#xff0c;[]u…

【逻辑回归实例】

逻辑回归&#xff1a;从理论到实践 在本文中&#xff0c;我们将介绍一种被广泛用于二分类问题的机器学习模型——逻辑回归。我们将通过一个实例&#xff0c;深入解析如何在 Python 环境中实现逻辑回归。 源数据下载链接 1. 什么是逻辑回归&#xff1f; 逻辑回归是一种用于解…

怎么给pdf文件加密?pdf文档如何加密

在数字化时代&#xff0c;保护个人和机密信息的重要性越来越受到关注。PDF&#xff08;Portable Document Format&#xff09;是一种广泛使用的文件格式&#xff0c;用于共享和存储各种类型的文档。然而&#xff0c;由于其易于编辑和复制的特性&#xff0c;保护PDF文件中的敏感…

Django_自定义文件存储类并将图片上传到FastDFS

目录 将图片到FastDFS和浏览的流程图 使用自定义文件存储类 1、定义存储类 2、创建FastDFS的配置文件 3、修改settings.py配置 4、上传图片进行验证 4.1 定义一个包含ImageField字段的模型类 4.2 登录django的admin后台 4.3 上传图片 4.4 查看图片 源码等资料获取方…

如何在WordPress网站中嵌入TikTok视频(3个简单方法)

您想轻松地将 TikTok 视频嵌入您的 WordPress 网站吗&#xff1f; 如果您已经创建了成功的、病毒式传播的 TikTok&#xff0c;那么将这些视频发布到您的网站也是有意义的。通过这种方式&#xff0c;您只需很少的额外努力就能获得更多的观看次数、参与度和社交媒体关注者。 在…

k8s 的命名空间一直 Terminating

查看命名空间状态&#xff0c;[NAMESPACE] 处于 Terminating kubectl get ns使用强制删除命令没有效果 kubectl delete namespace [namespace] --force --grace-period0 解决办法&#xff1a;删除部署文件 yaml 中的 finalizers 属性 kubectl get namespace [NAMESPACE] -o …

基于LLM大模型开发Web App生成器

随着越来越多的代码生成模型公开可用&#xff0c;现在可以以我们以前无法想象的方式进行文本到网络甚至文本到应用程序。 本教程介绍了一种通过流式传输和渲染内容来生成 AI Web 内容的直接方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、在 Node 应用程序中…