在名称中使用时间戳时,Android Studio无法在生成后启动应用程序

在名称中使用时间戳时,Android Studio无法在生成后启动应用程序,android,gradle,android-studio,Android,Gradle,Android Studio,我对gradle和Android Studio有一个问题,只有在Android Studio中构建时才会出现(BuildServer和命令行工作正常) 构建工作正常,但当AS想要将apk复制到设备时,它抛出的本地路径不存在。错误 问题是生成的文件看起来像: 2014-03-17_16-17-41_myapp__debug-unaligned.apk 但正如我们所期待的: 2014-03-17_16-17-18_myapp__debug-unaligned.apk 它是由特定的生成步骤生成的,

我对gradle和Android Studio有一个问题,只有在Android Studio中构建时才会出现(BuildServer和命令行工作正常)

构建工作正常,但当AS想要将apk复制到设备时,它抛出的
本地路径不存在。
错误

问题是生成的文件看起来像:

2014-03-17_16-17-41_myapp__debug-unaligned.apk
但正如我们所期待的:

2014-03-17_16-17-18_myapp__debug-unaligned.apk
它是由特定的生成步骤生成的,导致重新计算日期。我试图用构建日期的外部属性来修复它,该属性在整个构建过程中应该保持不变,但可能是由于我缺乏gradle技能,这没有帮助


也许有人为我提供了一个变通方法,让我的构建在Android Studio中工作。

这是正常的,但很不幸

当Studio打开项目时,它会向Gradle查询项目的模型。这包括模块列表以及每个模块的源文件夹、依赖项和生成输出。在本例中,APK

因此,当Studio向Gradle查询模型时,我们的插件将构建模型,其中包括运行自定义代码重命名APK文件名。然后将其发送到录音室进行录制

然而,无论何时构建,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
}

请注意,复制任务需要一个文件夹作为目标,因此我们必须使用重命名规则

感谢您的快速澄清。没有解决我的问题,但至少我知道原因;)。在你们想出解决方案之前,我暂时不回答这个问题。顺便说一句,你在AS上做得很好。Br mikeTIn最后,我创建了一个类似于此的发布新任务:因为这似乎是正确的方式。只是注意到有一个打字错误。copyTask.info应为copyTask.into
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
}