Android gradle 构建

news2024/9/22 15:49:17

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,就可以实现只推送部分构建产物到远程仓库的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【通天星主动安全监控云平台信息泄露漏洞】

目录 一、漏洞简介 二、资产测绘 三、poc利用 四、脚本批量验证 一、漏洞简介 “通天星主动安全监控云平台”是一个基于云计算技术的安全监控平台&#xff0c;通常用于保障网络安全、工业控制系统安全或物联网设备的安全。该信息泄露漏洞位于接口&#xff1a;/808gps/Stand…

可移植性(兼容性)测试指南

可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速变化&#xff0…

JavaScript秒值转换为年月日时间字符串

当前效果&#xff1a; 因为后端传递过来的是秒值&#xff0c;显示的时候也是秒值。 但是这种不太友好&#xff0c;所以需要转换为 “xxxx年xx月xx日 xx:xx:xx” 的格式。 参考代码&#xff1a; formatDate (now) {const date new Date(now)var y date.getFullYear() // 年…

Springboot3 自定义全局异常与异常捕获

全局异常构建 package com.lingyang.system.util.exception;import lombok.Getter;/*** author **文* Description:* createDate 2024/8/8 15:20**/ Getter public class TokenErrotException extends RuntimeException{private final String errorMessage;public TokenErrotE…

三维点云深度网络 PointNeXt 源码阅读 (III) —— 骨干网络模型

Title: 三维点云深度网络 PointNeXt 源码阅读 (III) —— 骨干网络模型 (BaseSeg、PointNextEncoder、PointNextDecoder、SetAbstraction 和 FeaturePropogation) 文章目录 前言I. 整体模型 —— Tier 01. 模型对象的建立2. BaseSeg 模型类 II. 编码器与解码器 —— Tier 11. P…

基于区块链的金融凭证应用开发

基于区块链的金融凭证应用开发 这个项目旨在开发一个基于区块链技术的金融凭证应用平台,用于提升供应链金融中应收账款管理的效率和透明度。通过将应收账款资产上链,并利用智能合约实现债权凭证的转让与拆分,项目目标是降低融资成本、增强信用分析能力,并推动供应链金融的…

昂科烧录器支持Cmsemicon中微半导体的8位微控制器CMS79F1239

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Cmsemicon中微半导体的8位微控制器CMS79F1239已经被昂科的通用烧录平台AP8000所支持。 CMS79F1239为中微半导体自主8位RISC内核单片机&#xff0c;工作电压1.8V~5.5V&#xff…

JSONP解决前端跨域学习案例

JSONP 的工作原理 JSONP利用的是 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

性能测试-性能测试工具wrk,Apache ab,ngrinder,locust,jmeter和loadrunner

性能测试工具&#xff1a; 企业中主流性能测试工具&#xff1a; jmeter jmeter&#xff1a; java开发的开源&#xff0c;线程、学习很低&#xff0c;接口、自动化、性能测试、第三方性能测试从jmeter扩展 loadrunner&#xff1a; 商业 loadrunner&#xff08;录播&#xff09;…

商业环境洞察:PEST分析法全解析

PEST 分析法是什么 PEST 分析作为一种企业战略规划中的关键工具&#xff0c;主要用于评估企业所处的宏观环境。"P"代表政治因素&#xff0c;涉及政府政策、法律法规及其对企业运营的潜在影响。"E"指的是经济环境&#xff0c;包括经济增长、汇率波动、通货…

[ Python 原理分析 ]如何实现用户实现博客文章点赞-物联网Python

目录 一、前言 二、Python爬虫 三、详细操作 3.1 建立基本工程 3.2 获取文章列表 3.2.1 找到获取文章请求 3.2.2 分析获取请求 3.2.3 构建获取请求 3.2.4 调试打印 3.3 实现点赞操作 3.3.1 判断点赞状态 3.3.2 找到点赞请求 3.2.3 分析点赞请求 3.2.4 构建点赞请…

linxu命令diff:比较两个或多个文件的内容差异的工具diff详解

目录 一、概述 二、用法 1、基本语法 2、基本用法 3、常用选项 4、获取帮助 三、输出格式 1、正常格式&#xff08;normal diff&#xff09; 2、上下文格式&#xff08;context diff&#xff09; 3、合并格式&#xff08;unified diff&#xff09; 四、示例…

【面试宝典】java多线程面试题总结(中)

::: tip 这个里面的内容对应 Java并发编程基础知识 书籍中的内容。需要的画私聊我哈&#xff01;&#xff01;&#xff01; ::: 一、简介 Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是一种抽象的概念&#xff0c;它定义了Java程序中各个变量…

《计算机组成原理》(第3版)第7章 指令系统 复习笔记

第7章 指令系统 一、机器指令 机器语言是由一条条语句构成的&#xff0c;每一条语句又能准确表达某种语义。计算机就是连续执行每一条机器语句而实现全自动工作的&#xff0c;人们习惯把每一条机器语言的语句称为机器指令&#xff0c;而又将全部机器指令的集合称为机器的指令…

C语言--不可不学的指针

1. 指针是什么 内存是什么&#xff1f; 内存是电脑上特别重要的存储器&#xff0c;计算机中的程序的运行都是在内存中进行的&#xff0c;为了有效使用内存&#xff0c;我们会把内存划分为一个个小的内存单元&#xff0c;比如把4G/8G/16G/32G的内存划分为一个个以字节为单位的空…

vulnhub系列:Momentum2

vulnhub系列&#xff1a;Momentum2 靶机下载 一、信息收集 nmap扫描C段存活 nmap 192.168.23.0/24目标地址为192.168.23.132 nmap扫描端口 nmap 192.168.23.132发现开放端口&#xff1a;22、80 目录扫描 python3 dirsearch.py -u http://192.168.23.132扫描发现目录&…

【OCR 学习笔记】二值化——全局阈值方法

二值化——全局阈值方法 固定阈值方法Otsu算法在OpenCV中的实现固定阈值Otsu算法 图像二值化&#xff08;Image Binarization&#xff09;是指将像素点的灰度值设为0或255&#xff0c;使图像呈现明显的黑白效果。二值化一方面减少了数据维度&#xff0c;另一方面通过排除原图中…