警告:API 'variant.getJavaCompile()' 已过时,已被 'variant.getJavaCompileProvider()' 取代。

203

同步 Gradle 时突然出现以下错误:

警告:API 'variant.getJavaCompile()' 已过时,已被 'variant.getJavaCompileProvider()' 替换。它将在2019年底之前被移除。 更多信息请参见https://d.android.com/r/tools/task-configuration-avoidance 受影响的模块:app

我有一个用于应用程序模块的 build.gradle 文件:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'

apply plugin: 'io.fabric'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.2"
    defaultConfig {
        applicationId "..."
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "..."
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        versionNameSuffix = version_suffix

        [...]
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            [...]
        }
        debug {
            [...]
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.61"
    implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation "com.android.support:preference-v7:28.0.0"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
    implementation 'com.google.android.material:material:1.0.0-rc02'

    [...]
}

我能正确编译这个应用程序,但有点困扰,我发现在2019年底的时候,某些东西将停止工作。 有什么想法是什么,以及如何解决?

我能够正确编译应用程序,但是有点麻烦,我觉得到了2019年底会有一些东西停止工作。你有任何想法是什么以及如何解决吗?


仅仅是小小的挑剔,警告并不等同于错误。即使有警告,你的代码也应该以相同的方式编译,而错误会导致构建失败。这只是提前通知,当前的做法可能在未来无法工作,并且很可能会通过插件更新进行修复。你是否还花时间阅读了错误链接的页面 - Michael Dodd
2
我的个人感觉是由于一个插件还没有更新到使用新的Gradle API,这应该会在时间上自行解决。 - Michael Dodd
看看这个答案。https://dev59.com/C-k5XIcBkEYKwwoY7OHv#54566866 - Rahul Kushwaha
试一下这个。https://dev59.com/C-k5XIcBkEYKwwoY7OHv#55193824 - 0xAliHn
请参见 https://dev59.com/C-k5XIcBkEYKwwoY7OHv#55193824。 - David Figueroa
这个问题在4.3.1版本中仍然存在,可以在https://github.com/google/play-services-plugins/issues/65上跟踪。在`build.gradle(Project)`中使用版本`4.2.0`似乎是最可行的解决方案。 - Asghar Musani
28个回答

100

我在升级到3.3.0版本后遇到了这个问题。

如果你没有像gradle文件中错误说明的那样操作,那么就是某个插件仍未更新到新的API,导致了这个问题。为了找出是哪个插件,可以按照以下步骤进行操作(如3.3.0公告中的“使用已过时的API时提供更好的调试信息”所述):

  • 在你的gradle.properties文件中添加'android.debug.obsoleteApi=true',将会记录下更详细的错误日志
  • 再次尝试并阅读日志详情。会有一个“有问题”的插件的跟踪信息
  • 当你确定是哪个插件之后,尝试禁用它并查看问题是否得到解决,以确保无误
  • 前往该插件的github页面并创建包含详细日志和清晰描述的问题,这样可以帮助开发者更快地解决问题
  • 等待他们修复,或者你自己修复并为开发者创建PR

希望对其他人有所帮助。


6
在我看来,这是最普遍且有用的答案。在我的情况下,出现这种警告是由于使用了Groovy-Android插件(用于Spock测试)所致。 - AutonomousApps
2
这是正确的答案。谁点赞了Gradle版本更新? - Pier Betos
这对我也起作用了,这个问题有什么新的进展吗?同时我们似乎无能为力,是吗? - Billyjoker
@Billyjoker 实际上是有解决方法的...你需要做的是联系有问题插件的开发者。它不会自动解决,甚至开发者也可能无法解决。同时考虑用一些更新/现代的插件替换它,并重新考虑是否真的需要它,因为没有任何保证第三方插件会被修复。 - Ewoks
1
非常有帮助。在我的情况下,是Hugo插件的问题。 - AlvaroSantisteban
6
在添加了android.debug.obsoleteApi=true后,要查看记录的细节:转到底部的“构建”选项卡,在“Build Output”窗口中点击“Toggle View”。当你点击它时,漂亮的颜色会消失,滚动到顶部其中写着WARNING: API 'variant.getAssemble()' is obsolete。然后在它下面,显示出REASON: Called from: ...在我的情况下,是因为https://medium.com/@xabaras/automatically-copying-proguard-mapping-file-to-apk-build-directory-d7eed285632 - Someone Somewhere

83
这个问题已经通过更新Fabric Gradle版本1.30.0解决:
更新发布日期:2019年3月19日
请参阅此链接:https://docs.fabric.io/android/changelog.html#march-15-2019 请在项目级别的Gradle中更新您的类路径依赖项:
buildscript {
    // ... repositories, etc. ...

    dependencies {
        // ...other dependencies ...
        classpath 'io.fabric.tools:gradle:1.30.0'
    }
}

2
这也是一个正确的答案,解决面临的问题的简单方法。 - Muhammad Noman
5
我现在有一个classpath 'io.fabric.tools:gradle:1.29.0',我应该怎么做? - Faizan Mubasher
7
尝试将您的谷歌服务降级至4.2版本。 - Infinite Loops
4
@InfiniteLoops 建议降级到 4.2 似乎可行。 - HondaGuy
1
升级了Fabric到1.31.0并降级了Google服务到4.2.0,问题已解决。 - Mukeshkumar S
显示剩余4条评论

63

在我的情况下,这是由于Google移动服务4.3.0引起的。因此,我不得不将其更改为:

com.google.gms:google-services:4.2.0

我运行了以下代码发现这个结果:

gradlew sync -Pandroid.debug.obsoleteApi=true

在 Android Studio 中,打开视图 -> 工具窗口 -> 终端。


在Ubuntu中,无法运行此命令,我该怎么办?询问安装软件包,我已经安装了该软件包,但仍然无法运行。是否有其他方法? - Vasudev Vyas
3
我刚刚将我的GMS谷歌服务更新到4.2版本,然后警告消失了,谢谢。 - Infinite Loops
2
@VasudevVyas 如果在Android Studio中,只需在命令前添加 ./,即如果终端设置为您的Android项目的根目录。否则,您将不得不cd到项目的根目录。 - Guanaco Devs
3
我为什么要降级google-services依赖?这不是解决方案。 - Ahamadullah Saikat
4
@AhamadullahSaikat 这个问题可能会在未来的版本中得到修复。届时您可以再次升级它。这是在谷歌修复该问题之前的一种解决方法。 - Numan Karaaslan

34

这只是一个警告,可能会在2019年之前通过插件更新来修复,所以不用担心。建议您使用兼容的插件版本和gradle版本。

为了获得更好的体验和性能,您可以在此处检查插件版本和gradle版本。

https://developer.android.com/studio/releases/gradle-plugin

尝试使用稳定版本,以获得平滑、无警告/错误的代码。


25
这实际上比一个简单的警告更加隐蔽 - 它会影响代码编辑器并且阻止你搜索类的引用。 - IgorGanapolsky
这不仅出现在开发/金丝雀版中,也会在稳定版中发生,但我认为这是一个警告,随着更新的更新,它将被修复。 - Marlon López
1
@HarshilShah 无法保证有问题的插件会得到更新。开发人员可能永远不会知道这个问题。因此,我们能做的最好的事情就是遵循以下步骤:https://dev59.com/SVQK5IYBdhLWcg3wGMIP#54213973 - Ewoks

24

我也遇到了同样的问题。经过一段时间的搜索,我发现警告是因为我在应用程序中使用了最新版本的google-services插件(版本4.3.0)。顺便说一句,我在我的应用程序中使用这个插件来实现Firebase功能。我所做的就是降级我的google-services插件,在build.gradle(Project)级别文件中的buildscript中进行如下操作:

buildscript{
    dependencies {
       // From =>
       classpath 'com.google.gms:google-services:4.3.0'
       // To =>
       classpath 'com.google.gms:google-services:4.2.0'
    }
}

3
我已经升级到4.3.2版本,没有出现这个警告。 - tagy22

17

1) 在你的 gradle.properties 中添加 android.debug.obsoleteApi=true。它将显示警告日志受哪些模块影响。

2) 更新这些已弃用的函数。

  • variant.javaCompile 改成 variant.javaCompileProvider

  • variant.javaCompile.destinationDir 改成 variant.javaCompileProvider.get().destinationDir


10

从您的build.gradle更改Google服务版本:

dependencies {
  classpath 'com.google.gms:google-services:4.2.0'
}

1
我使用的是4.3.0版本,问题仍然存在。 - wesley franks
@wesleyfranks 一样。但是如果我切换到4.2.0,我就不再有这个问题了... - diAz
我使用的是4.3.1版本,问题仍然存在。 - pvalle

8
这是构建工具输出的警告,有两个原因。
1. 其中一个插件依赖于Task而不是TaskProvider,我们无能为力。
2. 您配置了任务的使用,而它支持TaskProvider。
WARNING: API 'variant.getGenerateBuildConfig()' is obsolete and has been replaced with 'variant.getGenerateBuildConfigProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance

WARNING: API 'variant.getJavaCompile()' 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

WARNING: API 'variant.getMergeResources()' is obsolete and has been replaced with 'variant.getMergeResourcesProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance

请留意以下代码片段并进行更新。

android {
    <library|application>Variants.all { variant ->
        /* Disable Generating Build config */
        // variant.generateBuildConfig.enabled = true // <- Deprecated
        variant.generateBuildConfigProvider.configure {
            it.enabled = true // Replacement
        }
    }
}

同样地,查找'variant.getJavaCompile()''variant.javaCompile''variant.getMergeResources()''variant.mergeResources'的使用情况。按照上述方式进行替换。
更多信息请参见任务配置避免

1
这在每个Android Studio项目中都会发生。与您提到的片段无关... - IgorGanapolsky
2
@IgorGanapolsky,这也会发生在终端中。尝试执行./gradlew。这与AS无关,而是与构建工具有关。升级/降级到com.android.tools.build:gradle:3.2.0并执行./gradlew。这将不会出现。 - VenomVendor
在我的项目中没有找到variant.generateBuildConfig.enabled。我仍然收到上述警告。 - kbsbng
在我的项目中没有找到variant.generateBuildConfig.enabled。我仍然收到上述警告。 - kbsbng
@VenomVendor 这是根据我的问题最有用的答案,您能否仍然帮助我处理这段代码片段吗?https://codeshare.io/G6ogzk - Raghav Satyadev
显示剩余5条评论

5

将 Kotlin(插件和 stdLib)版本升级到 1.3.1,可以解决我的警告问题。通过用现有的 Kotlin 版本替换整个项目中的 Kotlin 版本来更新 Kotlin 版本:

ext.kotlin_version = '1.3.50'

ext.kotlin_version = '1.3.10' 或者 '1.3.50' - Pushkin
这是我的问题。之前是 ext.kotlin_version = '1.2.71' .. 将其更改为上面的答案,它就可以正常工作了!-- 我删除了我的 /android/ios 文件夹,然后运行 flutter create . 重新构建Flutter应用程序,并将 ext.kotlin_version = '1.2.71' 放置在我的 build.gradle 中。 - MaylorTaylor

5
降低Gradle版本对我有帮助:
classpath 'com.android.tools.build:gradle:3.2.0'

5
降级从来都不是一个选择。 - Roshana Pitigala
这就是我想要的答案。谢谢! - linjiejun
在某些情况下,降级是可以接受的。 - martinseal1987
当然会。这很简单!但是,你的降级用完后还能再运行多久? - sud007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接