【问题标题】:Android Studio/gradle dynamic apk name out of syncAndroid Studio/gradle 动态 apk 名称不同步
【发布时间】: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 谢谢你的建议。使用archivesBaseName in 的方法不适用于动态命名,在该示例中,名称是使用静态字符串构建的,因此通过更改这些字符串的性质,您会强制进行 gradle 同步,从而使 AS/gradle 对齐,在我的情况下,我我不希望手动编辑连接但在构建时计算它们的值,这是我遇到问题的地方,因为这种方法不会启动同步。
  • 您是否尝试过使用gradle flavors?我不知道它们在使用随每个新版本而变化的动态名称时效果如何,但这是我过去就设置主题询问过的question
  • 我有几乎相同的要求,但走的路线略有不同:我没有重命名输出文件,而是在 assembleDebug(或您使用的任何编译任务)上添加了一个复制任务,它复制并重命名了使用当前时间戳构建 apk。所以我没有遇到任何同步问题,因为 Android Studio 选择了用于推送设备的原始 apk,并在旁边创建了带时间戳的 apk(顺便说一句,我将它移到了不同​​的文件夹中)。如果您的问题仍然有效,也许这对您来说是一个解决方案。如果需要,我可以提供代码示例。
  • @SteffenFunke 我认为这是一个非常干净的解决方案,如果您将其发布为答案,我可以保证给您一个支持

标签: android android-studio gradle


【解决方案1】:

另一种选择是让 CI 服务器提供您的外部发布版本(无论如何它们都应该提供),然后将以下内容添加到您的 build.gradle

apply plugin: 'com.android.application'
...
def isCIBuild() {
    return System.getenv('CI_BUILD') != null || hasProperty('CI_BUILD');
}
...
android {
...

    if(isCIBuild()){
        def clientBuildDate = new Date().format('yyMMddHHmm')
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = new File(output.outputFile.parent, "myapp-" + versionName.replace(".","_") + "-" + clientBuildDate + ".apk")
            }
        }
    }
...
}

然后您可以在 CI 服务器上设置全局环境变量 CI_BUILD,这将触发 APK 重命名,但 Android Studio 将使用通常命名的 APK。

如果您想运行本地构建并重命名 APK,则通过命令行构建并添加 -PCI_BUILD=true

./gradlew clean assemble -PCI_BUILD=true

【讨论】:

  • 我遇到了一个问题。根据调用 hasProperty() 的位置(我在 ext 块中使用了我的),它可能不在项目上下文中并返回 null。为了绝对安全,请使用“project.hasProperty('CI_BUILD')”,它应该可以在脚本中的任何位置使用。
猜你喜欢
  • 1970-01-01
  • 2015-02-28
  • 2021-02-20
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多