2014-11-21 57 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()通過在執行過程中添加對象來適應新模型。