Gradleを使用してAPKファイル名にversionNameを設定するにはどうすればよいですか?


169

Gradleの自動生成されたAPKファイル名に特定のバージョン番号を設定しようとしています。

今度はgradleが生成さmyapp-release.apkれますが、のように見せたいですmyapp-release-1.0.apk

乱雑に見えるオプションの名前を変更してみました。これを行う簡単な方法はありますか?

buildTypes {
    release {
       signingConfig signingConfigs.release
       applicationVariants.each { variant ->
       def file = variant.outputFile
       variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" +    defaultConfig.versionName + ".apk"))
    }
}

私は運が悪いので上のコードを試しました。助言がありますか?(gradle 1.6を使用)

回答:


225

バージョン名を一箇所で変更するだけです。コードも単純です。

以下の例では、選択したビルドバリアントに応じて、MyCompany-MyAppName-1.4.8-debug.apkまたは MyCompany-MyAppName-1.4.8-release.apkという名前のapkファイルを作成します。

このソリューションは、APK バンドルApp Bundle(.aabファイル)の両方で機能することに注意してください。

参照:AndroidプロジェクトのGradleでProguardマッピングファイル名を変更する方法

最近のGradleプラグインのソリューション

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "com.company.app"
        minSdkVersion 13
        targetSdkVersion 21
        versionCode 14       // increment with every release
        versionName '1.4.8'   // change with every release
        setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName")
    }
}

上記のソリューションは、次のAndroid Gradleプラグインバージョンでテストされています。

  • 3.5.2(2019年11月)
  • 3.3.0(2019年1月)
  • 3.1.0(2018年3月)
  • 3.0.1(2017年11月)
  • 3.0.0(2017年10月)
  • 2.3.2(2017年5月)
  • 2.3.1(2017年4月)
  • 2.3.0(2017年2月)
  • 2.2.3(2016年12月)
  • 2.2.2
  • 2.2.0(2016年9月)
  • 2.1.3(2016年8月)
  • 2.1.2
  • 2.0.0(2016年4月)
  • 1.5.0(2015年11月12日)
  • 1.4.0-beta6(2015年10月5日)
  • 1.3.1(2015年8月11日)

新しいバージョンが出たら、この投稿を更新します。

バージョン1.1.3-1.3.0でのみテスト済みのソリューション

次のソリューションは、次のAndroid Gradleプラグインバージョンでテストされています。

  • 1.3.0(2015/07/30)-機能しない、1.3.1修正される予定のバグ
  • 1.2.3(2015年7月21日)
  • 1.2.2(2015年4月28日)
  • 1.2.1(2015年4月27日)
  • 1.2.0(2015年4月26日)
  • 1.2.0-beta1(2015年3月25日)
  • 1.1.3(2015年3月6日)

アプリグラドルファイル:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.company.app"
        minSdkVersion 13
        targetSdkVersion 21
        versionCode 14       // increment with every release
        versionName '1.4.8'   // change with every release
        archivesBaseName = "MyCompany-MyAppName-$versionName"
    }
}

11
これは、ファイルの名前を変更する別のタスクを書くのではなく、正しいアプローチだと思います。
Nandish A

5
archivesBaseNameにだけ変更=「MyCompanyの-MyAppName- $ versionName」あなたはOCDを持っており、AS +について警告したくない場合は
ligi

4
すばらしい発見ですが、バージョンコードが異なるフレーバーではうまく機能しません。それらはすべて同じバージョンコードになります。
ウェストン

2
variant.buildType.name名前に追加する方法はありますか?これは実際にはデフォルトの構成に関連していないことはわかっていますが、古いvariantOutput.getAssemble()警告を削除する方法を理解しようとしています
Allan W

2
apk名の最後の「-debug」/「-release」を削除することは可能ですか?
ilyamuromets

173

これは私の問題を解決しました:のapplicationVariants.all代わりにapplicationVariants.each

buildTypes {
      release {
        signingConfig signingConfigs.release
        applicationVariants.all { variant ->
            def file = variant.outputFile
            variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) 
        }
    }       
}

更新:

したがって、これはAndroid Studio Gradleプラグインの0.14+バージョンでは機能しないようです。

これはトリックを行います(この質問からの参照 ):

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

3
私がgradle configの代わりにversionName定義されている場合、それを機能させる方法を知っていAndroidManifest.xmlますか?それはmyapp-release-null.apk今私に与えます。
Iwo Banas 2013年

1
この回答は、gradleプラグインの0.14+バージョンでは機能しません。それらと連携するアップデートはありますか?
アーガイル

1
それは自分の問題だと私はこれを尋ね、それはここで答えてしまった@withoutclass:stackoverflow.com/questions/27068505/...
アーガイル

2
Gradle 4に更新する場合はeachalloutput.outputFileに変更してくださいoutputFileName。誰かがこれがうまくいくと確信したら、それを答えに編集できます:)
PHPirate

6
@PHPirate:ほとんど機能します:Error:(34, 0) Cannot set the value of read-only property 'name'
Mooing Duck

47

(Android Studio 3.0およびGradle 4で動作するように編集)

私はもっ​​と複雑なapkファイル名の変更オプションを探していましたが、他の人に役立つことを願ってこのオプションを書きました。次のデータでapkの名前を変更します。

  • ビルドタイプ
  • バージョン
  • 日付

Gradleクラスでの研究と、他の回答からのコピー/貼り付けが少し必要でした。使ってますGradle 3.1.3ます。

build.gradleで:

android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
        debug {
            minifyEnabled false
        }
    }

    productFlavors {
        prod {
            applicationId "com.feraguiba.myproject"
            versionCode 3
            versionName "1.2.0"
        }
        dev {
            applicationId "com.feraguiba.myproject.dev"
            versionCode 15
            versionName "1.3.6"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def project = "myProject"
            def SEP = "_"
            def flavor = variant.productFlavors[0].name
            def buildType = variant.variantData.variantConfiguration.buildType.name
            def version = variant.versionName
            def date = new Date();
            def formattedDate = date.format('ddMMyy_HHmm')

            def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

            outputFileName = new File(newApkName)
        }
    }
}

今日(2016年10月13日)の10:47にコンパイルすると、選択したフレーバーとビルドタイプに応じて、次のファイル名が得られます。

  • dev debug:myProject_ dev_debug_1.3.6 _131016_1047.apk
  • 開発リリース:myProject_ dev_release_1.3.6 _131016_1047.apk
  • prod debug:myProject_ prod_debug_1.2.0 _131016_1047.apk
  • 製品リリース:myProject_ prod_release_1.2.0 _131016_1047.apk

注:アラインされていないバージョンのapk名はデフォルトのままです。


素晴らしいソリューション。私はそれを試しました、そしてそれは私の問題にぴったりです。ありがとう!
Pabel、2016年

Xamarin Studioで同じアプローチを使用することは可能ですか?
アレッサンドロカリアロ2016

できればすばらしいと思いますが、私は今Xamarinコースを始めていますが、それが可能かどうかを知るにはまだ十分な練習がありません。私はこの質問をして、またここに来ます。
Fer

コースの先生からのコメント:「生成されたファイルの名前を変更するためにコマンドを使用できるオプションがあります」。したがって、Xamarinから使用する方法は、Android Studio向けに作成した方法とは異なる必要があります。
Fer

3
エラーが解決するには、読み取り専用のプロパティ「OUTPUTFILE」の値を設定することはできませんになるため、以前のコメントで述べたように- 「の変化eachalloutput.outputFileoutputFileName:この記事はその上のいくつかの詳細を提供します- stackoverflow.com/a/44265374/2162226
Gene Bo

19

要約すると、build.gradle(私のように)パッケージをインポートする方法がわからない場合は、以下を使用しますbuildTypes

buildTypes {
      release {
        signingConfig signingConfigs.release
        applicationVariants.all { variant ->
            def file = variant.outputFile
            def manifestParser = new com.android.builder.core.DefaultManifestParser()
            variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk")) 
        }
    }       
}

=====編集=====

versionCodeand versionNameを次のようにbuild.gradleファイルに設定すると、

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 19
    versionCode 1
    versionName "1.0.0"
}

次のように設定する必要があります。

buildTypes {   
        release {
            signingConfig signingConfigs.releaseConfig
            applicationVariants.all { variant ->
                def file = variant.outputFile
                variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
            }
        }
}


====== Android Studio 1.0で編集======

Android Studio 1.0を使用している場合、次のようなエラーが発生します。

Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.

build.Typesこの部分を次のように変更する必要があります。

buildTypes {
        release {
            signingConfig signingConfigs.releaseConfig
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
                }
            }
        }
    }

これはうまくいきます。ただし、gradleビルドでマニフェストバージョンをインクリメントするので、古い(プリインクリメント)値でAPKが作成されます。Gradleスクリプトがバージョン番号を増やした後にこれが確実に影響することを確認する方法はありますか?
Guy

1
@ガイ申し訳ありませんがとても時間がかかりました。回答を編集しました。問題を解決できるかどうか確認してください。
ウェズリー

17

defaultConfigブロックでversionNameを指定しない場合、defaultConfig.versionName結果はnull

マニフェストからversionNameを取得するには、build.gradleに次のコードを記述します。

import com.android.builder.DefaultManifestParser

def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)

7
Gradleの新しいバージョンでは、com.android.builder.core.DefaultManifestParser
Ryan S

8

私の場合、異なるapk名前releasedebugバリアントの生成を自動化する方法を見つけたかっただけです。私はこのスニペットをの子として置くことでこれを簡単に行うことができましたandroid

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def appName = "My_nice_name_"
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def newName
        if (buildType == 'debug'){
            newName = "${appName}${defaultConfig.versionName}_dbg.apk"
        } else {
            newName = "${appName}${defaultConfig.versionName}_prd.apk"
        }
        output.outputFile = new File(output.outputFile.parent, newName)
    }
}

新しいAndroid Gradleプラグイン3.0.0では、次のようなことができます。

 applicationVariants.all { variant ->
    variant.outputs.all {
        def appName = "My_nice_name_"
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def newName
        if (buildType == 'debug'){
            newName = "${appName}${defaultConfig.versionName}_dbg.apk"
        } else {
            newName = "${appName}${defaultConfig.versionName}_prd.apk"
        }
        outputFileName = newName
    }
}

これは次のようなものを生成します: My_nice_name_3.2.31_dbg.apk


6

別の方法は、以下を使用することです:

String APK_NAME = "appname"
int VERSION_CODE = 1
String VERSION_NAME = "1.0.0"

project.archivesBaseName = APK_NAME + "-" + VERSION_NAME;

    android {
      compileSdkVersion 21
      buildToolsVersion "21.1.1"

      defaultConfig {
        applicationId "com.myapp"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode VERSION_CODE
        versionName VERSION_NAME
      }

       .... // Rest of your config
}

これにより、「appname-1.0.0」がすべてのAPK出力に設定されます。


申し訳ありませんが動作しません(もはや):No such property: archivesBaseName for class: org.gradle.api.internal.project.DefaultProject_Decorated
Martin

どのGradleバージョンを使用していますか?
Marco RS

6

Gradle 6以降

現在、Android Studio 4.0およびGradle 6.4で以下を使用しています。

android {
    defaultConfig {
        applicationId "com.mycompany.myapplication"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 15
        versionName "2.1.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "ApplicationName-${variant.name}-${variant.versionName}.apk"
                }
            }
        }
    }
}

Gradle 4

構文からのGradle 4(アンドロイドメーカー3+)(でビットを変更したoutput.outputFileoutputFileName、からアイデアこの答えは以下のようになります。

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def newName = outputFileName
            newName.replace(".apk", "-${variant.versionName}.apk")
            outputFileName = new File(newName)
        }
    }
}

Gradle 6でこれを修正する方法はありますか?
spartygw

@spartygw回答を更新
PHPirate

5

@ジョンの回答に従って、apkの名前を変更する正しい方法

defaultConfig {
        applicationId "com.irisvision.patientapp"
        minSdkVersion 24
        targetSdkVersion 22
        versionCode 2  // increment with every release
        versionName "0.2" // change with every release
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //add this line
        archivesBaseName = "AppName-${versionName}-${new Date().format('yyMMdd')}"
    }   

または、あなたが同じ結果を達成できる別の方法

android {
    ...

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def formattedDate = new Date().format('yyMMdd')
            outputFileName = "${outputFileName.replace(".apk","")}-v${defaultConfig.versionCode}-${formattedDate}.apk"
        }
    }
}

これでいい!私は、これを現在行っている他の方法よりも好きです。
ドロイドクリス

3

完全にまたはいくつかの変更後のいずれかで正しい多くの答えがあります。しかし、スクリプトを使用して動的にVersionNameとVersionCodeを生成していたため、それらすべてに問題があったので、とにかく鉱山を追加します。preBuildタスクにます。

同様のアプローチを使用している場合、これが機能するコードです。

project.android.applicationVariants.all { variant ->
    variant.preBuild.doLast {
    variant.outputs.each { output ->
        output.outputFile = new File(
                output.outputFile.parent,
                output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk"))
        }
    }
}

説明するには:最初のアクションでバージョンコードと名前を上書きしているのでpreBuild、このタスクの最後にファイル名の変更を追加する必要があります。したがって、この場合にgradleは何をしますか:

バージョンコード/名前を挿入-> preBuildアクションを実行-> APKの名前を置換


生成されたversionCodeおよびversionName変数はどこに設定しますか?
火星

私が覚えているように、それは私たちのカスタムgradleプラグインの中で行われました。その実行は、preBuildタスクの最後のアクションとして呼び出されました。
IgorČordaš16年

2
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            output.outputFileName = output.outputFileName.replace(".apk", "-${variant.versionName}.apk")
        }
    }

このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
ロザリオペレイラフェルナンデス

1

私の場合、この方法でこのエラーを解決します

SUFFIXをデバッグバージョンに追加します。この場合、「-DEBUG」テキストをデバッグデプロイに追加します

 buildTypes {
        release {

            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


        }
        debug {

            defaultConfig {
                debuggable true

                versionNameSuffix "-DEBUG"
            }
        }
    }

APKのファイル名は変更されません。
トム

1
これは実際にはいいヒントです。正しい質問ではありませんが、良い質問です。それについてどこでもっと読むことができますか?versionNameSuffixGITブランチに基づいて使用することは可能ですか?たとえば、「マスター」にない場合は、リリースバージョンであっても、常にサフィックスを付けてください
Android開発者

0

Gradleの最新バージョンでは、次のスニペットを使用できます。

最初にアプリケーションマニフェストの場所を設定します

 sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
        {
    }

そして後でbuild.gradle

import com.android.builder.core.DefaultManifestParser

def getVersionName(manifestFile) {
    def manifestParser = new DefaultManifestParser();
    return manifestParser.getVersionName(manifestFile);
}

def manifestFile = file(android.sourceSets.main.manifest.srcFile);
def version = getVersionName(manifestFile)

buildTypes {
    release {
       signingConfig signingConfigs.release
       applicationVariants.each { variant ->
       def file = variant.outputFile
       variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" +    versionName + ".apk"))
    }
}

ビルドタイプごとに異なるマニフェストがあるかどうかを調整します。しかし、私は単一のものを持っているので-私にとって完璧に機能します。


クラスファイルからapk名に文字列を追加することは可能ですか?
Upendra Shah 2017

0

Android Studio 1.1.0の時点で、この組み合わせはファイルのAndroid本体で機能することがわかりましたbuild.gradle。これは、マニフェストxmlファイルのデータをインポートする方法がわからない場合です。私はそれがAndroid Studioによってよりサポートされていれば幸いですが、希望のapk名の出力が得られるまで値をいじってください:

defaultConfig {
        applicationId "com.package.name"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 6
        versionName "2"
    }
    signingConfigs {
        release {
            keyAlias = "your key name"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "appName_" + versionName + ".apk"))
                }
            }
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.