ページ

2014/10/23

AndroidStudio で APK のファイル名を変更する Gradle の設定

Android Studio で Sigined APK を生成するには
ツールバーの [ Build > Generate Signed APK... ] から
ガイダンスに従えば生成できます。
しかし、GUI からではファイル名は app-release.apk などになるので
変更したい場合などは Gradle の設定が必要になります。

Gradle で Signed APK のファイル名を設定する

Generate signed APK has been named by program · bc41551 · wada811/Android-Material-Design-Colors

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.1"

    defaultConfig {
        applicationId "at.wada811.android.material.design.colors.sample"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 2
        versionName "1.1.0"
    }
    signingConfigs {
        release
    }
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release")) {
            def file = variant.outputFile
            def applicationId = defaultConfig.applicationId
            def versionCode = defaultConfig.versionCode
            def versionName = defaultConfig.versionName
            def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
            def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"
            variant.outputFile = new File(file.parent, newName)
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21+'
    compile project(':library')
}

./gradlew assembleReleaseすると
at.wada811.android.material.design.colors.sample_r2_v1.1.0_20141022_173737.apk
のようなファイル名で app/build/outputs に生成されます。

参考

gradle - AndroidStudioでAPKのファイル名にバージョン番号などを入れる設定 - Qiita

追記: Android Gradle Plugin 0.13, Gradle 2.1 で outputFile が deprecated になっている

WARNING [Project: :sample] variant.getOutputFile() is deprecated. Call it on one of variant.getOutputs() instead. が表示されるので書き直しました。

applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
        variant.outputs.each { output ->
            System.println("* output.outputFile.name : ${output.outputFile.name}")
            if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                // Rename APK
                def applicationId = defaultConfig.applicationId
                def versionCode = defaultConfig.versionCode
                def versionName = defaultConfig.versionName
                def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
                def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
}

outputs というから複数あるのかとおもいきや apk しかありませんでした。
無駄にネストが深くなる…。

参考

android - Gradle warning: variant.getOutputFile() and variant.setOutputFile() are deprecated - Stack Overflow