返回顶部
首页 > 资讯 > 精选 >Gradle Build Cache引发的Task缓存编译问题怎么解决
  • 365
分享到

Gradle Build Cache引发的Task缓存编译问题怎么解决

2023-07-02 12:07:21 365人浏览 薄情痞子
摘要

今天小编给大家分享一下Gradle Build Cache引发的Task缓存编译问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有

今天小编给大家分享一下Gradle Build Cache引发的Task缓存编译问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

基础知识

Gradle 构建缓存是一种缓存机制,旨在通过重用其他构建产生的输出来节省时间。构建缓存通过存储(本地或远程)构建输出并允许构建在确定输入没有更改时从缓存中获取这些输出来工作,从而避免了重新生成它们的昂贵工作。

使用构建缓存的第一个功能是任务输出缓存。本质上,任务输出缓存利用了与最新检查相同的智能,当先前的本地构建已经产生一组任务输出时,Gradle 使用它来避免工作。但是,任务输出缓存不仅限于同一工作区中的先前构建,而是允许 Gradle 重用本地机器上任何位置的任何早期构建的任务输出。当使用共享构建缓存进行任务输出缓存时,这甚至可以跨开发人员机器和构建代理工作。

除了任务之外,工件转换还可以利用构建缓存并重用其输出,类似于任务输出缓存。

以上内容摘自gradle官方文档,链接如下

我简单的翻译下给各位大佬,在本地存在build cache的情况下,gradle task会基于当前的输入来作为缓存的key值,如果输入内容没有发生变更,则意味着本Task可以被跳过,另外这个不同于增量编译。

Gradle Build Cache引发的Task缓存编译问题怎么解决

又可以偷下官方的图片了。举个栗子,JavaCompiler task的输入的java文件和上一次编译的一样,则意味着该任务可以使用原来编译输出作为编译产物。

Cacheable tasks

任务类型需要使用 @CacheableTask 注释选择加入任务输出缓存。 请注意,@CacheableTask 不被子类继承。 默认情况下,自定义任务类型不可缓存。

官方有说明什么情况下会使用编译缓存,首先我们的Task要被定义成@CacheableTask

另外对于Task内部的输入和输出也需要打上@TaskInputs@TaskOutputs注解。这样才能保证当前的Task具备了编译缓存的能力。

所以想要写一个能具备缓存能力的Task也是比较复杂的。这也就是为什么Android后面会开始推动Artifacts的使用了,让开发尽量可以少关心输入输出相关的逻辑。

我们升级适配完AGP 7.0 | 杂谈

那么相对的,没有定义@CacheableTask的则认为是内有编译缓存的任务。

TaskOutput

在上述这种被跳过的任务哦,一般都会有在Task编译完成之后带上一些特殊的标识符。

  • (no label) or EXECUTED 任务正常执行了。

  • UP-TO-DATE 任务输出没有变更。

  • 输入输出均没有发生变更。

  • 任务执行了,但是任务告诉gradle输出并未发生变更。

  • 任务没有执行和一些依赖项,但所有依赖项都是最新的、已跳过或来自缓存。

  • 任务没有执行也没有依赖。

  • FROM-CACHE 任务的输出可以从之前的执行中找到。任务已从构建缓存恢复输出。

  • SKIPPED 该任务没有被执行。任务已明确从命令行中排除。

  • NO-SOURCE 当前无需执行该任务。输入内容并没有源文件,比如.java

简单的来说,除了第一种情况以外,其他的都是任务被跳过。

有趣的编译问题

好了,有了前置的知识储备的情况下,我们就可以展开说一下我们最近碰到的一个奇怪的问题了。

我们有个protobuf编译的仓库,专门负责将pb文件转化成java或者Kotlin。然后会把这些生成的文件移动到另外两个模块进行打包,最后删除生成的所有类文件。然后再去执行javacompiler task。

这个模块出现了一个二次编译的问题。第一次打包protobuf模块的时候编译是正常的,然后当二次编译该模块的情况下,该模块就会出现类丢失的问题。

问题分析

这个问题分析起来就比较简单。在二次编译的情况下呢,因为输入的内容并没有发生变更,所以触发了Gradle Task相关的缓存,然后所有的pb文件转化成java kt的过程就被跳过了。但是呢后续的copy task因为本身不具备缓存能力,所以他还是会执行一次cv的任务。但是原来生成的java和kt已经被删除了。这个时候他就会把空的文件夹进行一次覆盖操作。之后就导致了原来的java和kt文件全部丢失的问题。

这就是一个很有趣的build cache导致的奇形怪状的问题,因为上一个任务具备了编译缓存,之后跳过了编译直接用了原来的output输出。但是呢下一个任务非缓存的,所以必然还是会执行拷贝任务。

以上就是“Gradle Build Cache引发的Task缓存编译问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Gradle Build Cache引发的Task缓存编译问题怎么解决

本文链接: https://lsjlt.com/news/341740.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Gradle Build Cache引发的Task缓存编译问题
    目录前言基础知识Cacheable tasksTaskOutput有趣的编译问题问题分析最后前言 前一阵子公司内部卷了一篇文章大家有兴趣的可以看下,大概把我们编译优化的原理介绍了下,...
    99+
    2024-04-02
  • Gradle Build Cache引发的Task缓存编译问题怎么解决
    今天小编给大家分享一下Gradle Build Cache引发的Task缓存编译问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有...
    99+
    2023-07-02
  • 怎么使用spring-cache代码解决缓存击穿问题
    本篇内容介绍了“怎么使用spring-cache代码解决缓存击穿问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文目前缺陷首先,为什么说...
    99+
    2023-06-30
  • Redis缓存问题怎么解决
    这篇文章主要讲解了“Redis缓存问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis缓存问题怎么解决”吧!LevelDB 来了!它是 Go...
    99+
    2024-04-02
  • vue缓存问题怎么解决
    Vue缓存问题可以通过以下几种方式来解决:1. 使用路由的meta信息:在路由配置中,可以设置meta信息,包括是否需要缓存组件等。...
    99+
    2023-05-23
    vue缓存问题 vue
  • Spring Cache怎么使用Redisson分布式锁解决缓存击穿问题
    本篇内容主要讲解“Spring Cache怎么使用Redisson分布式锁解决缓存击穿问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cache怎么使用Red...
    99+
    2023-06-30
  • Application Cache未缓存文件无法访问怎么解决
    这篇文章主要讲解了“Application Cache未缓存文件无法访问怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Application Cac...
    99+
    2024-04-02
  • Android中Axml编译问题怎么解决
    在Android中,Axml编译问题可能有多种原因导致,可以尝试以下解决方法:1. 检查Axml文件的语法错误:在编辑Axml文件时...
    99+
    2023-08-09
    Android
  • 什么是重新编译?怎么解决重新编译问题?
    SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码...
    99+
    2024-04-02
  • java无法解析的编译问题怎么解决
    当Java编译器无法解析编译问题时,可以尝试以下几种方法来解决:1. 检查语法错误:首先检查代码中是否存在语法错误,如拼写错误、缺少...
    99+
    2023-08-28
    java
  • eclipse无法解析的编译问题怎么解决
    要解决Eclipse无法解析的编译问题,您可以尝试以下几个步骤:1. 清理项目:在Eclipse中,选择“Project”菜单,然后...
    99+
    2023-09-14
    eclipse
  • Redis缓存雪崩问题怎么解决
    本篇内容介绍了“Redis缓存雪崩问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!缓存层承载着大量的请求,有效保护了存储层。但是如...
    99+
    2023-06-30
  • redis被动缓存问题怎么解决
    要解决Redis的被动缓存问题,可以考虑以下方法:1. 设置合适的过期时间:可以根据业务需求,为每个缓存设置适当的过期时间。这样可以...
    99+
    2023-08-24
    redis
  • redis怎么解决缓存不一致的问题
    本文小编为大家详细介绍“redis怎么解决缓存不一致的问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“redis怎么解决缓存不一致的问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2024-04-02
  • redis缓存一致性问题怎么解决
    在使用 Redis 缓存时,可能会遇到缓存一致性问题,即缓存中的数据与数据库中的数据不一致。以下是一些常见的解决方法: 缓存更新...
    99+
    2023-10-26
    redis
  • MySQL 8.0 timestamp引发的问题怎么解决
    本篇内容介绍了“MySQL 8.0 timestamp引发的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • plsql编译无效对象问题怎么解决
    PL/SQL编译无效对象的问题可以通过以下几种方法解决:1. 检查语法错误:编译无效对象可能是由于语法错误导致的。可以仔细检查PL/...
    99+
    2023-10-19
    plsql
  • mybatis一级缓存内存溢出问题怎么解决
    MyBatis一级缓存是默认开启的,它是基于线程的,即同一个线程内的多个查询会共享一级缓存。当同一个线程多次执行相同的查询时,查询结...
    99+
    2023-10-23
    mybatis
  • ajax调用中ie缓存问题怎么解决
    本篇内容主要讲解“ajax调用中ie缓存问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax调用中ie缓存问题怎么解决”吧!本文实例分析了ajax...
    99+
    2024-04-02
  • 怎么解决数据库缓存常见问题
    本篇内容介绍了“怎么解决数据库缓存常见问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!缓存穿透我们在使用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作