Android gradle 构建
Understanding Tasks - Gradle task
| kapt 是 Kotlin 语言的注解处理器,它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。 | 需要 Kotlin 编译器来解析和处理注解;使用 APT 来生成代码,它是一个独立的工具,用于处理 Java 注解 |
| 依赖注入:类通常需要引用其他类。例,Car 类可能需要引用 Engine 类。这些必需的类称为依赖项,在此示例中,Car 类必须拥有 Engine 类的一个实例才能运行。 | 以参数形式提供。应用可以在构造类时提供这些依赖项,或者将这些依赖项传入需要各个依赖项的函数。在上面的示例中,Car 构造函数将接收 Engine 作为参数。构造函数注入 && 字段注入 https://developer.android.com/training/dependency-injection?hl=zh-cn |
| Hilt 依赖注入框架 | 模块/组件间注入依赖 https://developer.android.com/training/dependency-injection/hilt-android?hl=zh-cn |
| tasks.named | task myTask = tasks.named("myTaskName")从人物列表中返回myTaskName |
| tasks.register("qualityCheck") { 向构建脚本中注册任务(name,tasktype) | Tasks.register<Zip>("packageApp") { } 构建内置或自定义任务的实例 |
| Gradle 分为两类任务 | Lifecycle tasks生命周期任务 Actionable tasks 可操作任务,连接到生命周期 |
| gradle工程构建的生命周期 Build Lifecycle 自定义任务可以分配配置阶段 执行阶段:开始执行,结束执行阶段 执行期间是表示TaskAction执行 | setting.kts:初始化阶段 build.gradle.kts: 配置阶段,以下demo中task.register是在配置阶段执行,所以里面的println也在配置阶段执行 执行阶段:dofirst{} dolast{}
|
| Gradle基础任务类型 | Task的子类, Zip, Copy, or Delete Copy: 用于复制文件和目录。 |
| 自定义任务类型DefaultTask Writing Tasks Registering a task - using a task (implemented by you or provided by Gradle) in your build logic. Configuring a task - defining inputs and outputs for a registered task. Implementing a task - creating a custom task class (i.e., custom class type). | public abstract class GenerateReportTask : DefaultTask() {//声明自定义类型 @get:InputDirectory //自定义任务输入sourceDirectory @get:OutputFile //自定义任务输出 @TaskAction //任务操作的具体逻辑 fun generateReport() {} } tasks.register<GenerateReportTask>("generateReport") { tasks.build { |
| 任务配置(传参) 1.named 2.register+配置块 | build.gradle.kts tasks.named<Copy>("myCopy") { from("resources") into("target") include("**/*.txt", "**/*.xml", "**/*.properties") } |
| 自定义任务-不定义任务类型DefaultTask Advanced Tasks | tasks.register("printVersionDynamic") { inputs.property("version", project.version.toString()) //声明变量 doLast { println("Version: ${inputs.properties["version"]}") //向doLast注入任务回调 } } |
| 可操作任务链接到生命周期 | tasks.build { //build生命周期任务依赖packageApp任务,所以会先执行packageApp dependsOn(packageApp) } |
| 查看任务 | ./gradlew :app:tasks |
| Android gradle 配置集合(kts迁移) https://developer.android.com/build?hl=zh-cn | |
| 编写Android插件,对已有构建流程扩展修改 | https://developer.android.com/build/extend-agp?hl=zh-cn |
| Android依赖问题及冲突解决 | aar打包、发布到maven、带第三方依赖的打包、带本地module依赖的打包_aar打包第三方依赖库-CSDN博客 https://juejin.cn/post/7186908438058762277 |
| Android kts引用其他构建脚本 | apply { from("library.gradle") } includeBuild("library.gradle") |
gradle插件和gralde版本不匹配问题: com.android.tools.build:gradle和gradle-wrapper.properties | 彻底解决Android Studio Minimum supported Gradle version is X.Y.Z. Current version is x.y.z.问题_minimum supported gradle version is 6.7.1. current-CSDN博客 https://developer.android.com/build/releases/gradle-plugin?hl=zh-cn#updating-gradle |
| 自定义例子: tasks.register("buildAll") { |
|
| tasks.getByName("xxx") | 获取模块中的gradle任务 |
| android.testVariants | 获取测试变体(assembleDebugAndroidTest) |
| libraryVariants | 获取模块变体(debug,release) |
| Android fix 依赖项冲突 | https://developer.android.com/build/dependency-resolution-errors?hl=zh-cn |
| 解决依赖冲突,冲突时强制使用某个版本或者在引入冲突时排除 | configurations.all { 或者引入排除 testCompile('com.squareup.assertj:assertj-android:1.0.0') { |
| 构建报错@error.NonExistentClass() | kapt { correctErrorTypes true } |
| Android Native构建配置,sourceset JNILib指定打包的库 | https://developer.android.com/studio/projects/gradle-external-native-builds |
| Dynamic Feature Module | https://juejin.cn/post/7049522872682807333 Android App Bundle官方插件模式 |
Gradle中如果想要对子模块的构建产物进行过滤或重命名等操作,需要如何书写?
如何在project下获取子模块的gradle任务并修改?
在 Gradle 中,你可以通过以下几种方式对子模块的构建产物进行过滤或重命名,以及在 Project 级获取子模块的 Gradle 任务并修改:
1. 使用 configurations 过滤构建产物
场景: 你只想将子模块中的特定类型的文件包含到主项目的构建产物中。
实现: 在主项目的 build.gradle 中,使用 configurations 属性来配置依赖项,并使用 include 或 exclude 来过滤特定文件。
dependencies {
implementation project(":submodule") // 依赖子模块
// 仅包含子模块中的 'jar' 文件
implementation(project(":submodule"), {
include("*.jar")
})
// 排除子模块中的 'test' 文件夹下的所有文件
implementation(project(":submodule"), {
exclude("**/*.test")
})
}
2. 使用 transform 转换构建产物
场景: 你需要对子模块的构建产物进行转换,例如压缩、重命名、加密等。
实现: 在主项目的 build.gradle 中,定义一个 Transform 任务,并在 transform 方法中对输入文件进行操作。
tasks.register("transformSubmodule") {
doLast {
// 获取子模块的构建产物路径
val submoduleOutputDir = file("${project(":submodule").buildDir}/libs")
// 遍历子模块的构建产物,并进行转换操作
submoduleOutputDir.listFiles().forEach { file ->
// 对 file 进行转换操作
}
}
}
// 在主项目的构建生命周期中执行 "transformSubmodule" 任务
tasks.named("assembleRelease").configure {
dependsOn(tasks.named("transformSubmodule"))
}
3. 使用 afterEvaluate 获取子模块的 Gradle 任务并修改
场景: 你需要对子模块的 Gradle 任务进行修改,例如添加依赖、修改参数等。
实现: 在主项目的 build.gradle 中,使用 afterEvaluate 闭包来获取子模块的 Gradle 任务,然后进行修改。
afterEvaluate {
// 获取子模块的 "assembleRelease" 任务
val submoduleAssembleRelease = project(":submodule").tasks.named("assembleRelease")
// 修改子模块的 "assembleRelease" 任务
submoduleAssembleRelease.configure {
// 添加依赖
dependsOn(tasks.named("myTask"))
// 修改参数
doFirst {
// ...
}
}
}
4. 使用 project 获取子模块的 Gradle 任务并修改
场景: 你需要在主项目的构建生命周期中获取子模块的 Gradle 任务并进行修改。
实现: 在主项目的 build.gradle 中,使用 project 获取子模块的 Task 对象,然后进行修改。
// 获取子模块的 "assembleRelease" 任务
val submoduleAssembleRelease = project(":submodule").tasks.named("assembleRelease")
// 修改子模块的 "assembleRelease" 任务
submoduleAssembleRelease.configure {
// 添加依赖
dependsOn(tasks.named("myTask"))
// 修改参数
doFirst {
// ...
}
}
一些注意事项:
确保在主项目的 build.gradle 中正确配置子模块的依赖关系。
使用 afterEvaluate 或 project 获取子模块的 Gradle 任务时,需要确保子模块的构建已经完成。
在进行任务修改操作时,需要注意依赖关系和执行顺序。
以上几种方法可以帮助你实现对子模块构建产物的过滤、重命名以及对子模块 Gradle 任务的修改。根据具体需求选择适合的方法进行操作。
要在Kts文件中修改gradle任务publishAllPublicationsToMyRepository,使其中某个产物不推送到远程仓库,可以通过如下方式处理:
- 找到该任务的定义,通常是在Kts文件中指定发布构建产物到远程仓库的方式,类似如下代码:
publishing { repositories { maven { url = uri("https://myrepo") } } } tasks.register("publishAllPublicationsToMyRepository") { dependsOn(tasks.withType<PublishToMavenPublication>()) }
- 在该任务中使用
onlyIf方法来判断某个产物,然后在publish方法中设置exclude规则,将不需要发布的产物排除掉,类似如下代码:
tasks.register("publishAllPublicationsToMyRepository") { dependsOn(tasks.withType<PublishToMavenPublication>()) onlyIf { // 判断需要发布的产物 true // 返回需要发布的条件 } doLast { // 获取需要发布的产物 val publications = project.tasks.withType<PublishToMavenPublication>().filter { // 过滤出需要发布的产物 } // 设置不需要发布的产物 publications.forEach { publication -> publication.publish { exclude("**/exclude-artifact.jar") } } } }
- 在代码中替换
exclude-artifact.jar为你需要排除的产物的名称。然后运行gradle任务publishAllPublicationsToMyRepository,就可以实现只推送部分构建产物到远程仓库的需求。
相关文章:
Android gradle 构建
Understanding Tasks - Gradle task kapt 是 Kotlin 语言的注解处理器,它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。需要 Kotlin 编译器来解析和处理注解;使用 APT 来生成代码,…...
vulnhub系列:devguru
vulnhub系列:devguru 靶机下载 一、信息收集 nmap扫描存活,根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口,开放端口:22、80、8585 nmap 192.168.23.147 -p- -sV -Pn -O访问80端口 dirb目录扫描,存在 git 源…...
Robot Operating System——高质量图像传输
大纲 应用场景定义字段解释 案例 sensor_msgs::msg::Image 是 ROS (Robot Operating System) 中的一个消息类型,用于表示未压缩的图像数据。它通常用于传输和处理高质量的图像数据。 应用场景 机器人视觉 图像处理:在机器人视觉系统中,未压缩…...
NLP_情感分类_预训练加微调方案
文章目录 项目背景代码导包一些模型以及训练的参数设置定义dataset定义模型读取数据声明训练及测试数据集将定义模型实例化打印模型结构模型训练测试集效果 同类型项目 项目背景 项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据…...
全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典
全网最适合入门的面向对象编程教程:36 Python 的内置数据类型-字典 摘要: 字典是非常好用的容器,它可以用来直接将一个对象映射到另一个对象。一个拥有属性的空对象在某种程度上说就是一个字典,属性名映射到属性值。在内部&#…...
DataWind看板绘制案例
摘要: 1. 在不清楚DataWind看板怎么画的情况,可以先把表格给实现了,然后找几个有价值的数据进行看板实现 2. 还是不知道怎么画的情况,就去模仿其他人的案例; 3. 多看看DataWind提供的函数用法,就可以把表达式的使用运用起来了; 飞书官方文档:https://www.volcen…...
Golang | Leetcode Golang题解之第335题路径交叉
题目: 题解: func isSelfCrossing(distance []int) bool {n : len(distance)// 处理第 1 种情况i : 0for i < n && (i < 2 || distance[i] > distance[i-2]) {i}if i n {return false}// 处理第 j 次移动的情况if i 3 && di…...
C# 在Word中插入或删除分节符
在Word中,分节符是一种强大的工具,用于将文档分成不同的部分,每个部分可以有独立的页面设置,如页边距、纸张方向、页眉和页脚等。正确使用分节符可以极大地提升文档的组织性和专业性,特别是在长文档中,需要…...
基于STM32+Qt设计的无人超市收银系统(206)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】上位机设计思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】国内外技术发展现状1.4 开发工具的选择【1】设备端开…...
开源免费的表单收集系统TDuck
TDuck(填鸭表单)是一款开源免费的表单收集系统,它基于Apache 2.0协议开源,用户可以随时下载源码,自由修改和定制,也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署,还提供了丰…...
Python 生成器、迭代器、可迭代对象 以及应用场景
Python 生成器(Generators) 生成器是一种特殊的迭代器,它使用 yield 语句来逐次产生数据,而不是一次性在内存中生成数据。这意呀着生成器提供了一种懒加载(lazy evaluation)的方式,非常适合处理…...
马斯克对欧盟的反应
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
uniapp + 安卓APP + H5 + 微信小程序实现PDF文件的预览和下载
文章目录 uniapp 安卓APP H5 微信小程序实现PDF文件的预览和下载1、用到的技术及插件2、简述操作:下载预览 3、上代码:(主要是写后端,前端不大熟,我感觉写的还凑活,不对的请指正嘻嘻)4、注意的问题 uniapp 安卓APP…...
Elasticsearch 8 RAG 技术分享
作者:来自 Elastic 中国区首席架构师 Jerry 本文由 Elastic 中国区首席架构师 Jerry Zhu 在【AI 搜索 TechDay】上的分享整理而成。【AI 搜索 TechDay】 是 Elastic 和阿里云联合主办的 AI 技术 Meetup 系列,聚焦企业级 AI 搜索应用和开发者动手实践&am…...
根据字典值回显,有颜色的
背景 本项目以若依前端vue2版本为例,项目中有根据字典值回显文本的函数selectDictLabel,但是有时候我们需要带颜色的回显,大概这样的 用法 <template v-slotscope><dict-label :options"dangerLevelOptions" :value&qu…...
多台PC网络ADB连接同一台RK3399 Android7.1.2设备
在RK3399 Android7.1.2上面,进行网络ADB调试时,如果多台电脑连接同一台Android设备,第一台连接上的能正常操作,之后连接的看到设备状态为OFFLINE,分析了下ADBD相关代码,发现在ACCEPT Client的时候没有区分别…...
前端黑科技:使用 JavaScript 实现网页扫码功能
在数字化时代,二维码已经渗透到我们生活的方方面面。从移动支付到产品溯源,二维码凭借其便捷性和高效性,成为了信息传递的重要载体。而随着前端技术的不断发展,我们甚至可以使用 JavaScript 在网页端实现二维码扫描功能࿰…...
【人工智能】全景解析:【机器学习】【深度学习】从基础理论到应用前景的【深度探索】
目录 1. 人工智能的基本概念 1.1 人工智能的定义与发展 1.1.1 人工智能的定义 1.1.2 人工智能的发展历史 1.2 人工智能的分类 1.2.1 弱人工智能 1.2.2 强人工智能 1.2.3 超人工智能 1.3 人工智能的关键组成部分 1.3.1 数据 1.3.2 算法 1.3.3 计算能力 2. 机器学习…...
MySQL与PostgreSQL语法区别
1. 数据类型差异 a. 整型 ● MySQL中的text数据类型最大存储容量为64KB,PostgreSQL中的text类型没有此限制。 ● MySQL中使用tinyint、mediumint和int表示不同大小的整数,PostgreSQL使用smallint、int和bigint。 b. 浮点数类型 ● MySQL提供了float和…...
vue2+OpenLayers 天地图上凸显出当前地理位置区域(4)
凸显出当前区域 需要当前地方的json数据 这个可以在阿里的这个阿里 看下效果图 遮盖层的逃命都是可以调的 引入 下面一段代码 import sx from "/views/json/sx1.json"; // 下载的json import GeoJSON from "ol/format/GeoJSON"; // ol的一些方法 imp…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
