Android Gradle 3.0.0-alpha2插件,无法设置只读属性“outputFile”的值

我正在使用这个代码

applicationVariants.all { variant -> variant.outputs.each { output -> def SEP = "_" def flavor = variant.productFlavors[0].name def buildType = variant.variantData.variantConfiguration.buildType.name def version = variant.versionName def date = new Date() def formattedDate = date.format('ddMMyy_HHmm') def newApkName = PROJECT_NAME + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk" def file = new File(newApkName) output.outputFile = file } } 

当我build立新的apk时更改apk文件的名称,但是因为我使用Android Studio 3.0 Canary 2,所以出现此错误:
无法设置只读属性“outputFile”的值….

由于Android插件3.0迁移指南build议:

  • 使用all()而不是each()
  • 使用outputFileName而不是output.outputFile如果你只改变文件名(这是你的情况)

指南中的示例:

 // If you use each() to iterate through the variant objects, // you need to start using all(). That's because each() iterates // through only the objects that already exist during configuration time— // but those object don't exist at configuration time with the new model. // However, all() adapts to the new model by picking up object as they are // added during execution. android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = "${variant.name}-${variant.versionName}.apk" } } 

见下文:

 applicationVariants.all { variant -> variant.outputs.all { output -> def newApkName = applicationId + "-" + variant.versionName + "(" + variant.versionCode + ")" + ".apk"; outputFileName = new File("${project.projectDir}/../outputs/apks/" + variant.name, newApkName); } } 

下面的代码在android studio canary 3.0.0-alpha3上为我工作

 android.applicationVariants.all { variant.outputs.all { def newApkName newApkName = "APPLICATION_NAME-" + defaultConfig.versionName + "-" + defaultConfig.versionCode".apk" outputFileName = newApkName; } } 

这改变了apk文件的名字

我创build的gradle 3.0已经不在工作了。 源链接

但是,涉及访问outputFile对象的更复杂的任务不再有效。 这是因为变体特定的任务不再在configuration阶段创build。 这导致插件不能预先知道所有的输出,但这也意味着更快的configuration时间。

然后我使用命令gradlew编译project.and cp输出apk到我指定的path

在更新到Android Studio 3.0.0并使用新的gradle之后,现在,apks的输出将通过flavor名称和构buildtypes分布在目录中。