web-dev-qa-db-ja.com

gradleを使用してAPKファイル名にversionNameを設定する方法は?

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を使用)

158
codaR0y

これは私の問題を解決しました: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+バージョンでは機能しないようです。

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

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

バージョン名を1か所で変更するだけです。コードも簡単です。

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

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

関連項目: Androidプロジェクトのgradleでプロガードマッピングファイル名を変更する方法

最近の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.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/05)
  • 1.3.1(2015/08/11)

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

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

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

  • 1.3.0(2015/07/30)-機能していない、 バグは1.3.1で修正される予定
  • 1.2.3(2015/07/21)
  • 1.2.2(2015/04/28)
  • 1.2.1(2015/04/27)
  • 1.2.0(2015/04/26)
  • 1.2.0-beta1(2015/03/25)
  • 1.1.3(2015/03/06)

アプリgradleファイル:

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"
    }
}
201
Jon

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

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

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

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

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. _ 131016_1047.apk
  • 製品リリース:myProject _prod_release_1.2. _ 131016_1047.apk

注:位置合わせされていないバージョンのapk名はデフォルトのままです。

38
Fer

要約すると、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")) 
        }
    }       
}

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

versionCodeversionNamebuild.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 St​​udio 1.0で編集======

Android St​​udio 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"))
                }
            }
        }
    }
18
Wesley

DefaultConfigブロックでversionNameを指定しない場合、defaultConfig.versionNamenullになります

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

import com.Android.builder.DefaultManifestParser

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

私の場合、apkおよびreleaseバリアントの異なるdebug名の生成を自動化する方法を見つけたかっただけです。このスニペットを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

7
yshahak

Gradle 4

Gradle 4(Android Studio 3+)で構文が少し変更されました(output.outputFileからoutputFileNameへ、アイデアは this answer から:

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

別の代替方法は、次を使用することです。

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
}

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

5
Marco RS

@ Jon answer に従って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"
        }
    }
}
4
Qamar

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

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

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の名前を置換

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

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

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

 buildTypes {
        release {

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


        }
        debug {

            defaultConfig {
                debuggable true

                versionNameSuffix "-DEBUG"
            }
        }
    }
1
exequielc

Android St​​udio 1.1.0の時点で、この組み合わせがbuild.gradleファイルのAndroid本文で機能していることがわかりました。これは、マニフェストxmlファイルデータをインポートする方法がわからない場合です。 Android St​​udioでさらにサポートされていればよいのですが、目的の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"))
                }
            }
        }
    }
0
A13X

最新の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"))
    }
}

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

0
Alfishe