【发布时间】:2015-09-20 09:58:08
【问题描述】:
我希望在每个构建中使用日期/时间 (yyMMddHHmm) 动态命名 APK。我已经完成了这个并且正确地构建和命名了 APK,但是 Android Studio 不会选择正确的名称来尝试推送到设备。
关于这个主题的问题有一些很好的信息,确认了这个问题,并且在每次构建之前都需要手动同步。 Android Studio uploads sterile APK to device when Gradle has custom logic changing APK names
完整的图片是我的 build.gradle
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
// grab the date/time to use for versionCode and file naming
def date = new Date();
def clientBuildDate = date.format('yyMMddHHmm')
// for all client files, set the APK name
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, "myapp-" + versionName.replace(".","_") + "-" + clientBuildDate + ".apk")
}
}
....
defaultConfig{...}
buildTypes{...}
compileOptions{...}
signingConfigs{...}
}
上面将生成如下输出:
myapp-1_0_0-1507021343.apk
myapp-1_0_0-1507021501.apk
myapp-1_0_0-1507021722.apk
但 Android Studio 将始终尝试将第一个版本加载到手机,因为它不同步并且不知道每次构建后的名称更改。
对于如何在每次构建/运行 Android Studio 时强制同步有什么建议吗?在构建之前手动进行同步是一个阻碍,并且需要我回到默认的 APK 命名方案。
使用:AS 1.2.1.1 & 'com.android.tools.build:gradle:1.2.3'
【问题讨论】:
-
您尝试过使用
archivesBaseName属性吗?我认为如果在defaultConfig块中定义了 APK 文件名的变化,我认为 AS 应该识别它,而不是手动重命名文件的脚本。有关示例,请参见 stackoverflow.com/a/28992851/937715。 -
@SeanBarbeau 谢谢你的建议。使用
archivesBaseNamein 的方法不适用于动态命名,在该示例中,名称是使用静态字符串构建的,因此通过更改这些字符串的性质,您会强制进行 gradle 同步,从而使 AS/gradle 对齐,在我的情况下,我我不希望手动编辑连接但在构建时计算它们的值,这是我遇到问题的地方,因为这种方法不会启动同步。 -
您是否尝试过使用
gradle flavors?我不知道它们在使用随每个新版本而变化的动态名称时效果如何,但这是我过去就设置主题询问过的question。 -
我有几乎相同的要求,但走的路线略有不同:我没有重命名输出文件,而是在 assembleDebug(或您使用的任何编译任务)上添加了一个复制任务,它复制并重命名了使用当前时间戳构建 apk。所以我没有遇到任何同步问题,因为 Android Studio 选择了用于推送设备的原始 apk,并在旁边创建了带时间戳的 apk(顺便说一句,我将它移到了不同的文件夹中)。如果您的问题仍然有效,也许这对您来说是一个解决方案。如果需要,我可以提供代码示例。
-
@SteffenFunke 我认为这是一个非常干净的解决方案,如果您将其发布为答案,我可以保证给您一个支持
标签: android android-studio gradle