Gradle kullanarak APK dosya adında versionName nasıl ayarlanır?


169

Gradle otomatik olarak oluşturulan APK dosya adında belirli bir sürüm numarası ayarlamaya çalışıyorum.

Şimdi çakıl üretiyor myapp-release.apkama bunun gibi görünmesini istiyorum myapp-release-1.0.apk.

Dağınık görünen seçenekleri yeniden adlandırmayı denedim. Bunu yapmanın kolay bir yolu var mı?

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"))
    }
}

Hiçbir şans ile yukarıdaki kodu denedim. Baska öneri? (1.6 no'lu grubu kullanarak)

Yanıtlar:


225

Sürüm adını yalnızca bir yerde değiştirmek zorundayım. Kod da basit.

Aşağıdaki örnekler , seçilen derleme değişkenine bağlı olarak MyCompany- MyAppName-1.4.8-debug.apk veya MyCompany-MyAppName-1.4.8-release.apk adlı apk dosyaları oluşturacaktır .

Bu çözümün hem APK hem de Uygulama Paketleri (.aab dosyaları) üzerinde çalıştığını unutmayın .

Ayrıca Bakınız: Android projesi için notta koruma eşleme dosyası adı nasıl değiştirilir

En Yeni Gradle Eklentisi için Çözüm

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")
    }
}

Yukarıdaki çözüm, aşağıdaki Android Gradle Eklentisi Sürümleriyle test edilmiştir:

  • 3.5.2 (Kasım 2019)
  • 3.3.0 (Ocak 2019)
  • 3.1.0 (Mart 2018)
  • 3.0.1 (Kasım 2017)
  • 3.0.0 (Ekim 2017)
  • 2.3.2 (Mayıs 2017)
  • 2.3.1 (Nisan 2017)
  • 2.3.0 (Şubat 2017)
  • 2.2.3 (Aralık 2016)
  • 2.2.2
  • 2.2.0 (Eylül 2016)
  • 2.1.3 (Ağustos 2016)
  • 2.1.2
  • 2.0.0 (Nisan 2016)
  • 1.5.0 (2015/11/12)
  • 1.4.0-beta6 (2015/10/05)
  • 1.3.1 (2015/08/11)

Yeni sürümler çıktıkça bu yayını güncelleyeceğim.

Çözüm Yalnızca 1.1.3-1.3.0 sürümlerinde test edilmiştir

Aşağıdaki çözüm, aşağıdaki Android Gradle Plugin Sürümleriyle test edilmiştir:

  • 1.3.0 (2015/07/30) - Çalışmıyor, hata 1.3.1'de düzeltilmesi planlanıyor
  • 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)

uygulama derecelendirme dosyası:

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
Dosyaları yeniden adlandırmak için başka bir görev yazmak yerine doğru yaklaşım olduğunu düşünüyorum.
Nandish A

5
OKB'niz varsa ve AS'nin +
ligi

4
Harika bulmak, ancak farklı sürüm kodlarına sahip lezzetlerle iyi çalışmıyor. Hepsi aynı sürüm kodu ile sonuçlanır.
weston

2
variant.buildType.nameİsme eklemenin bir yolu var mı ? Bu gerçekten varsayılan yapılandırma ile ilgili olmadığını biliyorum, ama eski variantOutput.getAssemble()uyarı kaldırmak için nasıl anlamaya çalışıyorum
Allan W

2
Son '-debug' / '-release' apk adından kaldırmak mümkün mü?
ilyamuromets

173

Bu benim sorunum çözüldü: applicationVariants.allyerine kullanarakapplicationVariants.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")) 
        }
    }       
}

Güncelleme:

Yani bu android studio gradle eklentisinin 0.14+ sürümüyle çalışmıyor gibi görünüyor.

Bu hile yapar (Bu sorudan referans ):

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 yerine versionNametanımlı bir AndroidManifest.xmltanem varsa nasıl çalıştıracağını biliyor musunuz ? myapp-release-null.apkŞimdi bana veriyor .
Iwo Banas

1
Bu yanıt, gradle eklentisinin 0.14+ sürümüyle çalışmaz. Bunlarla çalışmak için herhangi bir güncelleme var mı?
Argyle

1
@withoutclass Bunu kendi sorusu olarak sordum ve burada cevap aldım: stackoverflow.com/questions/27068505/…
Argyle

2
İnsanlar için Gradle 4'e güncelleme: Değişikliği eachiçin allve output.outputFileiçin outputFileName. Birisi bu eserleri onaylarsa cevap olarak düzenlenebilir :)
PHPirate

6
@PHPirate: neredeyse çalışıyor:Error:(34, 0) Cannot set the value of read-only property 'name'
Mooing Duck

47

(Android Studio 3.0 ve Gradle 4 ile çalışmak üzere EDİTİLDİ)

Daha karmaşık bir apk dosya adı yeniden adlandırma seçeneği arıyordum ve bunu herkes için yararlı olduğunu umarak yazdım. APK'yı aşağıdaki verilerle yeniden adlandırır:

  • lezzet
  • yapı tipi
  • versiyon
  • tarih

Gradle sınıflarında biraz araştırma ve diğer cevaplardan biraz kopyala / yapıştır yapmam gerekiyordu. Grad 3.1.3 kullanıyorum .

Build.gradle içinde:

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)
        }
    }
}

Bugün (13-10-2016) 10:47 saatinde derlerseniz, seçtiğiniz lezzet ve yapı türüne bağlı olarak aşağıdaki dosya adlarını alırsınız:

  • dev hata ayıklama : myProject_ dev_debug_1.3.6 _131016_1047.apk
  • geliştirici sürümü : myProject_ dev_release_1.3.6 _131016_1047.apk
  • prod hata ayıklama : myProject_ prod_debug_1.2.0 _131016_1047.apk
  • ürün sürümü : myProject_ prod_release_1.2.0 _131016_1047.apk

Not: hizalanmamış sürüm apk adı hala varsayılan addır.


Harika bir çözüm. Denedim ve sorunum için mükemmel. Teşekkürler!
Pabel

Studio'da aynı yaklaşımı kullanmak mümkün müdür?
Alessandro Caliaro

Mümkün olsaydı harika olurdu, ama şimdi bir Xamarin kursuna başlıyorum ve bunun mümkün olup olmadığını bilmek için hala yeterli pratikim yok. Bu soruyu soracağım ve buraya tekrar geleceğim.
Fer

Kursun öğretmeninden yorum: "oluşturulan dosyaların adını değiştirmek için komutları kullanabileceğiniz bir seçenek var". Bu nedenle, Xamarin'den kullanım yaklaşımı, Android Studio için yazdığım yaklaşımdan farklı olmalı, üzgünüm.
Fer

3
Hatayı gidermek için salt okunur bir özellik ÇıktıDosyası 'değerini ayarlanamaz zorunda için daha erken bir açıklamada belirtildiği gibi - "değişim eachiçin allve output.outputFileiçin outputFileName" - Bu Mesaja bu konuda bazı ayrıntılar sağlar: stackoverflow.com/a/44265374/2162226
Gene Bo

19

Özetlemek gerekirse, build.gradle(benim gibi) paketi nasıl içe aktaracağını bilmeyenler için aşağıdakileri kullanın 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")) 
        }
    }       
}

===== DÜZENLEME =====

Eğer senin ayarlarsanız versionCodeve versionNamesizin de build.gradleböyle dosyası:

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

Bunu şu şekilde ayarlamanız gerekir:

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 ile DÜZENLE ======

Android Studio 1.0 kullanıyorsanız, bunun gibi bir hata alırsınız:

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

Parçayı şu şekilde değiştirmelisiniz 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"))
                }
            }
        }
    }

Harika çalışıyor. Ancak, bildirim sürümümü çakıl derlemesinde artırdığımdan, daha eski (artış öncesi) değere sahip bir APK oluşturacaktır. Sınıf betiği sürüm numarasını artırdıktan sonra bunun etkili olduğundan emin olmanın herhangi bir yolu var mı?
Guy

1
@Allah Üzgünüm çok uzun sürdü. Cevabı düzenledim, sorununuzu çözüp çözemeyeceğine bakın.
Wesley

17

DefaultConfig bloğunda versionName belirtmezseniz defaultConfig.versionName,null

manifest'ten versionName almak için build.gradle dosyasına aşağıdaki kodu yazabilirsiniz:

import com.android.builder.DefaultManifestParser

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

7
Gradle'ın sonraki sürümlerinde, şimdi com.android.builder.core.DefaultManifestParser
Ryan S

8

Benim durumumda, sadece farklı apkad releaseve debugvaryantların oluşturulmasını otomatikleştirmenin bir yolunu bulmak istedim . Bu pasajı aşağıdakilerin bir çocuğu olarak koyarak bunu kolayca başardım 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)
    }
}

Yeni Android gradle eklentisi 3.0.0 için böyle bir şey yapabilirsiniz:

 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
    }
}

Bu şöyle bir şey üretir: My_nice_name_3.2.31_dbg.apk


6

Başka bir alternatif aşağıdakileri kullanmaktır:

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
}

Bu, tüm apk çıkışlarınıza "appname-1.0.0" ayarlayacaktır.


Üzgünüz çalışmıyor (artık): No such property: archivesBaseName for class: org.gradle.api.internal.project.DefaultProject_Decorated
Martin

Hangi gradle sürümünü kullanıyorsunuz?
Marco RS

6

Gradle 6+

Şimdi Android Studio 4.0 ve Gradle 6.4'te aşağıdakileri kullanıyorum:

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

Kepçe 4

Söz dizimi dan Gradle 4 (Android Studio 3+) (içinde biraz değişti output.outputFileüzere outputFileName, gelen fikri bu cevap artık şudur:

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

6. sınıf için bunu nasıl düzeltebileceğime dair bir fikrin var mı?
spartygw

@spartygw Cevabı güncelledi
PHPirate

5

@Jon cevabına göre apk'yi yeniden adlandırmanın doğru yolu

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')}"
    }   

Ya da aynı sonuçları elde etmenin başka bir yolu

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

Bu konuda iyi bir tane! Bunu şu anda yaptığım diğer yollardan daha iyi seviyorum.
Droid Chris

3

Tam olarak veya bazı değişikliklerden sonra doğru olan birçok cevap var. Ama hepsine sorun yaşadığımdan beri benimkini ekleyeceğim çünkü preBuildgöreve dinamik olarak VersionName ve VersionCode oluşturmak için komut dosyaları kullanıyordum .

Eğer benzer bir yaklaşım kullanıyorsanız, çalışacak olan kod budur:

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"))
        }
    }
}

Açıklamak için: İlk eylemde sürüm kodu ve adı geçersiz preBuildkıldığım için bu görevin sonuna yeniden adlandırma dosya eklemek zorunda. Bu durumda gradle ne yapacak:

Sürüm kodunu enjekte et / isim-> önceden inşa eylemleri yap


Oluşturulan versionCode ve versionName değişkenlerini nerede ayarlıyorsunuz?
Mars

Hatırladığım gibi, bu özel gradle eklentimiz içinde yapıldı. Yürütülmesine preBuild görevinin son eylemi denirdi.
Igor Čordaš

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

Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Rosário Pereira Fernandes

1

Benim durumumda bu hatayı bu şekilde çözüyorum

Hata Ayıklama sürümüne bir SUFFIX ekleyerek, bu durumda "-DEBUG" metnini Hata Ayıklama dağıtımıma ekliyorum

 buildTypes {
        release {

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


        }
        debug {

            defaultConfig {
                debuggable true

                versionNameSuffix "-DEBUG"
            }
        }
    }

Bu, APK dosya adını değiştirmez.
Tom

1
Aslında bu güzel bir ipucu. Doğru soruda değil, iyi soruda. Bununla ilgili daha fazla bilgiyi nerede bulabilirim? versionNameSuffixGIT şubesine göre kullanmak mümkün müdür ? Örneğin, "ana" değilse, bir yayın sürümü olsa bile her zaman bir sonek var
android geliştirici

0

En son sınıf sürümleri için aşağıdaki snippet'i kullanabilirsiniz:

Önce uygulama bildirim konumunuzu ayarlayın

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

Ve daha sonra build.gradle'de

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"))
    }
}

Her yapı türü için farklı manifestleriniz varsa ayarlayın. ama tek olandan beri - benim için mükemmel çalışıyor.


bir sınıf dosyasından apk adına bir dize eklemek mümkün mü ??
Upendra Shah

0

Android Studio 1.1.0'dan itibaren, bu kombinasyonun dosyanın android gövdesinde çalıştığını gördüm build.gradle. Bu, manifest xml dosya verilerinin nasıl içe aktarılacağını anlayamıyorsanız. Android Studio tarafından daha fazla desteklenmesini dilerdim, ancak istediğiniz apk adı çıktısını alana kadar değerlerle oynayın:

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"))
                }
            }
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.