【问题标题】:While Android Studio Updated to v3.3 getting API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'虽然 Android Studio 更新到 v3.3,但获取 API 'variant.getAssemble()' 已过时并已替换为 'variant.getAssembleProvider()'
【发布时间】:2019-06-09 03:35:09
【问题描述】:

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

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

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

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

【问题讨论】:

  • 那么,你的问题是什么?

标签: android android-studio gradle gradle-plugin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    同样的问题:

    https://stackoverflow.com/a/52470224/8920453

    看看这个:

    https://stackoverflow.com/a/54239512/8920453

    【讨论】:

    【解决方案3】:

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

    新的 Android Gradle 插件开始利用惰性配置(任务配置避免 API 和提供程序 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
        }
    }
    

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

    如何判断它是否来自您的代码?把这个放在你的gradle.properties

    android.debug.obsoleteApi=true
    

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

    完全错误

    为了完整起见,下面是一个由带有 AGP 3.3.0 的 Fabric 插件 1.27.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 包含一个迁移指南和一个有用的表格,描述了如何懒惰地创建和链接任务。如果您是插件作者,请阅读。

    【讨论】:

      【解决方案4】:

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

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

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

      然后将其替换为新的提供程序 API:

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

      【讨论】:

      • 这正是你不应该做的。这两个代码示例是等效的,这意味着您根本没有任何好处。当您致电Provider.get() 时,即使没有其他人需要它,您也会进行评估。惰性配置 API 的全部意义在于不准备从未使用过的东西。示例:如果我只调用gradlew clean,则不需要设置输出。
      • 您似乎没有理解答案。说明从现在开始必须使用提供程序。 “示例”针对需要输出的特定情况,展示了如何通过提供者而不是旧 API 进行相同的调用。
      • 1) 您只是隐藏了错误消息,但问题仍然存在。 2) 旧的 API 没有被删除并且仍在工作。版本 3.3.0 不是主要版本 - 不允许删除。并且错误消息明确指出旧 API 将在 2019 年底 被删除。 3) variant.getAssemble() 等于 variant.getAssembleProvider().get()。两人都很热心。您应该调用variant.getAssembleProvider().configure { ... },它只会在评估任务时和if 执行configure 块。请参阅此处了解它的外观:pastebin.com/SC2HY3CB
      • 您可以在此处阅读有关避免任务配置的更多信息:docs.gradle.org/current/5.1.1/task_configuration_avoidance.html
      • 感谢您的链接,非常好澄清它。我已经根据文档应该如何更新答案,因为这对我来说也非常有用。请添加您认为可能需要的任何注释。我认为,如果您用更多示例扩展您的答案,那将是一个好主意,因为这是一个新的变化,没有多少开发人员不会正确处理。
      【解决方案5】:

      我也有同样的警告!!

      这是我的应用级 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 网页链接。

      【讨论】:

        【解决方案6】:

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

        原文:

            android.applicationVariants.all { variant ->
        
            variant.assemble.doLast {
        

        修复后:

        android.applicationVariants.all { variant ->
        
            variant.assembleProvider.get().doLast {
        

        【讨论】:

          猜你喜欢
          • 2019-09-28
          • 2019-09-10
          • 2019-02-23
          • 2019-05-23
          • 2019-07-19
          • 2018-12-25
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          相关资源
          最近更新 更多