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

news/2024/5/19 21:21:48/ 标签: android, gradle, 插件, 自动复制文件, 打包, plugin, maven

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底部。 …

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架(Java Collections Framework)是一个强大的、高度灵活的数据结构库,它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类: Collection: 是单例集合类的顶层接口,包括Lis…

华为OD-C卷-伐木工[200分]Python3-100%

题目描述 一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。 规定切割后的每根木头长度都为正整数;也可以不切割,直接拿整根树木进行交易。 请问伐木工如何尽量少的切割,才能使收益最大化? 输入描述 木材的长度(X ≤ 50) 输出描…

OpenHarmony轻量系统开发【8】其它驱动开发示例

8.1代码示例 OpenHarmony代码中,Hi3861提供了绝大部分的驱动示例代码,文件路径: device\soc\hisilicon\hi3861v100\sdk_liteos\app\demo\src 开发者可以参考,文件如下: 8.2如何使用 (1)创建文…

安全中级-初开始

一、网络基础 重要点:TTL值(防环,linux64.Windows128 ),IP数据包包头格式字节(20) 标识标志偏移量起到什么作用(数据超过1500会分片) wireshack抓包会有一个MSS&#x…

项目7-音乐播放器1+BCrypt加密

1.创建项目 1.1 引入依赖 1.2 yml相关配置 application.yml spring:profiles:active: prod mybatis:mapper-locations: classpath:mapper/**Mapper.xmlconfiguration:map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdO…

HTMLCSS(二)---HTML常见标签

2.1标题标签 HTML标题标签用于定义文档中的标题和子标题。HTML提供了六个级别的标题&#xff0c;分别是<h1>到<h6>&#xff0c;其中<h1>表示最高级别的标题&#xff0c;<h6>表示最低级别的标题。这些标签通常用于创建内容结构&#xff0c;帮助搜索引擎…

笔记:定义一个函数,要求从键盘输人两个数,调用该函数得出两个数的最大公约数,并显示在屏幕上。

文章目录 前言一、什么是调用该函数得出两个数的最大公约数&#xff1f;二、编写代码1.代码2.优化代码 总结 前言 题目&#xff1a;定义一个函数&#xff0c;要求从键盘输人两个数&#xff0c;调用该函数得出两个数的最大公约数&#xff0c;并显示在屏幕上。 在数学中&#x…

云计算:OVS 集群 使用VXLAN 流表

目录 一、实验 1.环境 2. OVS 集群 使用VXLAN 流表&#xff08;单租户&#xff09; 3. OVS 集群 使用VXLAN 流表&#xff08;多租户&#xff09; 二、问题 1.如何添加VXLAN接⼝ 2.virsh修改云主机MAC报错 一、实验 1.环境 (1) 主机 表1 宿主机 主机架构软件IP网卡备…

vue3滚动条重置

由于单页面应用的原理&#xff0c;使用vue搭建的项目在路由切换时并不会刷新整个页面。因此在有滚动条的页面会存在滚动条不能自动重置的问题。在最近的项目中就遇到了这种问题&#xff0c;因此记录一下。 1.切换路由&#xff1a; <el-main> <!--<router-view…

Linux下GPU虚拟化

在新Linux内核中体验GPU虚拟化 从内核4.10&#xff0c; 支持 virtual gpu 的代码开始汇入主线程。这部分代码主要由两部分组成&#xff1a; 首先&#xff0c; mediated 设备框架&#xff08;mdev&#xff09;&#xff0c;基本上&#xff0c;这部分代码使得内核驱动开始用vfio框…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树&#xff08;递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…