解决JavaCompiler的警告_api 'variant.getjavacompiler()' is obsolete and ha-程序员宅基地

技术标签: JavaCompiler  Gradle  Android  

最近在Build的过程中注意到Gradle的log中有一个关于JavaCompiler的警告。
具体如下:

Configure project :App
WARNING: API ‘variant.getJavaCompiler()’ is obsolete and has been replaced with ‘variant.getJavaCompileProvider()’.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
To determine what is calling variant.getJavaCompiler(), use -Pandroid.debug.obsoleteApi=true on the command line to display more information.

按照提示,可以给build包命令加上参数来查看更详细的信息,运行以下命令:

.\gradlew assembleDebug -Pandroid.debug.obsoleteApi=true

结果如下:

Configure project :App
WARNING: API ‘variant.getJavaCompiler()’ is obsolete and has been replaced with ‘variant.getJavaCompileProvider()’.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
REASON: Called from: D:\StudioProjects3.5\MyProject\App\build.gradle:267
WARNING: Debugging obsolete API calls can take time during configuration. It’s recommended to not keep it on at all times.

看来问题是在这个 build.gradle 文件上面,对应的代码如下:

android.libraryVariants.all { variant ->
    variant.javaCompiler.options.encoding = 'UTF-8'
}

可以看出上面的 .javaCompiler 是不推荐使用了,我们可以通过按住 Ctrl+ 点击 libraryVariant 查看源码来确定这一点。此时会打开 LibraryExtension.java 文件,相应的方法说明如下:

    /**
     * Returns a collection of <a
     * href="https://developer.android.com/studio/build/build-variants.html">build variants</a> that
     * the library project includes.
     *
     * <p>To process elements in this collection, you should use the <a
     * href="https://docs.gradle.org/current/javadoc/org/gradle/api/DomainObjectCollection.html#all(org.gradle.api.Action)">
     * <code>all</code></a> iterator. That's because the plugin populates this collection only after
     * the project is evaluated. Unlike the <code>each</code> iterator, using <code>all</code>
     * processes future elements as the plugin creates them.
     *
     * <p>The following sample iterates through all <code>libraryVariants</code> elements to <a
     * href="https://developer.android.com/studio/build/manifest-build-variables.html">inject a
     * build variable into the manifest</a>:
     *
     * <pre>
     * android.libraryVariants.all { variant -&gt;
     *     def mergedFlavor = variant.getMergedFlavor()
     *     // Defines the value of a build variable you can use in the manifest.
     *     mergedFlavor.manifestPlaceholders = [hostName:"www.example.com"]
     * }
     * </pre>
     */
    public DefaultDomainObjectSet<LibraryVariant> getLibraryVariants() {
        return libraryVariantList;
    }

这个方法是用来返回 Library 项目的所有构件变体的,所以要找的方法应该在 LibraryVariant 接口里面了。

/** A Build variant and all its public data. */
public interface LibraryVariant extends BaseVariant, TestedVariant {

    /**
     * Returns the Library AAR packaging task.
     *
     * @deprecated Use {@link #getPackageLibraryProvider()}
     */
    @Nullable
    @Deprecated
    Zip getPackageLibrary();

    /**
     * Returns the {@link TaskProvider} for the Library AAR packaging task.
     *
     * <p>Prefer this to {@link #getPackageLibrary()} as it triggers eager configuration of the
     * task.
     */
    @Nullable
    TaskProvider<Zip> getPackageLibraryProvider();
}

没有直接看到 getJavaCompiler() 方法,继续查看父接口 BaseVariant。

/**
 * A Build variant and all its public data. This is the base class for items common to apps,
 * test apps, and libraries
 */
public interface BaseVariant {
    /**
     * Returns the Java Compilation task
     *
     * @deprecated Use {@link #getJavaCompileProvider()}
     */
    @NonNull
    @Deprecated
    JavaCompile getJavaCompile();

    /**
     * Returns the {@link TaskProvider} for the Java Compilation task
     *
     * <p>Prefer this to {@link #getJavaCompile()} as it triggers eager configuration of the task.
     */
    @NonNull
    TaskProvider<JavaCompile> getJavaCompileProvider();

总算找到了 getJavaCompiler() ,源码上也确实注明了这个方法被弃用了,推荐使用 getJavaCompileProvider().
观察这两个方法,发现返回类型不一样,getJavaCompilerProvider() 返回的是一个 TaskProvider。来看看这个接口是什么:

/**
 * Providers a task of the given type.
 *
 * @param <T> Task type
 * @since 4.8
 */
public interface TaskProvider<T extends Task> extends NamedDomainObjectProvider<T> {
    /**
     * Configures the task with the given action. Actions are run in the order added.
     *
     * @param action A {@link Action} that can configure the task when required.
     * @since 4.8
     */
    void configure(Action<? super T> action);

    /**
     * The task name referenced by this provider.
     * <p>
     * Must be constant for the life of the object.
     *
     * @return The task name. Never null.
     * @since 4.9
     */
    String getName();
}

这个接口提供了一个 configure 方法,可以传入一个 Action 去配置对应的 Task。这样我们就可以改一下之前的 build.gradle 文件了。

android.libraryVariants.all { variant ->
    variant.javaCompileProvider.configure {
        
    }
}

本来处理到这里的时候有点懵逼了,也没参数,接下来怎么处理?看着看着,感觉跟 Kotlin 的 apply 方法很像啊,那就试试看。之前的 TaskProvider 的泛型参数类型是 JavaCompile。那我们是不是可以直接调用这个 JavaCompile 类的方法呢?那就试试:

android.libraryVariants.all { variant ->
    variant.javaCompileProvider.configure {
        options.encoding = 'UTF-8'
    }
}

Sync一下,Success。警告也消失了。Android Gradle Plugin 废弃 getJavaCompiler 方法应该是出于设计或性能考虑,大家遇到这类警告,最好也是花点时间按照提示一步步处理。在这里给想学习Gradle的同学推荐一下《Android Gradle 权威指南》。这本书对各个知识点理解得非常透彻,看完收获很大。最后感谢看到这里的同学。拜拜。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JayChen2011/article/details/101113078

智能推荐

Python爬虫工具:必会用的 6 款 Chrome 插件,2024年最新Python面试题及答案2024百度-程序员宅基地

文章浏览阅读883次,点赞7次,收藏11次。EditThisCookie 是一个 Cookie 管理器,可以很方便的添加,删除,编辑,搜索,锁定和屏蔽 Cookies。可以将登录后的 Cookies 先保存到本地,借助 cookielib 库,直接爬取登录后的数据。编写 Xpath 之后会实时显示匹配的数目和对应的位置,方便我们判断语句是否编写正确。它支持复杂的网站结构,数据支持文本、连接、数据块、下拉加载数据块等各种数据类型。操作简单,只需要鼠标点击和简单的配置,就能快速的爬取 Web 端的数据。此外,还能将爬取的数据导出到 CSV 文件中。

关于python启动illustrator程序后调用jsx脚本-程序员宅基地

文章浏览阅读123次。2.arguments为python传过来的参数,是一个数组,这里的arguments不能改成其他名字,否则接收不到python传过来的参数。2.arguments为传递进jsx脚本中的参数,类型是一个数组。在jsx是取参数为固定的变量名,这个变量名是无法自定义名字的。1.ret用来接收jsx脚本return的结果。1.main为自定义函数。

boost::interprocess::managed_shared_memory(2)(std::deque)-程序员宅基地

文章浏览阅读179次。struct shareDataEx : shareData{ int index; int total_size;};typedef managed_shared_memory::segment_manager segment_manager_t; //段管理器typedef allocator&lt;shareDataEx, segmen..._boost::interprocess deque

XStream 组件漏洞修复_xstream < 1.4.15 任意文件删除漏洞-程序员宅基地

文章浏览阅读2.1k次。风险描述XStream 是Java 类库中的常用组件,可将Java 对象序列化为XML,反之可将Java 对象和XML 文档相互转换。XStream 官方发布安全公告,披露多个反序列化漏洞,包括:1、拒绝服务漏洞(CVE-2021-21341/21348)攻击者可利用该漏洞操纵已处理的输入流并替换或注入对象,执行恶意正则表达式的计算,从而造成拒绝服务攻击。2、服务端请求伪造漏洞(CVE-2021-21342/21349)攻击者可利用该漏洞操纵已处理的输入流并替换或注入对象,从而伪造服务端请求。_xstream < 1.4.15 任意文件删除漏洞

C++ 在头文件中声明定义字符数组或指针变量_可以在头文件里放字符数组吗-程序员宅基地

文章浏览阅读5.1k次。C++ 在头文件中声明定义字符数组或指针变量_可以在头文件里放字符数组吗

(转)CentOS 下 rpm包与 yum 安装与卸载-程序员宅基地

文章浏览阅读49次。一、rpm包的安装: 1.安装一个包  # rpm -ivh  2.升级一个包  # rpm -Uvh  3.移走一个包  # rpm -e  4.安装参数  --force 即使覆盖属于其它包的文件也强迫安装  --..._centos 有bing 安装包

随便推点

c语言程序设计扫雷游戏实验报告,C语言实现扫雷游戏-程序员宅基地

文章浏览阅读716次。本文将介绍如何用C语言多文件编程实现扫雷该示例扫雷程序可实现以下几个功能:自定义雷数踩雷后会将所有雷显示出来地图大小易修改Mine_clearance.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include#include#include#define ROW 11#define COL 11#define 踩雷 0#define 玩家胜利 1in..._c语言扫雷课程设计报告

深入理解机器学习——机器学习概览_深入机器学习-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏33次。机器学习算法是一种能够从数据中学习的算法。卡耐基梅隆大学计算机科学学院机器学习系主任Mitchell给出了机器学习算法的定义:对于某类任务TTT和性能度量PPP,一个计算机程序被认为可以从经验EEE中学习是指,通过经验EEE改进后,它在任务TTT上由性能度量PPP衡量的性能有所提升。经验EEE,任务TTT和性能度量PPP的定义范围非常宽广,我们会在接下来的文章中提供直观的解释和示例来介绍不同的任务、性能度量和经验,这些将被用来构建机器学习算法。任务TTT机器学习可以让我们解决一些人为设计和使用确定性程_深入机器学习

大量数据去重:Bitmap位图算法和布隆过滤器(Bloom Filter)_位图去重-程序员宅基地

文章浏览阅读3.2k次。Bitmap算法与其说是算法,不如说是一种紧凑的数据存储结构。是用内存中连续的二进制位(bit),用于对大量整型数据做去重和查询。其实如果并非如此大量的数据,有很多排重方案可以使用,典型的就是哈希表。实际上,哈希表为每一个可能出现的数字提供了一个一一映射的关系,每个元素都相当于有了自己的独享的一份空间,这个映射由散列函数来提供(这里我们先不考虑碰撞)。实际上哈希表甚至还能记录每个元素出现的..._位图去重

realme v11密码解锁_真我V11忘记密码怎么刷机删除跳过激活账号使用_真我rv11刷机-程序员宅基地

文章浏览阅读1.5w次。realme v11密码解锁_真我V11忘记密码怎么刷机删除跳过激活账号使用realme v11手机设置的屏幕锁密码忘记,重启手机后无法通过指纹或面部来解锁,或是绑定的OPPO账号密码忘记,恢复出厂设置后,需要欢太账号激活手机使用怎么办?相信不少机友都有遇到这类问题,今天就给大家分享一下真我V11手机技巧,如果在遇到这类问题的时候,如何来解决。已亲测有效哦~一、情况1:记得realme v11手机密保答案1、realme v11手机在连续5次输入错误密码的时候会跳出<忘记密码&g._真我rv11刷机

php mysql ajax 分页_php+ajax+jquery分页并显示数据-程序员宅基地

文章浏览阅读157次。参考https://www.helloweba.com/view-blog-195.htmlhtml页面1 2 3 4 5 6 上面的第一个div是显示帖子列表的地方,包括帖子的标题,作者昵称。第二个div是个按钮,显示下一页。jquery我们先声明变量,后面的代码要用到以下变量。var..._php+jquery+ajax实现分页

dnf时装补丁教程_dnf时装补丁怎么用?DNF时装补丁教程-程序员宅基地

文章浏览阅读1.4k次。dnf时装补丁怎么用?dnf时装补丁放在哪个文件夹?dnf时装补丁出错怎么解决?请看本文的详细介绍。DNF时装补丁使用方法:傻瓜包使用方法:补丁模型下载后,安装到dnf客户端的子目录中的ImagePacks2文件夹就可以了 ,如果觉得不好看可以使用论坛的模型还原工具去除补丁效果。游戏运行时候不能放入补丁,请在游戏未运行的时候放入补丁首先你要找到你的DNF客户端文件下的 ImagePacks2 文件..._dnf傻瓜包时装补丁

推荐文章

热门文章

相关标签