错误一
更新android studio至3.5.3错误提示
更新android studio至3.5.3版本后,在多渠道打包发现错误,因为忙别的事所以是直接从3.3.x升级到3.5.3,错误提示如下:
INFO: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
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 variantOutput.getPackageApplication(), use -Pandroid.debug.obsoleteApi=true on the command line to display more information.
Affected Modules: wanDa_SGQMS
image.png
原build.gradle配置:
if("Jenkins".equals(BuildChannel)){
android.applicationVariants.all {
variant ->
variant.getPackageApplication().outputDirectory = new File(BuildOutputDir)
variant.outputs.all {
output ->
if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
// APK输出文件名规则
def releaseApkName = "WDSG_${defaultConfig.versionName}_" + variant.flavorName + "_" + variant.buildType.name + "_" + releaseTime() + "_" + "From"+BuildChannel+".apk"
outputFileName = releaseApkName
}
}
}
}else{
android.applicationVariants.all {
variant ->
variant.outputs.all {
output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为WDSG__pro/dev_version_time.apk
def fileName = "WDSG_${variant.productFlavors[0].name}_V${defaultConfig.versionName}_${releaseTime()}.apk"
outputFileName = fileName
}
}
}
}
根据提示将修改并没有生效如下:
variantOutput.getPackageApplication()
替换成
variant.getPackageApplicationProvider()
发现并没有生效
查阅后得知:
output.outputFile具体实现里应该调用了variantOutput.getPackageApplication() 避开会调用output相关方法.
两个最重要的点:
- 更换输出安装包名称由设置
output.outputFile改成设置outputFileName,或者避免调用output相关的api - 将输出
apk复制到指定目录,即由原来的复制output.outputFile,改成复制variant.getPackageApplicationProvider().get().outputDirectory
第二点非常重要,这一点是上面警告的根源,更改代码之后,警告就消失了
更改后的build.gradle配置
if("Jenkins".equals(BuildChannel)){
android.applicationVariants.all {
variant ->
variant.getPackageApplicationProvider().get().outputDirectory = new File(BuildOutputDir)
def outputFile=variant.getPackageApplicationProvider().get().outputDirectory
variant.outputs.all {
output ->
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// APK输出文件名规则
def releaseApkName = "WDSG_${defaultConfig.versionName}_" + variant.flavorName + "_" + variant.buildType.name + "_" + releaseTime() + "_" + "From"+BuildChannel+".apk"
outputFileName = releaseApkName
}
}
}
}else{
android.applicationVariants.all {
variant ->
variant.outputs.all {
output ->
//def outputFile = output.outputFile //重点 ,将该行替换成新的api,如下
def outputFile = variant.getPackageApplicationProvider().get().outputDirectory
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为WDSG__pro/dev_version_time.apk
def fileName = "WDSG_${variant.productFlavors[0].name}_V${defaultConfig.versionName}_${releaseTime()}.apk"
outputFileName = fileName
}
}
}
}
错误二
按照以上修改后打包会出现以下错误:
Cause: buildOutput.apkData must not be null
image.png
删除build下面的output目录即可,重要
-
clean project -
删除
主module下面的build/outputs文件,或者直接删除整个build目录,如果不生效看第三点 -
后面将打包生成的目录文件也即
release文件夹下的output.json删除,重新打包,终于正常。
image.png
image.png
主要更改
- 将
output.outputFile改成为variant.getPackageApplicationProvider().get().outputDirectory,或者避免调用output相关的api - 将
variant.getPackageApplication().outputDirectory,改成为variant.getPackageApplicationProvider().get().outputDirectory











网友评论