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…...
2026届学术党必备的十大AI写作助手推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AIGC检测服务的目的是辅助识别学术文本里由人工智能生成的内容,该技术凭借对…...
Vivado Design Suite中BUFG优化策略与实战技巧
1. 理解BUFG的核心作用与设计痛点 在FPGA设计中,时钟信号就像人体神经系统中的电脉冲,需要快速、准确地传递到每个功能单元。BUFG(全局时钟缓冲器)就是Xilinx器件中专用的"信号放大器",它能将时钟信号分配到…...
请解释 Linux 系统中的内核模块管理,并描述如何加载和卸载模块。
在 Linux 系统中,内核模块(Kernel Modules) 是可以在不重新编译或重启内核的情况下,动态添加到运行中内核的代码片段。它们通常用于支持新的硬件设备、文件系统或网络协议。 这种机制使得 Linux 内核保持精简(核心功能…...
开源新形态:从代码到Prompt的转变
【导语:3月末,开源作者yetone发布新项目voice-input-src,以独特方式“开源”,即用自然语言Prompt生成代码,此做法引发讨论,或预示开源模式新转变。】AI驱动的语音输入法开源项目开源作者yetone在GitHub上发…...
别再只会用Arduino了!用ESP8266+MicroPython快速搭建你的第一个物联网小项目(附完整代码)
用MicroPython解锁ESP8266的物联网潜能:10分钟搭建温湿度监测系统 当提到物联网开发时,大多数人的第一反应可能是Arduino和C。但今天,我要带你体验一种更高效、更友好的方式——MicroPython。这种基于Python的嵌入式编程语言,让物…...
Gitee:数字化转型浪潮中企业项目管理的战略级解决方案
在数字经济成为全球经济增长新引擎的背景下,企业数字化转型已从"选择题"变为"必答题"。项目管理工具作为数字化转型的基础设施,其重要性日益凸显。根据IDC最新预测,到2025年,中国数字经济规模将突破80万亿元&…...
【flash-attn安装成功却import失败?一个ABI参数引发的‘血案’】
1. 为什么flash-attn安装成功却import失败? 最近在部署Llama2模型时,遇到了一个让人抓狂的问题:明明用pip安装了flash-attn,执行import时却报错提示找不到这个包。更诡异的是,pip list明明显示安装成功了,…...
Linux进程调度机制与性能优化实践
1. Linux进程调度概述在Linux操作系统中,进程调度是内核最核心的功能之一。作为一个多任务操作系统,Linux需要合理地分配有限的CPU资源给众多进程,使它们能够高效、公平地运行。理解Linux的调度机制,对于系统性能调优、应用开发以…...
07-打造个性化 AI 助手
OpenClaw 第七篇:记忆系统进阶——打造个性化 AI 助手 “Memory is the treasury and guardian of all things.” — Cicero 在人工智能领域,有一个永恒的挑战:如何让 AI 记住「我是谁」、「你是谁」,以及「我们之前聊过什么」。OpenClaw 作为新一代 AI 自动化平台,构建了…...
10分钟掌握Deep-Live-Cam:从零搭建实时AI换脸系统的完整指南
10分钟掌握Deep-Live-Cam:从零搭建实时AI换脸系统的完整指南 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-Live-Cam是…...
