当前位置: 首页 > news >正文

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.namedtask 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: 用于复制文件和目录。
Jar: 用于创建 JAR 文件。
War: 用于创建 WAR 文件。
Test: 用于运行测试。
Clean: 用于清理构建目录。
... 等等

自定义任务类型DefaultTask

Writing Tasks

Registering a task - using a task (implemented by you or provided by Gradle) in your build logic.
注册任务 - 在构建逻辑中使用任务(由您实现或由 Gradle 提供)。

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
    lateinit var sourceDirectory: File

    @get:OutputFile         //自定义任务输出
    lateinit var reportFile: File

    @TaskAction    //任务操作的具体逻辑

    fun generateReport() {}

}

tasks.register<GenerateReportTask>("generateReport") {
    sourceDirectory = file("src/main")
    reportFile = file("${layout.buildDirectory}/reports/directoryReport.txt")
}

tasks.build {
    dependsOn("generateReport")
}

任务配置(传参)

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") {
    dependsOn(":app:assembleDebug", ":app:assembleRelease")
    doFirst {
        println("Building debug and release variants...")
    }
    doLast {
        println("Finished building both variants!")
    }
}

  1. task buildAll(type: Exec): 定义一个名为 buildAll 的自定义任务,类型为 Exec (表示执行命令)。
  2. dependsOn ":app:assembleDebug", ":app:assembleRelease": 声明 buildAll 任务依赖于 :app:assembleDebug 和 :app:assembleRelease 任务。这意味着 buildAll 任务会在它们完成后执行。
  3. doFirst { ... }: 在 buildAll 任务执行之前执行的代码块,可以用来输出信息或执行其他操作。
  4. doLast { ... }: 在 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 {
    resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}

或者引入排除

testCompile('com.squareup.assertj:assertj-android:1.0.0') {
     exclude group: 'com.android.support', module: 'support-annotations'
 }

构建报错@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,使其中某个产物不推送到远程仓库,可以通过如下方式处理:

  1. 找到该任务的定义,通常是在Kts文件中指定发布构建产物到远程仓库的方式,类似如下代码:

publishing { repositories { maven { url = uri("https://myrepo") } } } tasks.register("publishAllPublicationsToMyRepository") { dependsOn(tasks.withType<PublishToMavenPublication>()) }

  1. 在该任务中使用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") } } } }

  1. 在代码中替换exclude-artifact.jar为你需要排除的产物的名称。然后运行gradle任务publishAllPublicationsToMyRepository,就可以实现只推送部分构建产物到远程仓库的需求。

相关文章:

Android gradle 构建

Understanding Tasks - Gradle task kapt 是 Kotlin 语言的注解处理器&#xff0c;它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。需要 Kotlin 编译器来解析和处理注解&#xff1b;使用 APT 来生成代码&#xff0c…...

vulnhub系列:devguru

vulnhub系列&#xff1a;devguru 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口&#xff0c;开放端口&#xff1a;22、80、8585 nmap 192.168.23.147 -p- -sV -Pn -O访问80端口 dirb目录扫描&#xff0c;存在 git 源…...

Robot Operating System——高质量图像传输

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::Image 是 ROS (Robot Operating System) 中的一个消息类型&#xff0c;用于表示未压缩的图像数据。它通常用于传输和处理高质量的图像数据。 应用场景 机器人视觉 图像处理&#xff1a;在机器人视觉系统中&#xff0c;未压缩…...

NLP_情感分类_预训练加微调方案

文章目录 项目背景代码导包一些模型以及训练的参数设置定义dataset定义模型读取数据声明训练及测试数据集将定义模型实例化打印模型结构模型训练测试集效果 同类型项目 项目背景 项目的目的&#xff0c;是为了对情感评论数据集进行预测打标。在训练之前&#xff0c;需要对数据…...

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

全网最适合入门的面向对象编程教程&#xff1a;36 Python 的内置数据类型-字典 摘要&#xff1a; 字典是非常好用的容器&#xff0c;它可以用来直接将一个对象映射到另一个对象。一个拥有属性的空对象在某种程度上说就是一个字典&#xff0c;属性名映射到属性值。在内部&#…...

DataWind看板绘制案例

摘要​: 1. 在不清楚DataWind看板怎么画的情况,可以先把表格给实现了,然后找几个有价值的数据进行看板实现 2. 还是不知道怎么画的情况,就去模仿其他人的案例; 3. 多看看DataWind提供的函数用法,就可以把表达式的使用运用起来了;​ 飞书官方文档:https://www.volcen…...

Golang | Leetcode Golang题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; 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中&#xff0c;分节符是一种强大的工具&#xff0c;用于将文档分成不同的部分&#xff0c;每个部分可以有独立的页面设置&#xff0c;如页边距、纸张方向、页眉和页脚等。正确使用分节符可以极大地提升文档的组织性和专业性&#xff0c;特别是在长文档中&#xff0c;需要…...

基于STM32+Qt设计的无人超市收银系统(206)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】上位机设计思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】国内外技术发展现状1.4 开发工具的选择【1】设备端开…...

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…...

Python 生成器、迭代器、可迭代对象 以及应用场景

Python 生成器&#xff08;Generators&#xff09; 生成器是一种特殊的迭代器&#xff0c;它使用 yield 语句来逐次产生数据&#xff0c;而不是一次性在内存中生成数据。这意呀着生成器提供了一种懒加载&#xff08;lazy evaluation&#xff09;的方式&#xff0c;非常适合处理…...

马斯克对欧盟的反应

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

uniapp + 安卓APP + H5 + 微信小程序实现PDF文件的预览和下载

文章目录 uniapp 安卓APP H5 微信小程序实现PDF文件的预览和下载1、用到的技术及插件2、简述操作&#xff1a;下载预览 3、上代码&#xff1a;(主要是写后端&#xff0c;前端不大熟&#xff0c;我感觉写的还凑活&#xff0c;不对的请指正嘻嘻)4、注意的问题 uniapp 安卓APP…...

Elasticsearch 8 RAG 技术分享

作者&#xff1a;来自 Elastic 中国区首席架构师 Jerry 本文由 Elastic 中国区首席架构师 Jerry Zhu 在【AI 搜索 TechDay】上的分享整理而成。【AI 搜索 TechDay】 是 Elastic 和阿里云联合主办的 AI 技术 Meetup 系列&#xff0c;聚焦企业级 AI 搜索应用和开发者动手实践&am…...

根据字典值回显,有颜色的

背景 本项目以若依前端vue2版本为例&#xff0c;项目中有根据字典值回显文本的函数selectDictLabel&#xff0c;但是有时候我们需要带颜色的回显&#xff0c;大概这样的 用法 <template v-slotscope><dict-label :options"dangerLevelOptions" :value&qu…...

多台PC网络ADB连接同一台RK3399 Android7.1.2设备

在RK3399 Android7.1.2上面&#xff0c;进行网络ADB调试时&#xff0c;如果多台电脑连接同一台Android设备&#xff0c;第一台连接上的能正常操作&#xff0c;之后连接的看到设备状态为OFFLINE&#xff0c;分析了下ADBD相关代码&#xff0c;发现在ACCEPT Client的时候没有区分别…...

前端黑科技:使用 JavaScript 实现网页扫码功能

在数字化时代&#xff0c;二维码已经渗透到我们生活的方方面面。从移动支付到产品溯源&#xff0c;二维码凭借其便捷性和高效性&#xff0c;成为了信息传递的重要载体。而随着前端技术的不断发展&#xff0c;我们甚至可以使用 JavaScript 在网页端实现二维码扫描功能&#xff0…...

【人工智能】全景解析:【机器学习】【深度学习】从基础理论到应用前景的【深度探索】

目录 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&#xff0c;PostgreSQL中的text类型没有此限制。 ● MySQL中使用tinyint、mediumint和int表示不同大小的整数&#xff0c;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…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...