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

news2024/10/7 16:22:48

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

目录

  • 简介
  • 组件化、模块化与插件化
  • 开始
  • 创建配置共享文件
  • 打包模式配置
  • 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.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 组件化实战(视频)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE入门学习,遥感云大数据分析、管理与可视化以及在林业应用丨灾害、水体与湿地领域应用丨GPT模型应用

目录 ①海量遥感数据处理与GEE云计算技术实践应用 ②GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用 ③GEE遥感云大数据林业应用典型案例实践及GPT模型应用 ④遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 ①海量遥感…

78. 左旋转字符串

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如输入字…

Talk预告 | 天津大学博士生赵煜:从平面图像中理解空间语义 - 视觉空间位置描述

本期为TechBeat人工智能社区第512期线上Talk&#xff01; 北京时间7月12日(周三)20:00&#xff0c; 天津大学博士生—赵煜的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “从平面图像中理解空间语义-视觉空间位置描述”&#xff0c;届时将与大家…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…

Linux系统编程(信号处理机制)

文章目录 前言一、中断&#xff0c;异常&#xff0c;信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制&#xff0c;信号处理在Linux操作系统中必不可少&#xff0c;这一点值得大家注意&#xff0c;信号又会与中…

打通前后端 -- 创建第一个JSP页面

前言 JSP是由Sun Microsystems公司主导创建的一种动态网页技术标准。 JSP部署于网络服务器上&#xff0c;可以响应客户端发送的请求&#xff0c;并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页&#xff0c;然后返回给请求者。 JSP技术以Java语言作为脚本语言&…

从0-100:约拍小程序开发笔记

背景 摄影师预约小程序功能是一种方便摄影师和客户之间进行预约和安排拍摄的工具。通过该功能&#xff0c;摄影师可以在小程序上设置自己的可预约时间&#xff0c;客户可以根据摄影师的日程安排选择合适的时间进行预约。这样可以提高预约的效率&#xff0c;减少沟通成本&#…

【工具】tempormonkey 同步插件

tempormonkey 同步插件 1.打开tempormonkey的dashboard界面 2.右上角的setting 3.选择谷歌云盘

数字孪生建筑3D可视化运维管理平台降低成本

深圳是我国数字经济重镇&#xff0c;数字经济核心产业增加值占全市GDP逾三成&#xff0c;数字产业化和产业数字化正呈双向融合发展之势。越来越多的企业正与深圳华锐视点一道&#xff0c;利用互联网、大数据、云计算、人工智能、区块链、5G、数字孪生等技术优势&#xff0c;赋能…

Red Hat Linux官网下载地址

注册一个账号&#xff0c;就可以从官网下载最新版本的Red Hat 企业版Linux。

从0到100:定制公交预约小程序开发笔记

业务背景 可以让用户通过手机随时随地进行公交车的预约&#xff0c;无需排队等候&#xff0c;节省了用户的时间和精力。通过公交预约小程序&#xff0c;用户可以提前预约座位&#xff0c;避免了拥挤和等待时间&#xff0c;提高了公交出行的效率。可以根据用户的预约情况&#…

软考A计划-系统集成项目管理工程师-项目成本管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

k8s 的命名空间一直 Terminating

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

AIGCxRPA打造更智能的数字员工,帮助千行万业实现新生产力的跃升

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融行业&#xff0c;长久以来一直是新科技的最佳试验场。作为一个高度数字化、信息密集的行业&#xff0c;金融业对于新科技的吸纳和应用具有天然的优势和需求。数字经济的崛起&#xff0c;更加快了金融行业对智能化的渴望…

低代码开发的兴衰

刚才在思考写一个PPT&#xff0c;然后留下一些辅料&#xff0c;给大家分享出来。 &#xff08;1&#xff09;DOS时代的爽&#xff1a;1981-1995 一、Dbase&#xff1a;一体化&#xff0c;前中后端都搞定 1、后端-数据层&#xff1a;数据库系统&#xff08;DBASE本质其实是个单机…

RPC分布式网络通信框架(四)—— 异步日志模块设计

文章目录 异步日志模块Logger类实现线程安全LockQueue类实现 异步日志模块 问题&#xff1a;由于RPC服务器端采用了epoll&#xff0b;多线程 &#xff0c;并发处理来自客户端的请求&#xff0c;所以有可能造成多线程同时写日志信息。 将日志信息写入一个queue中&#xff0c;然…

MySQL select查询练习

一、创表并插入数据 创表&#xff1a; CREATE TABLE worker (部门号 int NOT NULL,职工号 int NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,性别 char(1) DEFAU…

【ElasticSearch】ES与MySQL数据同步方案及Java实现

文章目录 一、同步实现思路1、方案一&#xff1a;同步调用2、方案二&#xff1a;异步通知3、方案三&#xff1a;监听binlog 二、实现ES与MySQL数据同步1、导入hotel-admin工程2、项目分析3、SpringAMQP整合4、声明队列和交换机5、发送消息MQ6、监听MQ消息7、测试同步功能 一、同…

一百二十九、Kettle——从MySQL增量导入到GreenPlum

一、目标 用Kettle从MySQL增量导入数据到GreePlum 二、前提准备 &#xff08;一&#xff09;kettle已连上MySQL &#xff08;二&#xff09;kettle已连上GreenPlum 三、实施步骤 &#xff08;一&#xff09;打开kettle&#xff0c;新建转换任务。拖拽2个表输入、替换NULL…

【Doris的安装和使用】

1.准备工作 1.1集群规划 1.2 操作系统安装要求 设置系统最大打开文件句柄数(注意这里的*不要去掉) sudo vim /etc/security/limits.conf * soft nofile 65536 * hard nproc 65536设置最大虚拟块的大小 sudo vim /etc/sysctl.conf vm.max_map_count2000000将修改的配置分发给…