解决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

智能推荐

苹果录音功能在哪?iPhone自带录音功能的正确打开方式_苹果手机录音功能在哪-程序员宅基地

文章浏览阅读2w次。苹果手机的录音功能在哪?很多小伙伴平常会需要录音,但是在苹果手机中找不到这样的功能,如果你觉得苹果手机并没有这样的功能,那可是大错特错。在苹果手机里面,我们可以借助苹果手机的自带应用——语音备忘录进行录音。操作方法:1.打开苹果手机,在桌面应用中找到语音备忘录2.在界面上点击红色的按钮开始录音3.完成录音之后点击红色的按钮停止4.新录制完成的音频会自动保存在语音备忘录以iOS 1..._苹果手机录音功能在哪

基于VR技术的输电线路巡检仿真系统_vr 电力线路-程序员宅基地

文章浏览阅读1.5k次。基于VR技术,搭建电力输电仿真系统用于培训,提供用户沉浸式学习体验、交互式操作体验,VR设备能够提供沉浸式真实感的模拟场景,使得输电线路巡检内容视觉化,跨越了空间和时间的限制,有针对性的解决传统输电运检室对新员工培训的所遇到的困难.并且借助VR设备交互性特点,给学员提供误操作带来的严重后果的虚拟体验,目前高压电力设备的操作培训是基于实物进行的,不仅有较高的危险性,还不能辨别操作者是否规范操作。在输..._vr 电力线路

获取视频旋转角度,并对视频进行旋转_displaymatrix: rotation of -90.00 degrees-程序员宅基地

文章浏览阅读1.6w次。Android平台上录制视频时,如果是横屏录制(手机逆时针旋转90度),则录制的视频时不带角度的。如果是竖屏录制(正常的拿手机的姿势),此时的录制的视频的旋转角度是90度。如果再旋转90度,此时一般音量键和关屏键朝下,此时的视频的旋转角度是180。以此类推。所以在手机上的视频一般会有4中角度的视频,播放时,要对视频资源进行旋转后在进行播放。一般而言,带角度的视频和不带角度的视频,数据帧里面的宽_displaymatrix: rotation of -90.00 degrees

networkx读取csv,无法在Python中的networkx中加载一个简单的csv-程序员宅基地

文章浏览阅读191次。I am a complete noobie in Python, and I would like to study a dataset using the networkx package. I do not understand what is wrong here:I have a csv which looks like this (extract):['152027', '-6167'..._networdx 加载 csv

敏感词过滤与DFA算法Trie树_trie 和 dfa-程序员宅基地

文章浏览阅读9.2k次。关键字过滤 trie树_trie 和 dfa

NetLogon特权提升漏洞(CVE-2020-1472)复现_zerologon漏洞修复方法-程序员宅基地

文章浏览阅读2.4k次。简介CVE-2020-1472是一个windows域控中严重的远程权限提升漏洞,攻击者通过NetLogon,建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限。影响版本Windows Server 2008 R2 for x64-based Systems Service Pack 1Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)Window.._zerologon漏洞修复方法

随便推点

UE4学习笔记:关卡流(LevelStream)-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏73次。通过关卡流可以在需要的时候动态加载关卡,不需要的时候卸载,降低内存使用率,构建大型场景。通过简单的示例了解关卡流的用法。1、新建一个两个关卡,在关卡里分别放一个"Level1"和"Level2"的文本,保存文件名为StreamLevel1和StreamLevel22、新建一个空关卡,并打开Levels窗口3、在Levels界面,将StreamLevel1和StreamLevel..._关卡流

【友云音】【问题排查记录-5】中间件启动异常_nc中间件一直打不开-程序员宅基地

文章浏览阅读1.1k次。问题现象NC中间件启动时一直卡在这个界面不进行加载。问题分析1、查看了ncSysconfig,发现了客户的jvm参数有一段异常。客户在部署的时候少填写了一段jar包。造成中间件启动异常。上面是正确写法,下面是异常填写。修改后启动正常。2、后续客户加上友云音的jvm参数后,发现中间件启动异常缓慢,之前启动中间件5min左右,现在启动了10min还在继续。于是查看了客..._nc中间件一直打不开

3dmax渲染卡光子、灯光缓存的处理方法-程序员宅基地

文章浏览阅读194次。有3dmax效果图渲染需求可以使用渲染100(注册填邀请码‘7788’可领券免费测试)检查灯光材质细分,全局细分,灯光缓存细分是否过高,如果参数过高,尝试调低参数渲染。可以试一下优化场景的工具,清理空物体、空代理、适当塌陷精简场景、清理场景垃圾等。、在vray全局开关勾选最大射线强度。通过隐藏或删除模型的方式逐步排查。、检查是否存在坡度渐变材质。、清理空物体等场景垃圾。

FPGA设计中,对SPI进行参数化结构设计_fpga spi spi_send-程序员宅基地

文章浏览阅读367次。今天给大侠带来FPGA设计中,对SPI进行参数化结构设计,话不多说,上货。为了避免每次SPI驱动重写,直接参数化,尽量一劳永逸。SPI master有啥用呢,你发现各种外围芯片的配置一般都是通过SPI配置的,只不过有三线和四线。SPI slave有什么用呢,当外部主机(cpu)要读取FPGA内部寄存器值,那就很有用了,FPGA寄存器就相当于RAM,cpu通过SPI寻址读写数据。代码仅供参考,勿做商业用途。SPI salveSPI salve支持功能: 支持三线SPI或者.._fpga spi spi_send

kettle-如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本_kettle9.0 参数无法传递给子转换-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏16次。用途如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本1、作业总体流程1.1、作业命名参数1.2、设置变量-步骤/* 如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本功能:获取或设置变量作用域:仅当前作业(job)有效parent_job.setVariableparent_job.getVariable功能:获取或设置参数变量作用域:作业(..._kettle9.0 参数无法传递给子转换

Linxu界面之如何使侧边栏自动隐藏?(Ubuntu)_如何隐藏ubuntu侧边栏-程序员宅基地

文章浏览阅读5.5k次。如果你装了ubuntu桌面版就会发现默认情况下桌面左边会有一个侧边栏,从中我们可以启动一些软件,但是这个侧边栏一直显示在桌面左边不是很美观,还会占据桌面的的空间。我们可以使其自动隐藏起来,当我们需要时只要把鼠标放到桌面左边它就会出现。1. 系统设置-外观打开系统设置,打开外观选项2. 点击&amp;amp;amp;amp;quot;行为&amp;amp;amp;amp;quot;标签3. 打开自动&amp;amp;amp;amp;quot;隐藏启动器&a_如何隐藏ubuntu侧边栏

推荐文章

热门文章

相关标签