60

I'd like to change "app-release.apk" file name to like following when I build an app by using gradle.

[format]
(appname of package name)_V(version code)_(yyMMdd)_(R|T)

[explain]
(appname of package name) : example) com.example.myApp -> myApp
(version code) : build version code 2.2.3 -> 223
(yyMMdd) : build date 2015.11.18 -> 151118  
(R|T) : if app is release, "R" but debug is "T".

If I generate an apk file in release, result is : myApp_V223_151118_R.apk.

How to make a file name like this in gradle?

Zoe
  • 27,060
  • 21
  • 118
  • 148
S.J. Lim
  • 3,095
  • 3
  • 37
  • 55

3 Answers3

150

This may be the shortest way:

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
}

buildType: like so

buildTypes {
    debug {
        ...
        versionNameSuffix "-T"
    }
    release {
        ...
        versionNameSuffix "-R"
    }
}

Keep in mind, Android Studio adds versionNameSuffix by build type name by default, so you may not need this.

Upd. In new versions of Android Studio you can it write little shorter(thanks for szx comment):

defaultConfig {
    ...
    archivesBaseName = "$applicationId-v$versionCode($versionName)"
}
Anrimian
  • 4,257
  • 4
  • 22
  • 30
48

Update: Please check Anrimian's answer below which is much simpler and shorter.

Try this:

gradle.properties

applicationName = MyApp

build.gradle

android {
  ...
  defaultConfig {
     versionCode 111
     ...
  }
  buildTypes {
     release {
         ...
         applicationVariants.all { variant ->
             renameAPK(variant, defaultConfig, 'R')
         }
     }
     debug {
         ...
         applicationVariants.all { variant ->
             renameAPK(variant, defaultConfig, 'T')
         }
     }
  }
}
def renameAPK(variant, defaultConfig, buildType) {
 variant.outputs.each { output ->
     def formattedDate = new Date().format('yyMMdd')

     def file = output.packageApplication.outputFile
     def fileName = applicationName + "_V" + defaultConfig.versionCode + "_" + formattedDate + "_" + buildType + ".apk"
     output.packageApplication.outputFile = new File(file.parent, fileName)
 }
}

Reference: https://stackoverflow.com/a/30332234/206292 https://stackoverflow.com/a/27104634/206292

Krishnaraj
  • 2,360
  • 1
  • 32
  • 55
  • When I do the above, I get: app-development-release.apk, app-live-release.apk. Why is it saying "app" and not my app name? – Subby Jul 04 '16 at 00:06
  • 1
    @Subby make sure you have set your applicationName in gradle.properties. – Krishnaraj Jul 10 '16 at 07:01
  • 4
    applicationVariants.all should not be nested in each variant: debug {} release { } applicationVariants.all { variant -> renameAPK(variant, defaultConfig, variant.name) } – wolfprogrammer Feb 16 '17 at 18:22
  • How we can add architectures name to apk name? For exampe "MyApp_V223_151118_R_arm.apk" and "MyApp_V223_151118_R_x86.apk" – b24 Feb 15 '18 at 06:58
  • @Krishnaraj are you sure this solution works with the latest gradle version? It turns out, whichever build you make, the renameAPK for buildtype which is at the bottom (debug inn this case) is called. Hence in our case we will always have '_T' at the end. – gaurav414u Apr 20 '18 at 03:56
  • @gaurav414u No, I am not using this solution. I wrote this answer in 2016 and things may have changed now :). – Krishnaraj Apr 20 '18 at 07:03
43

2019 / 2020 - How to change APK name For Gradle 3.3, 3.4, 3.5, 4.0 and above

android {
   ......
   applicationVariants.all { variant ->
       variant.outputs.all {
           def flavor = variant.name
           def versionName = variant.versionName
           outputFileName = "prefix_${flavor}_${versionName}.apk"
       }
   }
}

The result would be like this,

prefix_release_1.0.1.apk

Zumry Mohamed
  • 9,318
  • 5
  • 46
  • 51