Gradle ekstra özelliklere sahip Autoincrement VersionCode


121

Gradle ile bir Android uygulaması oluşturuyorum. Şimdiye kadar Manifest dosyasını versionCode'u arttırmak için kullandım, ancak versionCode'u harici bir dosyadan okumak istiyorum ve bunun sürüm çeşidi mi yoksa hata ayıklama çeşidi mi olduğuna bağlı olarak versionCode'u artırın. Ekstra özellikleri denedim, ancak onları kaydedemezsiniz, bu, bir dahaki sefere onu oluşturduğumda aynı versionCode'u alacağım anlamına gelir. Herhangi bir yardım çok takdir edilecektir!

project.ext{
    devVersionCode = 13
    releaseVersionCode = 1
}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    compile project(':Cropper')
    compile "com.android.support:appcompat-v7:18.0.+"
    compile "com.android.support:support-v4:18.0.+"
    compile fileTree(dir: 'libs', include: '*.jar')
}

def getReleaseVersionCode() {
    def version = project.releaseVersionCode + 1
    project.releaseVersionCode = version
    println sprintf("Returning version %d", version)
    return version
}

def getDevVersionCode() {
    def version = project.devVersionCode + 1
    project.devVersionCode = version
    println sprintf("Returning version %d", version)
    return version
}


def getLastVersioName(versionCode) {
    return "0.0." + versionCode
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }

    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
            proguardFile 'proguard.cfg'
            debuggable false
            signingConfig null
            zipAlign false
        }
        debug {
            versionNameSuffix "-DEBUG"
        }
    }
    productFlavors {
        dev {
            packageName = 'com.swisscom.docsafe.debug'
            versionCode getDevVersionCode()
            versionName getLastVersioName(project.devVersionCode)
        }
        prod {
            packageName = 'com.swisscom.docsafe'
            versionCode getReleaseVersionCode()
            versionName getLastVersioName(project.releaseVersionCode)
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.8'
}

Cevabımı burada görün: stackoverflow.com/a/33637600/348189
TacB0sS

Başka bir seçenek (bir ayarla ve unut yaklaşımı): medium.com/@passsy/…
Simon B.

Seçtiğiniz Gradle eklentilerine sahip tek satır: stackoverflow.com/a/61718437/4548500
SUPERCILEX

Yanıtlar:


207

VersionCode'u harici bir dosyadan okumak istiyorum

Herhangi bir sayıda olası çözüm olduğundan eminim; işte burada:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.0"

    def versionPropsFile = file('version.properties')

    if (versionPropsFile.canRead()) {
        def Properties versionProps = new Properties()

        versionProps.load(new FileInputStream(versionPropsFile))

        def code = versionProps['VERSION_CODE'].toInteger() + 1

        versionProps['VERSION_CODE']=code.toString()
        versionProps.store(versionPropsFile.newWriter(), null)

        defaultConfig {
            versionCode code
            versionName "1.1"
            minSdkVersion 14
            targetSdkVersion 18
        }
    }
    else {
        throw new GradleException("Could not read version.properties!")
    }

    // rest of android block goes here
}

Bu kod version.properties, ilk derlemeden önce elle oluşturacağınız mevcut bir dosyayı bekler VERSION_CODE=8.

Bu kod, her derlemedeki sürüm kodunu basitçe çarpıyor - tekniği her çeşit sürüm kodunuzu işleyecek şekilde genişletmeniz gerekir.

Bu kodu gösteren Versioning örnek projesini görebilirsiniz .


4
Bu sürümün artması yalnızca sürüm derlemeleri yaparken nasıl etkinleştirilir?
Piotr

@Piotr: "Yalnızca sürüm yapısındaki sayıyı artır" demek istiyorsan, bu mümkün olmalı, ancak ayrıntıları bilmiyorum. Kişisel olarak, ~ 2 milyar sürüm kodu mevcut olduğundan, tükenmeyeceğimi varsayıyorum. :-)
CommonsWare

3
@Piotr, sürüm kodunu ayrı ayrı artıran ve ardından assembleRelease.finalizedBy incrementVersionbenzer veya benzer bir şey yapan bir görev oluşturursunuz . Kodumu düzelttikten sonra göndereceğim.
Chris.Jenkins

Özel bir görev kullanarak buna benzer bir şey yapabilirsiniz ./gradlew incrementVersionCode build. Bu şekilde sırayla çağrılan görevler, görevlerden herhangi biri başarısız olur olmaz durur.
Dori

3
@ Chris.jenkins hala kodunu yazarken: p Burada yukarıdaki görev ve yöntem formu gist.github.com/doridori/544c24509be236c11fd5 ile android DSL içinde kullanılabilirversionCode getIncrementingVersionCode()
Dori

83

İşte aşağıda görülebilecek olan önceki cevabımın modernizasyonu geliyor. Bu, Gradle 4.4 ve Android Studio 3.1.1 ile çalışıyor .

Bu komut dosyası ne yapar:

  • Eğer yoksa bir version.properties dosyası oluşturur (aşağıdaki Paul Cantrell'in cevabına oy verin, bu cevabı beğendiyseniz fikrimi buradan edindim)
  • Her derleme, hata ayıklama sürümü için veya Android Studio'da çalıştır düğmesine her bastığınızda VERSION_BUILD sayısı artar.
  • Her sürümü bir araya getirdiğinizde , oyun mağazası için Android sürüm Kodunuz artar ve yama numaranız artar.
  • Bonus: Oluşturma tamamlandıktan sonra, projectDir/apkdaha erişilebilir hale getirmek için apk'nizi kopyalar .

Bu komut dosyası, AppName-v1.3.4.apkv1.3.4 (123) gibi görünen ve bir apk dosyası oluşturan bir sürüm numarası oluşturacaktır .

Major version         Build version
             v1.3.4 (123)
  Minor version ⌃|⌃ Patch version

Ana sürüm: Daha büyük değişiklikler için manuel olarak değiştirilmelidir.

Küçük sürüm: Biraz daha az büyük değişiklikler için manuel olarak değiştirilmelidir.

Yama sürümü: Çalışırken artargradle assembleRelease

Derleme sürümü: Her derlemeyi artırır

Sürüm Numarası: Yama sürümüyle aynı , bu, Play Store'un her yeni apk yüklemesi için artırması gereken sürüm kodu içindir.

Aşağıdaki 1 - 3 olarak etiketlenen yorumlardaki içeriği değiştirin ve komut dosyası gerisini halledecektir. :)

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'

    def versionPropsFile = file('version.properties')
    def value = 0
    Properties versionProps = new Properties()
    if (!versionPropsFile.exists()) {
        versionProps['VERSION_PATCH'] = "0"
        versionProps['VERSION_NUMBER'] = "0"
        versionProps['VERSION_BUILD'] = "-1" // I set it to minus one so the first build is 0 which isn't super important. 
        versionProps.store(versionPropsFile.newWriter(), null)
    }

    def runTasks = gradle.startParameter.taskNames
    if ('assembleRelease' in runTasks) {
        value = 1
    }

    def mVersionName = ""
    def mFileName = ""

    if (versionPropsFile.canRead()) {
        versionProps.load(new FileInputStream(versionPropsFile))

        versionProps['VERSION_PATCH'] = (versionProps['VERSION_PATCH'].toInteger() + value).toString()
        versionProps['VERSION_NUMBER'] = (versionProps['VERSION_NUMBER'].toInteger() + value).toString()
        versionProps['VERSION_BUILD'] = (versionProps['VERSION_BUILD'].toInteger() + 1).toString()

        versionProps.store(versionPropsFile.newWriter(), null)

        // 1: change major and minor version here
        mVersionName = "v1.0.${versionProps['VERSION_PATCH']}"
        // 2: change AppName for your app name
        mFileName = "AppName-${mVersionName}.apk"

        defaultConfig {
            minSdkVersion 21
            targetSdkVersion 27
            applicationId "com.example.appname" // 3: change to your package name
            versionCode versionProps['VERSION_NUMBER'].toInteger()
            versionName "${mVersionName} Build: ${versionProps['VERSION_BUILD']}"
        }

    } else {
        throw new FileNotFoundException("Could not read version.properties!")
    }

    if ('assembleRelease' in runTasks) {
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                    outputFileName = mFileName
                }
            }
        }
    }

    task copyApkFiles(type: Copy){
        from 'build/outputs/apk/release'
        into '../apk'
        include mFileName
    }

    afterEvaluate {
        assembleRelease.doLast {
            tasks.copyApkFiles.execute()
        }
    }

    signingConfigs {
        ...
    }

    buildTypes {
        ...
    }
}

================================================== ==

İLK CEVAP:

VersionName'in de otomatik olarak artmasını istiyorum. Bu, benim için mükemmel bir şekilde çalışan CommonsWare'in cevabına sadece bir ek. İşte benim işime yarayan bu

defaultConfig {
    versionCode code
    versionName "1.1." + code
    minSdkVersion 14
    targetSdkVersion 18
}

DÜZENLE:

Biraz tembel olduğum için, sürüm oluşturma işlemimin olabildiğince otomatik çalışmasını istiyorum. İstediğim şey , her derlemede artan bir Derleme Sürümüne sahip olmak , Sürüm Numarası ve Sürüm Adı ise yalnızca bir sürüm derlemesi yaptığımda artıyor.

Geçen yıl boyunca kullandığım şey bu, temel bilgiler CommonsWare'in cevabından ve önceki cevabımdan ve biraz daha fazlası. Bu, aşağıdaki sürüm oluşturma ile sonuçlanır:

Sürüm Adı: 1.0.5 (123) -> Major.Minor.Patch (Build), Major ve Minor manuel olarak değiştirilir.

Build.gradle'da:

...
android {
    compileSdkVersion 23
    buildToolsVersion '23.0.1'
    def versionPropsFile = file('version.properties')
    if (versionPropsFile.canRead()) {
        def Properties versionProps = new Properties()

        versionProps.load(new FileInputStream(versionPropsFile))

        def value = 0

        def runTasks = gradle.startParameter.taskNames
        if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) {
            value = 1;
        }

        def versionMajor = 1
        def versionMinor = 0
        def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
        def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
        def versionNumber = versionProps['VERSION_NUMBER'].toInteger() + value

        versionProps['VERSION_PATCH'] = versionPatch.toString()
        versionProps['VERSION_BUILD'] = versionBuild.toString()
        versionProps['VERSION_NUMBER'] = versionNumber.toString()

        versionProps.store(versionPropsFile.newWriter(), null)

        defaultConfig {
            versionCode versionNumber
            versionName "${versionMajor}.${versionMinor}.${versionPatch} (${versionBuild}) Release"
            minSdkVersion 14
            targetSdkVersion 23
        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def fileNaming = "apk/RELEASES"
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        output.outputFile = new File(getProject().getRootDir(), "${fileNaming}-${versionMajor}.${versionMinor}.${versionPatch}-${outputFile.name}")
                    }
                }
            }
        }

    } else {
        throw new GradleException("Could not read version.properties!")
    }

    ...
}

...

Projenizi uçbirim üzerinden 'assemble' , 'assembleRelease' veya 'aR' ile birleştirirseniz patch ve versionCode artar, bu da proje kökünüzde apk / RELEASE adlı yeni bir klasör oluşturur, böylece derleme / çıktılara bakmanıza gerek kalmaz. APK'nızı bulmak için / more / more / more.

Sürüm özelliklerinizin şöyle görünmesi gerekir:

VERSION_NUMBER=1
VERSION_BUILD=645
VERSION_PATCH=1

Açıkçası 0 ile başlayın. :)


2
İkinci 'variant.outputs.each {output ->', karşılık gelen '}' ile kaldırılabilir.
redocoder

Bu, tüm derlemelerimin yalnızca x86_64 yerel kodunda olmasına neden oluyor
Chisko

@Chisko Nedenin bu gradle kod parçası olduğundan şüpheliyim. Yeni bir soru sorun ve gradle kodunuzu paylaşın, neyin yanlış olduğunu anlamaya çalışalım. :)
just_user

1
Şimdi bunun temel neden olmadığını doğrulayabilirim. Özür dilerim.
Chisko

1
@AlexanderGavriliuk, oyun mağazası tarafından kullanılan ve her yükleme için sürekli olarak artırılması gereken sürüm kodudur. Ana veya ikincil sürümü artırırsanız yama numarası muhtemelen sıfırlanacaktır. Uygulamayı oyun mağazasına aynı paket adıyla yüklerseniz sürüm numarası asla sıfırlanmamalıdır.
just_user

40

CommonsWare'in mükemmel cevabının biraz daha daraltılmış bir sürümü, mevcut değilse sürüm dosyasını oluşturur:

def Properties versionProps = new Properties()
def versionPropsFile = file('version.properties')
if(versionPropsFile.exists())
    versionProps.load(new FileInputStream(versionPropsFile))
def code = (versionProps['VERSION_CODE'] ?: "0").toInteger() + 1
versionProps['VERSION_CODE'] = code.toString()
versionProps.store(versionPropsFile.newWriter(), null)

defaultConfig {
    versionCode code
    versionName "1.1"
    minSdkVersion 14
    targetSdkVersion 18
}

sürüm dosyası yoksa, sürüm dosyasını oluşturmayla ilgili bölüm nerede?
portfoliobuilder

4
if(versionPropsFile.exists())dosya orada değilse patlamamasını sağlar. versionProps.store(versionPropsFile.newWriter(), null) Zaten var olup olmadığına bakılmaksızın dosyanın üzerine yazar.
Paul Cantrell

Groovy'de ne anlama ?:geldiğini kontrol etmem gerekiyordu. Elvis operatörü üçlü operatörün bir kısalma olduğunu.
Daniel

30

Bunu yapmak için birkaç seçeneğe baktım ve nihayetinde versionCode'u otomatik olarak artırmaya ve revizyon kontrol sistemime kontrol etmeye çalışmak yerine versionCode için şimdiki zamanı kullanmanın daha kolay olduğuna karar verdim.

Aşağıdakileri ekleyin build.gradle:

/**
 * Use the number of seconds/10 since Jan 1 2016 as the versionCode.
 * This lets us upload a new build at most every 10 seconds for the
 * next 680 years.
 */
def vcode = (int)(((new Date().getTime()/1000) - 1451606400) / 10)

android {
    defaultConfig {
        ...
        versionCode vcode
    }
}

Ancak, 2696 yılından sonra derlemeler yüklemeyi bekliyorsanız, farklı bir çözüm kullanmak isteyebilirsiniz.


2
Bunu şimdi okuyorsanız ve yeni bir uygulamayla başlıyorsanız, çıkartabilirsiniz 1510351294:))
Entreco

bunu anlamadım !! Analiz veya crashlytics veya sürüm kodları ve adlarıyla veri sağlayan başka bir hizmet kullanmıyor musunuz? ve bunlarla kolayca oynuyorsunuz?
Amir Ziarati

Makul sürüm adlarınız varsa, sorun olmadığını düşünüyorum. Crashalytics, sürüm adını da sağlar.
netcyrax

@emmby '1451606400' numarasını nereden alıyorsunuz? veya #Entreco'dan '1510351294' boşuna hesaplamaya çalışıyorum!
Joseph Wambura

18

versionCodeOtomatik olarak almanın bir başka yolu, versionCodeödünç alınan gitşubedeki taahhütlerin sayısını ayarlamaktır . Aşağıdaki hedefleri gerçekleştirir:

  1. versionCodeherhangi bir makinede otomatik olarak ve tutarlı bir şekilde oluşturulur (bir Continuous Integrationve / veyaContinuous Deployment sunucu .
  2. Bununla birlikte uygulama versionCode uygulama GooglePlay'e gönderilebilir.
  3. Depo dışındaki hiçbir dosyaya güvenmiyor.
  4. Depoya hiçbir şey itmez
  5. Gerekirse manuel olarak geçersiz kılınabilir

kullanma Yukarıdaki hedefleri gerçekleştirmek için gradle-git kitaplığını . build.gradleDosyanıza /appdizini aşağıdaki kodu ekleyin :

import org.ajoberstar.grgit.Grgit

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.ajoberstar:grgit:1.5.0'
    }
}

android {
/*
    if you need a build with a custom version, just add it here, but don't commit to repo,
    unless you'd like to disable versionCode to be the number of commits in the current branch.

    ex. project.ext.set("versionCodeManualOverride", 123)
*/
    project.ext.set("versionCodeManualOverride", null)

    defaultConfig {
        versionCode getCustomVersionCode()
    }
}

def getCustomVersionCode() {

    if (project.versionCodeManualOverride != null) {
        return project.versionCodeManualOverride
    }

    // current dir is <your proj>/app, so it's likely that all your git repo files are in the dir
    // above.
    ext.repo = Grgit.open(project.file('..'))

    // should result in the same value as running
    // git rev-list <checked out branch name> | wc -l
    def numOfCommits = ext.repo.log().size()
    return numOfCommits
}

NOT: Bu yöntemin işe yaraması için en iyisi aynı şubeden Google Play Store'a dağıtmaktır (ör. master ).


özünde zarif bir çözüm olsa da, 2 git satırında tam olarak ne olduğuna bağlı olarak, bunun yapım süresini büyük ölçüde yavaşlatacağını hayal edebiliyorum. Bununla ilgili herhangi bir deneyim var mı?
HopefullyHelpful

1
Bu adım devre dışı bırakılırsa herhangi bir performans artışı görmüyorum. Yöntemi yerel olarak ve inşa makinelerimizde bir yılı aşkın süredir kullanıyoruz ve performans hiçbir şekilde sorun olmamıştır. Herhangi bir performans sorunu fark ederseniz, lütfen bana bildirin!
C0D3LIC1OU5

Çözümünüz zarif olsa da, bazı beklenmedik sürprizler verebilir. VersionCodes'un her zaman önceki sürümdekinden daha büyük olması çok önemlidir. Ya 50 kaydetme içeren bir şubeniz varsa ve daha yeni olan ancak belki de birleştirilmiş bazı özelliklerden birkaç işlemin ezilmesi nedeniyle yalnızca 40 işlemeye sahip başka bir şube oluşturursanız ne olur? Kaydetme geçmişinizin her zaman doğrusal bir artımlı kaydetme akışı olmaması için birçok neden görebiliyorum.
JHH

@JHH Bu sonuçlar beklenmedik değil. Bir notta bahsettiğim gibi, bu yöntem en iyi aynı şubeden dağıtım yapıldığında işe yarar.
C0D3LIC1OU5


10

Başka bir seçenek, artırma için versionCodeve versionName, bir zaman damgası kullanıyor.

defaultConfig {
   versionName "${getVersionNameTimestamp()}"
   versionCode getVersionCodeTimestamp()
}


def getVersionNameTimestamp() {
    return new Date().format('yy.MM.ddHHmm')
}

def getVersionCodeTimestamp() {
    def date = new Date()
    def formattedDate = date.format('yyMMddHHmm')
    def code = formattedDate.toInteger()
    println sprintf("VersionCode: %d", code)
    return code
}

1 Ocak'tan itibaren, formattedDate = date.format ('yyMMddHHmm') Tamsayıların kapasitesini aşıyor


1
Kişi otomatik artışlı bir yapı numarası istedi
peter_pilgrim

6
@peter_pilgrim Caro OP'dir.
Matthew

Bence bu zarif bir çözüm, kaybolabilecek veya kaybolabilecek veya git'te sürekli olarak görünecek dosyalara güvenmiyor. Ayrıca, sonraki düzine 22 yıl boyunca her yapıyı benzersiz bir şekilde tanımlamanıza yardımcı olur.
HopefullyHelpful

developer.android.com:"Warning alıntı: En büyük değeri Google Play, versionCode sağlar 2100000000. "Yani, kesme aslında 2021 olduğu
ths

İnt limit için düzeltme: dakikaları atlayın ve 'yyMMddHH' tarih biçimini kullanın, sürüm kodu en az saat içerecektir.
Pointer Null

10

VersionCode'u yalnızca yayın sürümünde artırmak için şunları yapın:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    def versionPropsFile = file('version.properties')
    def code = 1;
    if (versionPropsFile.canRead()) {
        def Properties versionProps = new Properties()

        versionProps.load(new FileInputStream(versionPropsFile))
        List<String> runTasks = gradle.startParameter.getTaskNames();
        def value = 0
        for (String item : runTasks)
        if ( item.contains("assembleRelease")) {
            value = 1;
        }
        code = Integer.parseInt(versionProps['VERSION_CODE']).intValue() + value
        versionProps['VERSION_CODE']=code.toString()
        versionProps.store(versionPropsFile.newWriter(), null)
    }
    else {
        throw new GradleException("Could not read version.properties!")
    }

    defaultConfig {
        applicationId "com.pack"
        minSdkVersion 14
        targetSdkVersion 21
        versionName "1.0."+ code
        versionCode code
    }

mevcut bir c://YourProject/app/version.propertiesilk derlemeden önce elle oluşturacağınız dosyanın sahipVERSION_CODE=8

Dosya version.properties:

VERSION_CODE=8


Bunun yerine onu bir görevin içine koyun ve generateReleaseBuildConfig öğesinin o göreve bağlı olmasını sağlayın.
lagos

versionName "1.0." + getSvnRevision () bir hataya neden oluyor. GetSvnRevision () yöntemi nereye başvuruyor? "1.0." + Kodunun versionName "1.0." + Kod olmaması gerektiğinden emin misiniz (sürüm adı, sürüm kodunuzla birlikte artar)?
portfoliobuilder

1
@portfoliobuilder, kod için getSvnRevision () 'ı değiştirin
NickUnuchek

4

Dosya oluştur version.properties

MAJOR=1
MINOR=3
PATCH=6
VERSION_CODE=1

Değiştir build.gradle:

android {
def _versionCode=0
def _major=0
def _minor=0
def _patch=0

def _applicationId = "com.example.test"

def versionPropsFile = file('version.properties')

if (versionPropsFile.canRead()) {
    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    _patch = versionProps['PATCH'].toInteger() + 1
    _major = versionProps['MAJOR'].toInteger()
    _minor = versionProps['MINOR'].toInteger() 
    _versionCode= versionProps['VERSION_CODE'].toInteger()+1
    if(_patch==99)
    {
        _patch=0
        _minor=_minor+1
    }
    if(_major==99){
        _major=0
        _major=_major+1
    }

    versionProps['MAJOR']=_major.toString()
    versionProps['MINOR']=_minor.toString()
    versionProps['PATCH']=_patch.toString()
    versionProps['VERSION_CODE']=_versionCode.toString()
    versionProps.store(versionPropsFile.newWriter(), null)
}
else {
    throw new GradleException("Could not read version.properties!")
}
def _versionName = "${_major}.${_versionCode}.${_minor}.${_patch}"


compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
    applicationId _applicationId
    minSdkVersion 11
    targetSdkVersion 23
    versionCode _versionCode
    versionName _versionName
}

}

Çıktı : 1.1.3.6


Teşekkürler. Ve neden versionName'e bir versionCode eklediniz? İkinci pozisyonda bile.
CoolMind

Ama örneğin 1.71.3.76 gibi görünecek. Bence, sürüm kodundan ayrı olarak 1.3.76 daha iyidir.
CoolMind

Evet . "$ {_ major} .. $ {_ minor}. $ {_ patch}. $ {_ versionCode}" olarak değiştirebilir veya yamayı kaldırabilirsiniz
Ahmad Aghazadeh

eğer (_major == 99) if (_minor == 99) olmalıdır ??
Anirudh Bagri

2

Define versionName içindeAndroidManifest.xml

android:versionName="5.1.5"

Uygulama düzeyinde iç android{...}blok build.gradle:

defaultConfig {
        applicationId "com.example.autoincrement"
        minSdkVersion 18
        targetSdkVersion 23
        multiDexEnabled true
        def version = getIncrementationVersionName()
        versionName version
}

Uygulama düzeyinde dış android{...}blok build.gradle:

def getIncrementedVersionName() {
    List<String> runTasks = gradle.startParameter.getTaskNames();

    //find version name in manifest
    def manifestFile = file('src/main/AndroidManifest.xml')
    def matcher = Pattern.compile('versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\"').matcher(manifestFile.getText())
    matcher.find()

    //extract versionName parts
    def firstPart = Integer.parseInt(matcher.group(1))
    def secondPart = Integer.parseInt(matcher.group(2))
    def thirdPart = Integer.parseInt(matcher.group(3))

    //check is runTask release or not
    // if release - increment version
    for (String item : runTasks) {
        if (item.contains("assemble") && item.contains("Release")) {
            thirdPart++
            if (thirdPart == 10) {
                thirdPart = 0;
                secondPart++
                if (secondPart == 10) {
                    secondPart = 0;
                    firstPart++
                }
            }
        }
    }

    def versionName = firstPart + "." + secondPart + "." + thirdPart

    // update manifest
    def manifestContent = matcher.replaceAll('versionName=\"' + versionName + '\"')
    manifestFile.write(manifestContent)

    println "incrementVersionName = " + versionName

    return versionName
}

Şarkı söylenen APK oluşturulduktan sonra:

android:versionName="5.1.6"

Not: SürümAdı'nız benimkinden farklıysa, normal ifadeyi değiştirmeniz ve parça mantığını çıkarmanız gerekir .


1

Yukarıda gösterilen örnekler farklı nedenlerle işe yaramıyor

İşte bu makaledeki fikirlere dayalı kullanıma hazır varyantım:

android {
    compileSdkVersion 28

    // /programming/21405457

    def propsFile = file("version.properties")
    // Default values would be used if no file exist or no value defined
    def customAlias = "Alpha"
    def customMajor = "0"
    def customMinor = "1"
    def customBuild = "1" // To be incremented on release

    Properties props = new Properties()
    if (propsFile .exists())
        props.load(new FileInputStream(propsFile ))

    if (props['ALIAS'] == null) props['ALIAS'] = customAlias else customAlias = props['ALIAS']
    if (props['MAJOR'] == null) props['MAJOR'] = customMajor else customMajor = props['MAJOR']
    if (props['MINOR'] == null) props['MINOR'] = customMinor else customMinor = props['MINOR']
    if (props['BUILD'] == null) props['BUILD'] = customBuild else customBuild = props['BUILD']

    if (gradle.startParameter.taskNames.join(",").contains('assembleRelease')) {
        customBuild = "${customBuild.toInteger() + 1}"
        props['BUILD'] = "" + customBuild

        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                if (output.outputFile != null && (output.outputFile.name == "app-release.apk"))
                    outputFileName = "app-${customMajor}-${customMinor}-${customBuild}.apk"
            }
        }
    }

    props.store(propsFile.newWriter(), "Incremental Build Version")

    defaultConfig {
        applicationId "org.example.app"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode customBuild.toInteger()
        versionName "$customAlias $customMajor.$customMinor ($customBuild)"

        ...
    }
...
}

0

CommonsWare Kredisi (Kabul Edilen Cevap) Paul Cantrell (Eğer yoksa dosya oluştur) ahmad aghazadeh (Sürüm adı ve kodu)

Ben de onların fikirlerini bir araya getirdim ve bunu buldum. Bu, ilk gönderinin tam olarak sorduğu şeyin sürükle ve bırak çözümüdür.

SürümKodunu ve sürümAdı yayın durumuna göre otomatik olarak güncelleyecektir. Elbette ihtiyaçlarınızı karşılamak için değişkenleri hareket ettirebilirsiniz.

def _versionCode=0
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
if(versionPropsFile.exists())
    versionProps.load(new FileInputStream(versionPropsFile))
    def _patch = (versionProps['PATCH'] ?: "0").toInteger() + 1
    def _major = (versionProps['MAJOR'] ?: "0").toInteger()
    def _minor = (versionProps['MINOR'] ?: "0").toInteger()
    List<String> runTasks = gradle.startParameter.getTaskNames();
    def value = 0
    for (String item : runTasks)
        if ( item.contains("assembleRelease")) {
            value = 1;
        }
    _versionCode = (versionProps['VERSION_CODE'] ?: "0").toInteger() + value
    if(_patch==99)
    {
        _patch=0
        _minor=_minor+1
    }
    if(_major==99){
        _major=0
        _major=_major+1
    }

versionProps['MAJOR']=_major.toString()
versionProps['MINOR']=_minor.toString()
versionProps['PATCH']=_patch.toString()
versionProps['VERSION_CODE']=_versionCode.toString()
versionProps.store(versionPropsFile.newWriter(), null)
def _versionName = "${_major}.${_versionCode}.${_minor}.${_patch}"

compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    applicationId "com.yourhost.yourapp"
    minSdkVersion 16
    targetSdkVersion 24
    versionCode _versionCode
    versionName _versionName
}

0

Gradle Görev Grafiğini kullanarak yapı türünü kontrol edebilir / değiştirebiliriz .

Temel fikir, her derlemede versionCode değerini artırmaktır . Her derlemede version.properties dosyasında saklanan bir sayaç . Her yeni APK derlemesinde güncellenecek ve build.gradle dosyasındaki versionCode dizesini bu artırılmış sayaç değeriyle değiştirecektir.

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion '25.0.2'

def versionPropsFile = file('version.properties')
def versionBuild

/*Setting default value for versionBuild which is the last incremented value stored in the file */
if (versionPropsFile.canRead()) {
    def Properties versionProps = new Properties()
    versionProps.load(new FileInputStream(versionPropsFile))
    versionBuild = versionProps['VERSION_BUILD'].toInteger()
} else {
    throw new FileNotFoundException("Could not read version.properties!")
}


/*Wrapping inside a method avoids auto incrementing on every gradle task run. Now it runs only when we build apk*/
ext.autoIncrementBuildNumber = {

    if (versionPropsFile.canRead()) {
        def Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionPropsFile))
        versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
        versionProps['VERSION_BUILD'] = versionBuild.toString()
        versionProps.store(versionPropsFile.nminSdkVersion 14
        targetSdkVersion 21
        versionCode 1ewWriter(), null)
    } else {
        throw new FileNotFoundException("Could not read version.properties!")
    }
}


defaultConfig {
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 1
    versionName "1.0.0." + versionBuild
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

// Hook to check if the release/debug task is among the tasks to be executed.
//Let's make use of it
gradle.taskGraph.whenReady {taskGraph ->
    if (taskGraph.hasTask(assembleDebug)) {  /* when run debug task */
        autoIncrementBuildNumber()
    } else if (taskGraph.hasTask(assembleRelease)) { /* when run release task */
        autoIncrementBuildNumber()
    }
  }
}

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

Yukarıdaki komut dosyasını ana modülün build.gradle dosyanızın içine yerleştirin.

Referans Web Sitesi: http://devdeeds.com/auto-increment-build-number-using-gradle-in-android/

Teşekkürler & Saygılar!


0

İlk Yorumlanan kod, her "Projeyi Yeniden Oluşturma" sırasında sayıyı artıracak ve değeri "Sürüm Özelliği" dosyasına kaydedecektir.

İkinci Yorumlanan kod, "APK Oluşturma" sırasında APK dosyasının yeni sürüm adını oluşturacaktır.

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.0"
    //==========================START==================================
    def Properties versionProps = new Properties()
    def versionPropsFile = file('version.properties')
    if(versionPropsFile.exists())
        versionProps.load(new FileInputStream(versionPropsFile))
    def code = (versionProps['VERSION_CODE'] ?: "0").toInteger() + 1
    versionProps['VERSION_CODE'] = code.toString()
    versionProps.store(versionPropsFile.newWriter(), null)
    //===========================END===================================
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "0.19"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            //=======================================START===============================================
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    def appName = "MyAppSampleName"
                    outputFileName = appName+"_v${variant.versionName}.${versionProps['VERSION_CODE']}.apk"
                }
            }
            //=======================================END===============================================
        }
    }
}

Lütfen neyi değiştirdiğinizi gösteren bir metin ekleyin. ve neden
Matthew Kerian

0

mac ive'deki Gradle 5.1.1 sürümünde, görev adlarının nasıl alındığını değiştirdi, derlemeden yapı çeşidi / türü almaya çalıştığımı ancak görev adını bölmek için tembel olduğunu düşündüm:

def versionPropsFile = file('version.properties')
if (versionPropsFile.canRead()) {
    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    def value = 0

    def runTasks = gradle.getStartParameter().getTaskRequests().toString()

    if (runTasks.contains('assemble') || runTasks.contains('assembleRelease') || runTasks.contains('aR')) {
        value = 1
    }

    def versionMajor = 1
    def versionMinor = 0
    def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
    def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
    def versionNumber = versionProps['VERSION_NUMBER'].toInteger() + value

    versionProps['VERSION_PATCH'] = versionPatch.toString()
    versionProps['VERSION_BUILD'] = versionBuild.toString()
    versionProps['VERSION_NUMBER'] = versionNumber.toString()

    versionProps.store(versionPropsFile.newWriter(), null)

    defaultConfig {
        applicationId "de.evomotion.ms10"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode versionNumber
        versionName "${versionMajor}.${versionMinor}.${versionPatch} (${versionBuild})"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        signingConfig signingConfigs.debug
    }

} else {
    throw new GradleException("Could not read version.properties!")
}

Kod @just_user dan bu bir


0

Gerçekten sevdiğim iki çözüm var. İlki Play Store'a, diğeri Git'e bağlıdır.

Play Store'u kullanarak, yüklenen en yüksek mevcut olana bakarak sürüm kodunu artırabilirsiniz. . Bu çözümün faydası, sürüm kodunuz her zaman Play Store'da bulunandan bir daha yüksek olduğu için bir APK yüklemesinin asla başarısız olmamasıdır. Olumsuz tarafı, APK'nızı Play Store'un dışına dağıtmanın daha zor hale gelmesidir. Hızlı başlangıç ​​kılavuzunu izleyerek ve eklentiye sürüm kodlarını otomatik olarak çözmesini söyleyerek bunu Gradle Play Publisher'ı kullanarak ayarlayabilirsiniz :

plugins {
    id 'com.android.application'
    id 'com.github.triplet.play' version 'x.x.x'
}

android {
    ...
}

play {
    serviceAccountCredentials = file("your-credentials.json")
    resolutionStrategy = "auto"
}

Git'i kullanarak, deponuzun sahip olduğu işlem ve etiket sayısına bağlı olarak sürüm kodunu artırabilirsiniz. Buradaki avantaj, çıktınızın yeniden üretilebilir olması ve deponuzun dışındaki hiçbir şeye bağlı olmamasıdır. Olumsuz tarafı, sürüm kodunuzu çarpmak için yeni bir işlem veya etiket yapmanız gerektiğidir. Bunu Version Master Gradle eklentisini ekleyerek ayarlayabilirsiniz :

plugins {
    id 'com.android.application'
    id 'com.supercilex.gradle.versions' version 'x.x.x'
}

android {
    ...
}
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.