読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Gradleでapkファイル名にGitのリビジョンとかをつけてみる

android gradle

以前、Gradleでbuild.gradleを修正して、Androidのapkファイルにアプリの名前が入るように変更したけど、Gitのリビジョン ハッシュとかも付けたくなった。

wannabe-jellyfish.hatenablog.com

あとコミットされてないコードがあるかないかも知りたかったので、その備忘録

Gitのリビジョンにも対応したbuild.gradleがこちら

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

android {
  (略)
  android.applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
      def revisionHash = ["sh", "-c", "cd ${project.rootDir} ; git rev-parse --short HEAD"].execute().in.text.trim()
      def modify = ["sh", "-c", "cd ${project.rootDir} ; git status --short"].execute().in.text.trim().empty ? "" : "+"
      variant.outputs.each { output ->
        def newName = "${applicationId}_v${versionName}_r${revisionHash}${modify}_${variant.productFlavors.name.get(0)}.apk"
        output.outputFile = new File(output.outputFile.parent, newName)
      }
    }
  }
}

この例だと、コミットされてない変更がない場合は

<アプリケーションID>v<バージョン名>r<リビジョンハッシュ>_<フレーバー名>.apk

コミットされてない変更がある場合は

<アプリケーションID>v<バージョン名>r<リビジョンハッシュ>+_<フレーバー名>.apk

という感じに+がつく感じになる

revision hashの取得
def revisionHash = ["sh", "-c", "cd ${project.rootDir} ; git rev-parse --short HEAD"].execute().in.text.trim()

Qiitaのgfx様のとおりです!

コミットされてない変更の有無の取得
def modify = ["sh", "-c", "cd ${project.rootDir} ; git status --short"].execute().in.text.trim().empty ? "" : "+"

同じ要領でgitコマンドのgit status --shortを実行して、結果が空でなければ、+がつくように改変

BuildConfigでも利用したい場合

上の場合だと、apkファイル名にしかリビジョン番号がつかないので、アプリ内で利用できるBuildConfigでは使えない。。。

その場合は、defaultConfigにつくようにすればいいっぽい。

def getVersionName = { ->
    def baseVersionName = "1.0"
    def revisionHash = ["sh", "-c", "cd ${project.rootDir} ; git rev-parse --short HEAD"].execute().in.text.trim()
    def modify = ["sh", "-c", "cd ${project.rootDir} ; git status --short"].execute().in.text.trim().empty ? "" : "+"
    return "${baseVersionName}_${revisionHash}${modify}"
}

android {
    defaultConfig {
        versionCode 1
        versionName getVersionName()
    }
}

getVersionName()関数を作って、その中でgitコマンドを実行する感じ

以上!!

[PR] めもらばではこんなあぷりを作っています!

参考にしたサイト様