问题 在使用名称中的时间戳时,Android Studio无法在构建后启动应用程序


我在使用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中使我的构建工作。


1708
2018-03-17 15:55


起源



答案:


这是正常的,但不幸的是。

当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
}

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


10
2018-03-17 17:06



感谢您的快速澄清。不解决我的问题,但至少我知道为什么;)。我将暂时搁置这个问题,直到你们提出解决方案。顺便说一句。你在AS上做得很好。 Br mikeT - Mike T
最后,我最终创建了一个与此类似的发布新任务: stackoverflow.com/questions/21434554/... 因为这似乎是正确的方式。 - Mike T
刚注意到有一个错字。 copyTask.info应该是copyTask.into - Quanturium


答案:


这是正常的,但不幸的是。

当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
}

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


10
2018-03-17 17:06



感谢您的快速澄清。不解决我的问题,但至少我知道为什么;)。我将暂时搁置这个问题,直到你们提出解决方案。顺便说一句。你在AS上做得很好。 Br mikeT - Mike T
最后,我最终创建了一个与此类似的发布新任务: stackoverflow.com/questions/21434554/... 因为这似乎是正确的方式。 - Mike T
刚注意到有一个错字。 copyTask.info应该是copyTask.into - Quanturium