API 'variant.getExternalNativeBuildTasks()'已过时,已被替换为'variant.getExternalNativeBuildProviders()'。

346

使用带有Gradle插件版本3.3.0-alpha11的Android Studio 3.3 Canary 11,在尝试同步Gradle时会抛出以下错误

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

点击错误会让我跳转到gradle文件中的这一行。

applicationVariants.all { variant ->
            variant.outputs.all {
                outputFileName = "${variant.name}-${variant.versionName}.apk"
            }
        }

我需要在这里做些什么变更?

项目 build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        mavenCentral() // jcenter() works as well because it pulls from Maven Central
        maven { url "https://maven.google.com" }
        google()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0-alpha11'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath "io.realm:realm-gradle-plugin:4.1.1"
        classpath 'com.google.gms:google-services:3.2.1'
        classpath 'com.google.firebase:firebase-plugins:1.1.5'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://maven.google.com" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

// Define versions in a single place
ext {
    // Sdk and tools
    minSdkVersion = 21
    targetSdkVersion = 27
    compileSdkVersion = 27
    buildToolsVersion = '27.0.3'

    // App dependencies
    supportLibraryVersion = '27.1.1'
    appCompactLibraryVersion = '27.1.1'
    playServicesVersion = '15.0.1'
    firebaseVersionCore = '16.0.1'
    firebaseVersionPerf = '16.0.0'
    firebaseVersionMessaging = '17.1.0'

    //lottie
    lottieVersion = '2.5.0'
}

应用程序 build.gradle

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.25.4'
    }
    buildscript {
        repositories {
            maven { url "https://maven.google.com" }
            maven { url 'https://maven.fabric.io/public' }
            mavenCentral()

        }

        dependencies {
            // These docs use an open ended version so that our plugin
            // can be updated quickly in response to Android tooling updates

            // We recommend changing it to the latest version from our changelog:
            // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin
            classpath 'io.fabric.tools:gradle:'
        }
    }
}
apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'
repositories {
    maven { url 'https://maven.fabric.io/public' }
}

apply plugin: 'io.fabric'
apply plugin: 'realm-android'

android {

    realm {
        syncEnabled = false
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId "example.com"
        minSdkVersion rootProject.ext.minSdkVersion
        multiDexEnabled true
        versionCode mVersionCode
        versionName mVersionName
        vectorDrawables.useSupportLibrary = true

    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    buildTypes {

        applicationVariants.all { variant ->
            variant.outputs.all {
                outputFileName = "${variant.name}-${variant.versionName}.apk"
            }
        }

        release {
            shrinkResources true
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            lintOptions {
                disable 'MissingTranslation'
            }

            applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${variant.name}-${variant.versionName}.apk"
                }
            }

        }
        debug {
            shrinkResources true
            minifyEnabled true
            useProguard true
            debuggable true
            versionNameSuffix '-DEBUG'
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'debug-proguard-rules.pro'

            ext.enableCrashlytics = false
            crunchPngs false

        }
    }

    flavorDimensions "default"

    lintOptions {

        checkReleaseBuilds false

    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }
    buildToolsVersion '28.0.2'
}

configurations {
    implementation.exclude group: "org.apache.httpcomponents", module: "httpclient"
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    implementation "com.android.support:appcompat-v7:$rootProject.appCompactLibraryVersion"
    implementation "com.android.support:support-compat:$rootProject.supportLibraryVersion"
    implementation "com.android.support:mediarouter-v7:$rootProject.supportLibraryVersion"
    implementation "com.android.support:cardview-v7:$rootProject.supportLibraryVersion"
    implementation "com.android.support:design:$rootProject.supportLibraryVersion"


    api 'com.squareup.retrofit2:retrofit:2.4.0'
    api 'com.squareup.okhttp3:okhttp:3.11.0'
    api 'com.squareup.okhttp3:logging-interceptor:3.10.0'
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.picasso:picasso:2.5.2'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.daimajia.easing:library:2.0@aar'
    implementation 'com.daimajia.androidanimations:library:2.3@aar'

    implementation 'com.akexorcist:googledirectionlibrary:1.0.5'
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'io.reactivex:rxjava:1.3.0'
    // Wifi hotspot library
    implementation 'cc.mvdan.accesspoint:library:0.2.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'org.jsoup:jsoup:1.10.3'
    api "com.airbnb.android:lottie:$rootProject.lottieVersion"
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    testImplementation 'junit:junit:4.12'
    implementation 'com.jakewharton:butterknife:8.8.1'

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'

    implementation 'com.googlecode.libphonenumber:libphonenumber:8.2.0'

    implementation "com.google.android.gms:play-services-base:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-cast-framework:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-auth:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-identity:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-awareness:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-cast:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-drive:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-location:$rootProject.playServicesVersion"
    implementation "com.google.android.gms:play-services-maps:$rootProject.playServicesVersion"

    implementation "com.google.firebase:firebase-core:$rootProject.firebaseVersionCore"
    implementation "com.google.firebase:firebase-perf:$rootProject.firebaseVersionPerf"
    implementation "com.google.firebase:firebase-messaging:$rootProject.firebaseVersionMessaging"
    implementation "com.google.firebase:firebase-analytics:$rootProject.firebaseVersionCore"


    api('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
        transitive = true
    }
    api('com.crashlytics.sdk.android:answers:1.4.1@aar') {
        transitive = true
    }
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    api project(path: ':libraryBTHelper')
    api project(':bkk_rush')

    debugApi 'com.amitshekhar.android:debug-db:1.0.3'
    api "org.jdeferred:jdeferred-android-aar:1.2.6"
    implementation 'com.android.support:gridlayout-v7:27.1.1'
}

apply plugin: 'com.google.gms.google-services'

我在 app/build.gradle 文件中省略了一些常量和其他敏感信息。


@Skizo-ozᴉʞS 添加了项目 build.gradle 文件。 - Jude Fernandes
@alashow 这与不同的问题有关,消息是“API 'variant.getJavaCompile()'已过时..” - Vadim Kotov
16
稳定版本也存在问题。 - kp91
同时也需要将 Fabric Gradle 插件更新到最新版本(1.27.0)。 - galcyurio
@JudeFernandes 你知道警告和错误之间有区别吗? - user25
显示剩余6条评论
21个回答

293

确保在项目级别和应用程序中的build.gradle文件中进行更改。 - RJB
2
版本1.28.0解决了我的问题,当前版本为1.29.0 https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin - Alexander Hartmann
这是变更日志:https://docs.fabric.io/android/changelog.html#march-15-2019 - DSchmidt
我在使用classpath 'io.fabric.tools:gradle:1.31.0'implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'时仍然收到此警告。这可能是再次出现了问题,或者并未针对所有情况进行修复。 - Gene S
你从哪里获取到这个 Fabric Tools Gradle 版本的呢?我只能找到 1.25.4。https://mvnrepository.com/artifact/io.fabric.tools/gradle - Lachlan Young
Fabric已于2020年3月31日停用,其开发已完全转移到Firebase Crashlytics。 - Mahdi Javaheri

249

编辑

此问题已在Fabric 1.28.0中得到修复。在项目级别的build.gradle中,添加以下行:

classpath 'io.fabric.tools:gradle:1.28.1'

之前的回答

这是我将Android Studio更新至3.3.0后发生的。原因在于apply plugin: 'io.fabric'。我已向Firebase团队报告了此问题。

你有三个选择:

在你应用程序模块的build.gradle文件中:

apply plugin: 'com.android.application'
// apply plugin: 'io.fabric' <== this plugin causes the error

然而,即使出现此错误,您仍然可以构建和运行您的项目。只需忽略它。


2
您可以链接到您在Firebase上打开的错误报告或问题吗? 我很想给它投票。 - yuval
8
如果我必须使用io.fabric插件,那么如何在不更改代码的情况下消除此警告? - 0xAliHn
16
这是原因,不是可行的解决方案。 - Daniel Wilson
1
他们说你可以使用它直到2019年结束。目前我正在使用,我们会看看会发生什么) - support_ms
4
为什么要降级?没有意义!这只是一个警告,它还没有被移除,而且它可以构建你的项目(整个2019年……)。我相信他们会在今年修复它。 - user25
显示剩余12条评论

61
在应用程序的build.gradle中,降级到这个稳定版本的gradle:
classpath 'com.android.tools.build:gradle:3.2.1'

我更新 Android Studio 到 3.3 后遇到了这个问题,他们修复它之前的临时解决方案。


编辑: 您不需要将 Android Studio 降级


2
那么你还需要降级到Android Studio 3.2.1。无论如何感谢您。 - Rubén Viguera
我在将Android Studio(AS)升级到3.3版本后遇到了同样的问题。通过将Gradle降级到4.6版本和Android Gradle插件降级到3.2.1版本,我成功地使Gradle同步工作正常,这也是我在AS更新之前使用的版本。如果您不确定如何修改gradle和插件的版本,请查看此处的表格。 - Rabie Jradi
6
感谢建议,它可以不降级就运作成功了。 - Sid
既然我的回答变成了你上面看到的评论,让我补充一下:仅仅改变gradle插件的版本为3.2.1,我无法使这个答案提出的解决方案工作。我还必须将gradle降级到4.6,否则gradle同步仍会抱怨。 - Rabie Jradi
3
你不需要降级你的Android Studio @RubénViguera - Amer Alzibak
1
你只需要像答案中提到的那样降低gradle版本,不需要降级其他任何东西。这应该是被接受的答案。 - Danish Ansari

17

更新 从今天起,您可以使用classpath 'io.fabric.tools:gradle:1.28.0'来解决此问题!

如果暂时通过在应用程序 gradle 文件中注释掉Crashlytics的插件io.fabric可帮助您解决问题。

//apply plugin: 'io.fabric'

然后在项目Gradle文件中升级您的布局Gradle依赖项将永久解决此问题:

classpath 'io.fabric.tools:gradle:1.27.0'

NB:这并不会删除警告,但可以让您在AS3.3+中使用Crashlytics。


@RJB 你在使用Crashlytics吗?如果你从项目中移除它,是否可以正常工作?如果是的话,这应该可以解决问题。但是你可能仍然会收到警告,但是项目将编译并且你可以安全地生成apk。 - 113408
是的,我的意思是我仍然收到警告。 - RJB
Op和其他人(包括我)遇到了这个问题,无法启用crashlytics编译项目。因此,为了保持Crashlytics并仍然推送到生产环境,即使它仍会触发“警告”,您也可以使用上述提到的更新。 - 113408

14

不确定实际问题是什么,但从项目中注释掉与crashlytics相关的依赖项解决了问题。


12

确认这是Crashlytics的一个bug,他们正在处理中。

https://issuetracker.google.com/issues/116408637

来自Google工程师的引用:

je...@google.com #23 Jan 23, 2019 01:40AM
大家好,

感谢您的耐心等待。

看起来所有情况下的bug都是来自于Crashlytics,我已经向他们报告了这个问题。

我会及时向大家更新进展情况。

对于我而言,在我的设备上运行并忽略警告而不注释Crashlytics或Fabric,我的调试应用程序可以正常工作。我还没有尝试过生产环境。

更新:

Google Issue Tracker标记此问题为“无法修复(不可行)”,因为所有问题都来自于Crashlytics,并让Crashlytics团队解决(尽管他们是同一家公司的人...)。

他们建议通过以下链接获取Crashlytics更新:

https://github.com/firebase/firebase-android-sdk/issues/198

注意:我仍在使用Android Studio 3.3和io.fabric.tools:gradle:1.26.0,而不注释任何Crashlytics,我的调试应用程序可以正常工作。

更新:

我现在可以确认在我的生产/发布版本应用程序上运行得很好。如何知道它运行良好?因为它向我发送了崩溃报告 -_-'

无论如何,只需忽略警告,他们最终应该修复它。

啊,刚刚看到它已经在 1.28.0 版的 fabric 中修复了 :)


9

2019年1月24日最新消息

enter image description here

有关信息在此处:https://issuetracker.google.com/issues/116408637

我们需要等待Crashlytics提出解决方案,这里是GitHub上的问题讨论:

https://github.com/firebase/firebase-android-sdk/issues/198

目前我使用的唯一方法是降级我的gradle并升级我的fabric classpath(这适用于我的生产应用程序),以避免注释io.fabric插件。

 dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'com.google.gms:google-services:4.2.0'
        classpath 'io.fabric.tools:gradle:1.27.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

我们在 proguard-rules.pro 中添加 -dontwarn com.crashlytics.android.Crashlytics 怎么样? - Mustansir
1
如果你通过这种方式消除了警告,问题仍然存在,你最终仍需要回到问题上。 - Gastón Saillén
没错!这只是一个临时解决方案,可以让构建编译,但比降级所有内容要好得多。 - Mustansir
是的,降级会导致它工作,如果您忽略警告,您可以保留更新版本,但它不会工作。 - Gastón Saillén
@Mustansir,我认为这是一个与Gradle相关的问题,与Proguard无关。 - WindRider

5

4
问题跟踪器可能指的是“懒惰任务配置”,至少任务配置避免是这样建议的。但是,当variant.outputs.all不会(在内部)访问该方法时,或者检查可以防止访问时,或者通过名称访问变量,或者以某种方式禁用变量的外部本地构建任务时,可能可以防止访问这种已过时的BaseVariantImpl方法。另请参阅单变量项目同步选项,这似乎更相关。或者等待构建工具3.3.0-alpha123.3.0-beta1...这甚至不是一个发布候选版,因此投入太多时间可能是无意义的——除非用它来提交另一个错误报告。
新的快速反馈quick feedback按钮仍然看起来最有前途。

是的,我同意,这种类型的错误在以前的构建工具中不存在。下一个 RC 版本可能会修复它。 - d4c0d312
7
它在发布版中没有被修复。 - Juan Diaz
android.debug.obsoleteApi=true添加到代码中以查看它来自哪里。有一些方法被重命名,名称后附加了Provider - Martin Zeitler
@MartinZeitler,请问在哪里放置以使AS检查过时的API变得过时?我的意思是android.debug.obsoleteApi=true。 - Sergey Narozhny
1
@SergeyNarozhnyy 在 gradle.properties 项目中。 - sigitbn
1
@SergeyNarozhnyy, 3.3.0 发布后变量 API 发生了变化,导致某些功能出现问题。这里有一次最近的讨论链接:https://dev59.com/wVQJ5IYBdhLWcg3wQzqC(我在那里添加了一个总结作为答案)。 - Martin Zeitler

4

针对这个问题,我按照以下步骤进行了操作: 1.在项目级别的build.gradle文件中升级Gradle依赖。

        classpath 'io.fabric.tools:gradle:1.28.0'
  1. add this plugin dependency below apply plugin: 'com.android.application' in the app level build.gradle.

        apply plugin: 'io.fabric'
    
  2. Sync the project with gradle files.


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