Gradle variantOutput.getPackageApplication()已过时
随着GradleGradle variantOutput.getPackageApplication()已过时,gradle,android-gradle-plugin,build.gradle,deprecation-warning,build-variant,Gradle,Android Gradle Plugin,Build.gradle,Deprecation Warning,Build Variant,随着Gradle4.10.1和Android Gradle插件更新为3.3.0,我得到以下警告: 警告:API“variantOutput.getPackageApplication()”已过时,已被替换为“variant.getPackageApplicationProvider()” 该行及其周围的上下文(按构建变量分配输出文件名): 这个方法没有太大帮助;而variant.outputs.all可能出了问题-只是不知道该用什么替换它-迁移指南中提到了任务而不是构建变量。禁用文件时→ 设置→
4.10.1
和Android Gradle插件更新为3.3.0
,我得到以下警告:
警告:API“variantOutput.getPackageApplication()
”已过时,已被替换为“variant.getPackageApplicationProvider()
”
该行及其周围的上下文(按构建变量分配输出文件名):
这个方法没有太大帮助;而variant.outputs.all
可能出了问题-只是不知道该用什么替换它-迁移指南中提到了任务而不是构建变量。禁用文件时→ 设置→ 实验的→ 格拉德尔→ 仅同步活动变量
,我会收到更多的弃用警告(问题是,这些方法都没有被直接调用):
问:如何通过迁移到新API来避免这些弃用警告?variantOutput.getPackageApplication()是由更改的variant API引起的
将
output.outputFile.parent
更改为variant.getPackageApplicationProvider().get().outputfiles[1]
至少是一种临时解决方法
来源:
variant.getExternalNativeBuildTasks()是由
io.fabric
插件引起的
下一版本的io.fabric
插件将使用variant.getExternalNativeBuildProviders()
资料来源:;对于承诺的修复(1.28.1
)
这些是由
com.google.gms.google服务引起的:
registerResGeneratingTask已弃用,请使用registerGeneratedResFolders(FileCollection)
“variant.getMergeResources()”已过时,已替换为“variant.getMergeResourcesProvider()”
这说明了如何通过将插件生成的XML资源(例如从build/generated/res/google services/debug/values/values.XML
添加到常规的debug/values/values.XML
中,从而完全摆脱com.google.gms.google服务
插件
最简单、最省力的方法可能是:
buildscript {
repositories {
google()
maven { url "https://maven.fabric.io/public" }
}
dependencies {
//noinspection GradleDependency
classpath "com.android.tools.build:gradle:3.2.1"
classpath "io.fabric.tools:gradle:1.28.1"
}
}
有关调试信息:/gradlew-Pandroid.debug.obsoleteApi=true-mobile:assembleDebug
所有这些警告都不会以任何方式改变行为。我过去常这样写:
android.applicationVariants.all { variant ->
if ("release" == variant.buildType.name) {
variant.outputs.all { output ->
outputFileName = output.outputFile.name.replace("-release", "")
}
variant.assemble.doLast {
variant.outputs.all { output ->
delete output.outputFile.parent + "/output.json"
copy {
from output.outputFile.parent
into output.outputFile.parentFile.parent
}
delete output.outputFile.parent
}
}
}
}
每次都会弹出警告,如打开为、同步、清除
然后我找到了一种写的方法,它只会出现在构建中,但不会每次都弹出
android.applicationVariants.all { variant ->
if ("release" == variant.buildType.name) {
assembleRelease.doLast {
variant.outputs.all { output ->
delete output.outputFile.parent + "/output.json"
copy {
from output.outputFile.parent
into output.outputFile.parentFile.parent
rename { filename ->
filename.replace("-release", "")
}
}
delete output.outputFile.parent
}
}
}
}
如果你只是不想每次都弹出警告,这些可能会给你一些提示。将Fabric gradle插件更新为1.28.1
dependencies {
classpath 'io.fabric.tools:gradle:1.28.1'
}
更改日志:
通过切换到Gradle的任务配置避免API(如果可用),消除了过时的API警告
您可以使用更简单的方法,类似于此示例:
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "${globalScope.project.name}-${variant.versionName}_${output.baseName}.apk"
}
}
结果将是my_app-1.9.8_-flavor1-release.apk
在代码中,有问题的部分(生成警告)是output.outputFile
:
..
outputFileName = new File(output.outputFile.parent, fileName).getName()
..
问题是output.outputFile
正在内部调用getPackageApplication()
我通过自己设置输出文件的目录和名称解决了这个问题
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputDir = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
def outputFileName = "app-${variant.flavorName}-${variant.buildType.name}.apk"
// def outputFile = new File("$outputDir/$outputFileName")
variant.packageApplicationProvider.get().outputDirectory = new File("$outputDir")
output.outputFileName = outputFileName
}
}
所以我得到了同样的问题(截至目前,运行Gradle 5.4.1)。此外,我并没有看到一个有效地涵盖应用程序项目和库项目的答案
因此,如果需要的话,我想制作一些理论上可以用于任何项目的东西,为整个项目制作一个build.gradle。因为结果很好,所以我想我应该添加它,以防有人想要同时适用于应用程序和库项目的东西
编辑:
自最初发布此方法以来,我已对其进行了更新/优化。我现在将gradle 6.3与Kotlin DSL一起使用,下面的工作非常顺利
编辑2:
Android Gradle build tools 4.1.0(beta版)中的某个地方似乎默认情况下禁用了库项目的生成配置,因此我不得不更改一行,以接受带有备份的空值,更新如下
/**
*为提供的变量的所有输出配置输出文件名。就是
*提供的应用程序或库。
*
*@param variant随{android.defaultConfig.applicationVariants.all.this}传入
*@param project从中获取文件名的项目。提示:使用rootProject
*@param formatString文件名的格式字符串,将使用三个
*参数:(1)项目名称,(2)版本名称,(3)生成类型。“.apk”或“.aar”是
*自动追加。如果未提供,则默认为“%1$s-%2$s\u3$s”
*/
@抑制警告(“不必要的限定引用”)
有趣的配置输出文件名(
变体:com.android.build.gradle.api.BaseVariant,
项目:项目,,
formatString:String=“%1\$s-%2\$s\%3\$s”
) {
variant.outputs.configureEach{
val fileName=formatString.format(project.name,
outputVariant.generateBuildConfigProvider.orNull?.versionName?.orNull?:
project.version,variant.buildType.name)
val tmpOutputFile:File=when(变量){
是com.android.build.gradle.api.ApplicationVariant->
文件(variant.packageApplicationProvider!!.get().outputDirectory.asFile)
.get().absolutePath,“$fileName.apk”)
是com.android.build.gradle.api.LibraryVariant->
文件(variant.packageLibraryProvider!!.get().destinationDirectory.asFile)
.get().absolutePath,“$fileName.aar”)
else->outputFile
}
(这是com.android.build.gradle.internal.api.BaseVariantOutputImpl)
.outputFileName=tmpOutputFile.name
println(“输出文件设置为\“${tmpOutputFile.canonicalPath}\”)
}
}
原件:
..
outputFileName = new File(output.outputFile.parent, fileName).getName()
..
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputDir = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
def outputFileName = "app-${variant.flavorName}-${variant.buildType.name}.apk"
// def outputFile = new File("$outputDir/$outputFileName")
variant.packageApplicationProvider.get().outputDirectory = new File("$outputDir")
output.outputFileName = outputFileName
}
}
'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.6'
def selfAssembledOutputPath = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
// this is the line:
outputFileName = selfAssembledOutputPath
def variant = findYourVariantSomehow()
def output = findCorrectOutputInVariant(variant)
def fileName = output.outputFileName
def fileDir = variant.packageApplicationProvider.get().outputDirectory.get()
def apkFile = file("$fileDir/$fileName")