虽然 Android Studio 更新到 v3.3 得到 API 'variant.getAssemble()' 已过时并已替换为 'variant.getAssembleProvider()'

While Android Studio Updated to v3.3 getting API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'

收到此警告(即使 variant.getAssemble() 未在任何地方使用):

API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'.

我更新了以下组件: Android工作室

v3.3

Gradle 插件

v3.3

Gradle分布URL(gradle-wrapper.properties)

distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

gradle.properties

android.debug.obsoleteApi=true

如果使用的某些库是您的项目正在使用此方法,则会出现此类警告

临时解决!
- 编辑你的根 "build.gradle" 文件。
- 将 "com.android.tools.build:gradle:3.3.0" 更改为“3.2.0”
完成。

同样的问题:

看看这个:

这是一个警告,它不会对您的构建产生负面影响。您可以继续 更新到 AGP 3.3.0

新的 Android Gradle 插件开始利用惰性配置(Task Configuration Avoidance API 和 Provider API),如果使用得当,可以提高构建速度只评估需要的任务和属性。 AGP 的消费者需要使用更新后的 API(例如 getAssembleProvider().configure() 而不是 getAssemble()),否则任务和属性总是被评估。

懒惰的要点API:不要在特定构建中配置不会运行的任务。

阅读更多:

做什么

如果它不是来自您的代码,除了等待更新的库(并祈祷他们做对了)之外,您别无他法。

如果它来自您的代码,这里有一个迁移示例:我正在使用 Jake Wharton 的这段代码来禁用我的库模块的 BuildConfig.java 生成。

libraryVariants.all {
    it.generateBuildConfig.enabled = false
}

使用新的惰性 API 看起来像这样。

libraryVariants.all {
    it.generateBuildConfigProvider.configure {
        it.enabled = false
    }
}

急切的API会导致generateBuildConfig任务被配置,即使我不需要它,例如运行宁clean。惰性 API 配置任务 仅当 它是 运行 任务图的一部分时。这可以节省配置阶段的时间。

如何判断它是否来自您的代码?将其放入您的 gradle.properties

android.debug.obsoleteApi=true

现在 运行 构建并检查堆栈跟踪的输出。

完全错误

为了完整起见,下面是 Fabric 插件 1.27.0 和 AGP 3.3.0 导致的完整错误消息示例:

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.
To determine what is calling variant.getExternalNativeBuildTasks(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace.

坏榜样

以下是 Facebook React 如何在其插件中处理 API 迁移的差异:https://github.com/facebook/react-native/pull/23103/files

换句话说,他们没有。 taskProvider.get() 等于 task - 两种用法都是急切的。始终配置任务。

此方法唯一实现的是删除警告,因此

  • 消费者不知道他们没有从懒惰者那里得到任何好处 API,
  • 不再提醒插件作者他们使用错误。

Task Configuration Avoidance API docs 包含一个迁移指南和一个有用的 table 描述如何延迟创建和链接任务。如果您是插件作者,请阅读。

variant.assemble 已被弃用并由新的提供程序取代 API.

例如,如果您将其用作下一个:

variant.outputs.all { output ->
        variant.assemble.doLast {
            ....
        }
    }
}

然后替换为新的提供者API:

variant.outputs.all { output ->
    variant.getAssembleProvider().configure() {
        it.doLast { 
            ....
        }
    }
}

我有同样的警告!!

这是我的应用级别 gradle 文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
    applicationId 'com.lauszus.facerecognitionapp'
    minSdkVersion 16
    targetSdkVersion 28
    versionCode 6
    versionName '1.2.3'
    vectorDrawables.useSupportLibrary = true
    ndk {
        stl 'c++_static'
        cFlags '-std=gnu++11 -fexceptions -frtti -DANDROID_STL=c++_static'
    }
    setProperty('archivesBaseName', rootProject.name + '-' + defaultConfig.versionName)
}
splits {
    abi {
        enable true
        reset()
        universalApk true
        include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
    }
}
project.ext.abiCodes = ['armeabi-v7a':1, 'arm64-v8a':2, 'x86':3, 'x86_64':4]
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(com.android.build.OutputFile.ABI))
        // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes,
        // the following code does not override the version code for universal APKs.
        if (baseAbiVersionCode != null) {
            output.versionCodeOverride = baseAbiVersionCode * 1000000 + variant.versionCode
        }
    }
    if (variant.getBuildType().isMinifyEnabled()) {
        variant.assemble.doLast {
            variant.mappingFile.renameTo(variant.mappingFile.parent +
                    "/$archivesBaseName-$variant.baseName-mapping.txt")
        }
    }
}
signingConfigs {
    release
}
buildTypes {
    debug {
        jniDebuggable true
        externalNativeBuild {
            ndkBuild {
                arguments 'NDK_DEBUG=1', 'NDEBUG=null'
            }
        }
    }
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}
externalNativeBuild {
    ndkBuild {
        path 'src/main/cpp/Android.mk'
    }
}
lintOptions {
    abortOnError false
}
 }

 dependencies {

   implementation 'com.android.support:appcompat-v7:28.0.0'
   implementation 'com.android.support:design:28.0.0'
   implementation project(':opencv')

  }

 // These values are all set in my global gradle.properties file
 if (project.hasProperty('storeFile') && project.hasProperty('storePassword') && 
  project.hasProperty('keyAlias') && project.hasProperty('keyPassword')) {
  android.signingConfigs.release.storeFile = file(storeFile)
  android.signingConfigs.release.storePassword = storePassword
  android.signingConfigs.release.keyAlias = keyAlias
  android.signingConfigs.release.keyPassword = keyPassword
} else {
android.buildTypes.release.signingConfig = null
}

如果您的应用级别gradle文件包含variant.assemble.doLast块;尝试将“variant.assemble.doLast”更改为“variant.assembleProvider.get().doLast

像这样:

 if (variant.getBuildType().isMinifyEnabled()) {
        variant.assembleProvider.get().doLast {   //HERE
            variant.mappingFile.renameTo(variant.mappingFile.parent +
                    "/$archivesBaseName-$variant.baseName-mapping.txt")
        }
    }

referred 网页 link.

检查您的应用级别 gradle。或在其中应用 gradle 。进行了如下更改

原文:

    android.applicationVariants.all { variant ->

    variant.assemble.doLast {

修复后:

android.applicationVariants.all { variant ->

    variant.assembleProvider.get().doLast {