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…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...