我在gradle和Android Studio中遇到问题,仅在Android Studio中构建时才会出现(BuildServer和Commandline可以正常工作)
applicationVariants.all { variant ->
def file = variant.outputFile
variant.outputFile = new File(file.parent, file.name.replace("app-", getDate() + "_myapp_" + getGitCommit() +"_"));
}
def getDate() {
def dateNow = new Date()
def formattedDate = dateNow.format('yyyy-MM-dd_HH-mm-ss')
return formattedDate
}
构建工作正常,但是当AS想要将apk复制到设备时,它将引发
Local path doesn't exist.
错误。问题在于生成的文件如下所示:
2014-03-17_16-17-41_myapp__debug-unaligned.apk
但是AS会寻找:
2014-03-17_16-17-18_myapp__debug-unaligned.apk
这是由特定于AS的构建步骤以某种方式生成的,导致重新计算了日期。我试图用一个外部属性在构建日期上对其进行修复,该属性在整个构建过程中应保持不变,但是可能由于我缺乏gradle技能,这没有帮助。
也许有人为我提供了一种解决方法,以使我的构建可以在Android Studio中进行。
最佳答案
这很正常,尽管很不幸。
Studio打开项目时,它将查询Gradle以获取项目模型。这包括模块列表,以及每个模块,它们的源文件夹,它们的依存关系以及它们的构建输出。在这种情况下,APK。
因此,当Studio向Gradle查询模型时,我们的插件将构建模型,其中包括运行重命名APK文件名的自定义代码。然后将其发送到Studio进行记录。
但是,无论何时构建,Studio都会告诉Gradle进行构建,但不会传递任何其他信息。 Gradle实际上将再次重新创建模型,并再次运行您的代码。
这意味着在每次构建时,APK文件名都是不同的(因为APK文件名包含第二个日期),但是它们都不匹配在项目导入期间创建的文件名。这使部署失败。
目前无法让Gradle向Studio发送生成的APK的文件名。
编辑:执行此操作的更好方法是保留当前输出,但将其复制到新文件中以进行保管。
我会做这样的事情:
android.applicationVariants.all { variant ->
def file = variant.output
// create the new task
def copyTask = project.tasks.create("copy${variant.name}Apk", Copy)
copyTask.from = file
copyTask.into = file.parent
copyTask.rename("app-", getDate() + "_myapp_" + getGitCommit() +"_")
// set up task dependencies
// first make the assemble task depend on copyTask to make sure it gets called.
variant.assemble.dependsOn copyTask
// then make copyTask depend on the actual packaging task.
copyTask.dependsOn variant.packageApplication
}
请注意,复制任务期望将文件夹作为目标,因此我们必须使用重命名规则。