Soru Android Gradle'da versionCode'u nasıl otomatik olarak güncellerim?


Gradle'a dayanan yeni Android sistemi ile deney yapıyorum ve düşünüyorum, bununla birlikte versionCode'u otomatik olarak iyileştirmenin en iyi yolu nedir? İki seçenek düşünüyorum

  1. versionCode dosyası oluştur, ondan numarayı oku, artır ve dosyayı tekrar yaz
  2. AndroidManifest.xml dosyasını ayrıştırın, ondan versionCode dosyasını okuyun, artırın ve AndroidManifest.xml dosyasına yazın.

Daha basit veya uygun bir çözüm var mı?

Herhangi biri, mentiod seçeneklerinden birini kullandı ve benimle paylaşabilir mi?


76
2017-07-03 12:52


Menşei


Bir okuma version.properties dosya stackoverflow.com/a/21405744 - Dori


Cevaplar:


İkinci seçeneğe karar verdim - ayrıştırmak AndroidManifest.xml. İşte çalışma pasajı.

task('increaseVersionCode') << {
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}

versionCode Bu durumda serbest bırakmak için yayınlandı. Hata ayıklama için artırmak için <a0> </ a0>, içinde task.name denklemini değiştirir task.whenTaskAdded geri aramak.


56
2017-07-08 11:12



bir soru, bu kodu Cradle derleme sistemine nasıl entegre edebiliriz? - Jacky
Ayrıca, biraz daha temiz bir yanıt burada XML değiştirmez, ancak sürüm numarasını bir sahne dosyasında tutar: stackoverflow.com/questions/21405457/... - Paul Cantrell
Yeni proje yapısını kullanıyorsanız, sadece dosyayı ("AndroidManifest.xml") dosya olarak değiştirin ("src / main / AndroidManifest.xml"). - Elhanan Mishraky
AndroidManifest.xml cihazımda versionCode ayarlamazsam ne olur? - Igor Ganapolsky
@Jacky Hala bir geçici çözümünüz yoksa, cevabımı görün: stackoverflow.com/a/39619297/1150251 - iStar


Bir "major.minor.patch.build" şeması kullanarak, hem versionCode hem de versionName güncellemek için bu kodu kullanıyorum.

import java.util.regex.Pattern

task('increaseVersionCode') << {
    def manifestFile = file("src/main/AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

task('incrementVersionName') << {
    def manifestFile = file("src/main/AndroidManifest.xml")
    def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcherVersionNumber = patternVersionNumber.matcher(manifestText)
    matcherVersionNumber.find()
    def majorVersion = Integer.parseInt(matcherVersionNumber.group(1))
    def minorVersion = Integer.parseInt(matcherVersionNumber.group(2))
    def pointVersion = Integer.parseInt(matcherVersionNumber.group(3))
    def buildVersion = Integer.parseInt(matcherVersionNumber.group(4))
    def mNextVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion + 1)
    def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"")
    manifestFile.write(manifestContent)
}

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig' || task.name == 'generateDebugBuildConfig') {
        task.dependsOn 'increaseVersionCode'
        task.dependsOn 'incrementVersionName'
    }
}

39
2018-02-22 07:35



Aldığınız kontrol miktarı için +1 - TheIcemanCometh
Üstte Pattern'i içe aktarmayı unuttun: import java.util.regex.Pattern - Mic92
Sabit, teşekkürler! - Andres
Biliyorum bu biraz eski ama hey sormak incitme ama yukarıdaki snippet kullanmayı denedim, bu hatayı alıyorum Error:(48) Execution failed for task ':app:incrementVersionName'. > No match found herhangi bir fikir? - acrichm
@acrichm: ayarladığınızdan emin olun android:versionName="0.0.0.1" Açıkça görüleceği üzere, maç sayısı beklenmeyecek - Jay


Kullandığınız tam kurulum gibi görünmüyor, ancak benim durumumda jenkins tarafından inşa ediliyor ve $ BUILD_NUMBER kodunu uygulamanın versionCode'u olarak kullanmak istedim. Aşağıdaki benim için hile yaptı.

defaultConfig {
    ...
    versionCode System.getenv("BUILD_NUMBER") as Integer ?: 9999
    ...
}

36
2018-04-16 17:46



System.genenv nedir? - Igor Ganapolsky
Bu aslında Jenkins'i kullanırken çok yardımcı oldu. Bunu kullanabilirsiniz bu eklenti yapı numarasıyla ortam değişkeni oluşturmak ve ile okumak System.getenv() kürek - Lamorak


Sürüm kodu için zaman damgası kullanıyorum:

def date = new Date()
def formattedDate = date.format('yyMMddHHmm')
def code = formattedDate.toInteger()

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 21
    versionCode code
}

13
2018-02-23 07:26



Bu basit ve dahidir. başparmak havaya - Євген Гарастович


Sürüm kodunu build.gradle dosyasında tutuyorsanız, sonraki parçacığı kullanın:

import java.util.regex.Pattern    
task('increaseVersionCode') << {
    def buildFile = file("build.gradle")
    def pattern = Pattern.compile("versionCode\\s+(\\d+)")
    def manifestText = buildFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode " + ++versionCode)
    buildFile.write(manifestContent)
}

6
2018-03-25 13:17



Bu model versionCode ile eşleşmiyor. - lagos
Build.gradle'ı gönderebilir misin? - Elhanan Mishraky
Build.gradle, normal bir yapı dosyasıdır. VersionCode hattı benziyor versionCode 18 . İntikamınızı bir test cihazında çalıştırsam bile ("versionCode \d+") eşleşmeyecek. - lagos
Hata bir daha beyaz boşluktu. Android Studio'da iki adet whitespaces kullanılıyor versionCode ve rakam, içindeki metinle birlikte hizalanacağından versionName. - lagos
Şimdi işe yaramalı, bunun için üzgünüm. - Elhanan Mishraky


Hem ürün tatlarını hem de türlerini hesaba katmak ve @ sealskej'in ayrıştırma manifestosunu kullanmak için:

android.applicationVariants.all { variant ->
    /* Generate task to increment version code for release */
    if (variant.name.contains("Release")) {
        def incrementVersionCodeTaskName = "increment${variant.name}VersionCode"
        task(incrementVersionCodeTaskName) << {
            if (android.defaultConfig.versionCode == -1) {
                def manifestFile = file(android.sourceSets.main.manifest.srcFile)
                def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
                def manifestText = manifestFile.getText()
                def matcher = pattern.matcher(manifestText)
                matcher.find()
                def versionCode = Integer.parseInt(matcher.group(1))
                android.defaultConfig.versionCode = versionCode + 1
                def manifestContent = matcher.replaceAll("versionCode=\"" + android.defaultConfig.versionCode + "\"")
                manifestFile.write(manifestContent)
            }
        }
        def hookTask = variant.generateBuildConfig
        hookTask.dependsOn(incrementVersionCodeTaskName)
    }
}

4
2017-10-03 23:42



Bunu nereye yazmamız gerekiyor ... Bu kodun hangi sınıfa / dosyaya eklenmesi gerektiği kastediyorum - ChArAnJiT
Bu, build.gradle'nin bir parçasıdır, çünkü bu işlem sürecinin bir parçasıdır - Max Ch


Gradle Gelişmiş Yapı Sürümü, Android'i üreten bir eklentidir versionCode ve versionName otomatik olarak. çok sayıda kişiselleştirme var. burada daha fazla bilgi bulabilirsiniz https://github.com/moallemi/gradle-advanced-build-version


4
2018-01-12 05:24



Not: Bu, henüz sürümün adını otomatik olarak artırmayı desteklemez - hooby3dfx


VersionCode Görevini Artırma (Tamsayı):

Bu, Sürüm Kodunu artırarak çalışır 1, Örneğin:

  android:versionCode="1"
1 + 1 = 2
import java.util.regex.Pattern

task incrementVersionCode << {
    def manifestFile = file('AndroidManifest.xml')
    def matcher = Pattern.compile('versionCode=\"(\\d+)\"')
    .matcher(manifestFile.getText())
    matcher.find()
    def manifestContent = matcher.replaceAll('versionCode=\"' +
        ++Integer.parseInt(matcher.group(1)) + '\"')
    manifestFile.write(manifestContent)
}

Increment VersionName Görev (String):

Uyarı: içermelidir 1 Regex dönemi

Bu, Sürüm Adı'nı artırarak çalışır. 0.01, Örneğin: Artışınızı kolayca değiştirebilir ve değiştirebilirsiniz ya da daha fazla rakam ekleyebilirsiniz.

android:versionName="1.0"
1.00 + 0.01 -> 1.01
1.01 + 0.01 -> 1.02
1.10 + 0.01 -> 1.11
1.99 + 0.01 -> 2.0
1.90 + 0.01 -> 1.91
import java.util.regex.Pattern

task incrementVersionName << {
    def manifestFile = file('AndroidManifest.xml')
    def matcher = Pattern.compile('versionName=\"(\\d+)\\.(\\d+)\"')
    .matcher(manifestFile.getText())
    matcher.find()
    def versionName = String.format("%.2f", Integer
        .parseInt(matcher.group(1)) + Double.parseDouble("." + matcher
            .group(2)) + 0.01)
    def manifestContent = matcher.replaceAll('versionName=\"' +
        versionName + '\"')
    manifestFile.write(manifestContent)
}

Önce:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exmaple.test"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

Sonra:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exmaple.test"
    android:installLocation="auto"
    android:versionCode="2"
    android:versionName="1.01" >

3
2017-09-29 02:38





@ Sealskej'in gönderisine eklemek için, hem sürüm kodunuzu hem de sürüm adınızı nasıl güncelleyeceğiniz budur (Burada büyük ve küçük sürümün her ikisinin de 0 olduğunu varsayalım):

task('increaseVersion') << {
    def manifestFile = file("AndroidManifest.xml")
    def patternVersionCode = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcherVersionCode = patternVersionCode.matcher(manifestText)
    matcherVersionCode.find()
    def versionCode = Integer.parseInt(matcherVersionCode.group(1))
    def manifestContent = matcherVersionCode.replaceAll("versionCode=\"" + ++versionCode + "\"")

    manifestFile.write(manifestContent)

    def patternVersionNumber = Pattern.compile("versionName=\"0.0.(\\d+)\"")
    manifestText = manifestFile.getText()
    def matcherVersionNumber = patternVersionNumber.matcher(manifestText)
    matcherVersionNumber.find()
    def versionNumber = Integer.parseInt(matcherVersionNumber.group(1))
    manifestContent = matcherVersionNumber.replaceAll("versionName=\"0.0." + ++versionNumber + "\"")
    manifestFile.write(manifestContent)
}

2
2017-07-13 05:50





Peki buna ne dersin ? build.gradle (uygulama modülü) ekle

def getBuildVersionCode() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMdd')
    def formattedSeconds = date.format('HHmmssSSS')
    def formatInt = formattedDate as int;
    def SecondsInt = formattedSeconds as int;
    return (formatInt + SecondsInt) as int
}

   defaultConfig {
    applicationId "com.app"
    minSdkVersion 17
    targetSdkVersion 22
    versionCode getBuildVersionCode()
    versionName "1.0"
}

1
2017-07-16 13:16



Büyük düşünce ama (20160129 + 000000000) < (20160128 + 125959999) - C0D3LIC1OU5