Android Gradle 开发与应用 (七) : 实现打包自动复制文件插件

news/2024/12/22 2:21:57/

1. 前言

项目中遇到了一个问题 :

其中一个模块MyLibraryassets文件夹中,需要存放很多文件(每个文件对应一个功能)。

这样导致的问题是MyLibrary打出的这个aar包体积特别大。

如果把MyLibrary严谨地拆解成若干个Module又比较费时,对于现在业务现状来说也显得没那么必要。

那么能不能在上传MyLibrary这个aar的时候,自动复制相应的文件assets目录下,打出不同功能的aar呢 ?

这就需要自己开发一个Gradle插件来完成这个功能了。

本文环境

  • Android Studio 版本 : Android Studio Hedgehog | 2023.1.1
  • Gradle版本 : gradle-8.2
  • AGP版本 : 8.2.0
  • 项目结构 : 项目有app模块和MyLibrary模块,使用build.gradle (Groovy语言),appassets目录下,有test1.sotest2.sotest3.so这三个文件

2. 配置上传Maven仓库

首先我们把MyLibrary配置上传Maven插件,也就是maven-publish

对于这部分功能不了解的同学可以先看我的这篇博客 : Android Module上传到Maven仓库 及 实现同时上传到多个Maven仓库

下面我们简单讲述一下

复制maven_upload.gradle到项目根目录下

apply plugin: 'maven-publish'//TODO 这里填你Maven仓库的地址
def RELEASE_REPOSITORY_URL = "https://devops-maven.xxxxx.com/repository/yyyyy/"
//TODO 这里填你Maven仓库的账号
def NEXUS_USERNAME = "*********"
//TODO 这里填你Maven仓库的密码
def NEXUS_PASSWORD = "*********"afterEvaluate {publishing {repositories {maven {name("ReleaseMaven")url = RELEASE_REPOSITORY_URLcredentials {username = NEXUS_USERNAMEpassword = NEXUS_PASSWORD}}}publications {Production(MavenPublication) {from components.releasegroupId = rootProject.ext.GROUPartifactId = rootProject.ext.POM_ARTIFACT_IDversion = rootProject.ext.VERSION_NAME}}}
}

MyLibrary中依赖

rootProject.ext.GROUP = "com.heiko.mytest"
rootProject.ext.POM_ARTIFACT_ID = "mylibrary"
rootProject.ext.VERSION_NAME = "1.0.0"
apply from: "${project.rootDir}/maven_upload.gradle"

Sync一下,可以看到gradle中多了publishing这个文件夹,里面的publishProductionPublicationToReleaseMavenRepository就是用来将MyLibrary打包并上传到Maven仓库的Gradle命令了。

在这里插入图片描述

3. Gradle相关操作

3.1 复制文件

from是原目录,into是目标目录,include可以指定需要复制的文件,onlyIf可以用来判断是否执行复制任务。

task copyFiles(type: Copy) {from 'src/main/assets'into 'build/outputs/assets'//include 'test1.txt','test2.txt' //指定文件名include '**/*.txt' //根据*匹配符合要求的文件onlyIf {true}
}

3.2 删除文件

task myDeleteFilesInDir(type: Delete) {//delete 'src/main/assets/test1.txt'  //删除test1.txt//delete 'src/main/assets/test1.txt' //删除文件夹下所有的文件,assets文件也会被删除delete fileTree('src/main/assets') //删除文件夹下所有的文件,assets文件不会被删除
}

3.3 dependsOn

dependsOn表示一个任务需要另一个任务先完成,可以理解为依赖于需要先做,这意味着在执行这个任务之前,它所依赖的任务必须首先执行。

例如,如果你有一个任务叫做compile,它需要在clean任务之后执行,就可以像这样声明依赖关系:

task clearTask {doLast {println("执行 clear.doLast")}
}task compileTask {doLast {println("执行 compile.dolast")}
}compileTask.dependsOn(clearTask)

这样,每当你运行compile任务时,Gradle会首先运行clean任务。

在这里插入图片描述
执行compile任务的日志如下

> Task :app:clearTask
执行 clear.doLast> Task :app:compileTask
执行 compile.dolastBUILD SUCCESSFUL in 510ms

更通俗的理解 :
dependsOn就像是做饭的顺序:你首先需要准备食材,然后才能开始烹饪。同样地,如果你有一个任务依赖于另一个任务,那么你需要在开始当前任务之前先完成那个依赖任务。如果没有这种依赖关系,那么任务可能会在错误的时机执行,导致结果不正确或者出现错误。

//准备食材任务
task prepareFood(){}//做饭任务
task cooking(){}//做饭任务 依赖于 准备食材任务
cooking.dependsOn(prepareFood)

在这里插入图片描述

3.4 finalizedBy

finalizedBy用于指定一个任务另一个任务完成之后执行,可以理解为在完成后执行

Gradle中,finalizedBy用于指定一个或多个任务,这些任务将在关联任务执行完毕后执行,无论关联任务是否成功。可以把这个理解为一种清理或收尾的工作。

举个例子,我们有一个任务A,它被finalizedBy任务B,那就意味着在任务A执行完之后,无论任务A是否成功,任务B都会被执行。

这就好比一个厨师在做完一道菜(任务A)之后,无论这道菜是否做


http://www.ppmy.cn/news/1424449.html

相关文章

Python项目2 数据可视化

生成数据 数据可视化 指的是通过可视化表示来探索数据,它与数据挖掘 数据挖掘 紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表 示的小型数字列表,也可以是数以吉字节的数据。 漂亮地呈现数据关…

共享负载均衡后端的主机健康检查状态是异常的解决

场景:运维同事配置了后端主机,但是健康检查显示异常。其中有一台主机是正常的,权重为1。另外两台健康检查异常的权重为0。 curl 内网地址和端口是可以正常访问业务的,返回的状态码也是200。后端排查日志,可以发现正常…

免费GPT-3.5部署指南

OpenAI近期宣布,GPT-3.5现已支持无账号使用,这一变化无疑为全球AI爱好者带来了福音。然而,由于网络和地域限制,国内许多朋友仍然面临着使用上的挑战。 今天,我将向大家推荐两个开源项目,它们能够帮助您在国…

ChatGPT让论文写作更高效,让学术研究更精彩

ChatGPT无限次数:点击直达 ChatGPT让论文写作更高效,让学术研究更精彩 引言 在当今数字化时代,人工智能技术的发展为学术研究者提供了更多创新的机会和工具。其中,自然语言处理模型如ChatGPT在论文写作领域展现出强大的潜力。本文将介绍如何…

LeetCode-2923. 找到冠军 I【数组 矩阵】

LeetCode-2923. 找到冠军 I【数组 矩阵】 题目描述:解题思路一:找到没有1存在的列即可。解题思路二:找到和等于n-1的行。解题思路三:打擂台【时间复杂度:O(n)】 题目描述: 一场比赛中共有 n 支队伍&#x…

基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测 完整代码:基于双向长短期神经网络BILSTM的线损率预测,基于gru的线损率预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/d…

可持续测试自动化应遵循的最佳实践

缺乏可持续性是整个行业测试自动化崩溃的首要原因。测试团队陷入了自动化维护的恶性循环,却无法从练习中获益。虽然团队不断追赶以保持脚本完整,但目标却退居二线。虽然测试自动化在上述背景下已经成为游戏规则的改变者,使开发人员能够简化他…

谈谈前端CSS盒模型

前言: 什么是CSS盒模型?盒模型的构造? 在前端开发中,CSS 盒模型是一种非常基础且核心的概念,它描述了文档中的每个元素被框架处理的方式。 ---- 打开浏览器开发者工具,查看Elements右侧下的Styles底部。 …