2014-11-21 55 views
8

我想要在我的Android版本中包含输出APK文件名称中的versionName如何使用0.14+版本的Android Gradle插件向我的APK文件添加版本号?

有一个another answer与0.14.x之前的插件版本一起工作,但他们改变了一些数据模型,所以不再工作,我找不出如何解决它。据我所知,下面的代码块应该可以工作,但最后的set()调用似乎没有效果。它不会抛出错误,但该值也不会被替换。

buildTypes { 
    applicationVariants.all { variant -> 
     def oldFile = variant.outputs.outputFile.get(0) 
     def newFile = new File(
       oldFile.parent, 
       oldFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) 

     variant.outputs.outputFile.set(0, newFile) 
} 

有人可以帮我解决这个问题吗?

回答

23

现在,您需要一个更加循环,每个变种可以有多个输出:

android { 
    applicationVariants.all { variant -> 
     variant.outputs.each { output -> 
      output.outputFile = new File(
        output.outputFile.parent, 
        output.outputFile.name.replace(".apk", "-${variant.versionName}.apk")) 
     } 
    } 
} 
+2

我得到一个错误,说它无法找到applicationVarients属性 – jonney 2015-04-07 11:03:17

+3

...这就是我们不喜欢gradle的原因。你必须编写代码来改变怪异的输出文件名。 – 2015-07-02 20:51:22

2

我复制了一些修改你的答案:

applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     output.outputFile = new File(
       output.outputFile.parent, 
       output.outputFile.name.replace("-assistant", "-assistant-${versionName}")) 
    } 
} 

单词“-assistant”是我的名在变体名称之前。例如,我有3个变种

AX,BX,CX

的文件名是在我的例子:

  • 的-助理-AX-debug.apk
  • 的-助理-BX-调试apk文件
  • 的-助理-CX-debug.apk

我想要的版本号,在那里变种名称之前。因此,上述后,他们现在被称为

  • 的-助手-1.0-AX-debug.apk
  • 的-助手-1.0-BX-debug.apk
  • 的-助手-1.0-CX -debug.apk

因此,gradle build会在我们的文件名中添加变体名称。

$ {versionName}只是“1.0”。我注意到无论是$ {versionName}还是$ {variant.versionName},都产生了相同的结果。

也就是说,如果有defaultConfig {的versionName “AB”}productFlavors {{斧的versionName “1.0”}},则$的versionName或$ variant.versionName在循环中此代码将包含变体版本名称“1.0”

希望这有助于someoen。

1

当使用插件或更高的版本3.0.0,你必须做出一个细微的变化:

applicationVariants.all { variant -> 
    variant.outputs.all { output -> 
     outputFileName = "myapp-${variant.versionName}-${variant.name}.apk" 
    } 
} 

3.0。0插件migration documentation说:

如果使用each()遍历变体对象,则需要开始使用all()。这是因为each()只会在配置时间内遍历已存在的对象 - 但在配置时,这些对象在新模型中不存在。然而,all()通过在执行过程中添加对象来适应新模型。