सवाल Android Gradle में autoincrement संस्करण कोड कैसे करें


मैं ग्रैडल के आधार पर नई एंड्रॉइड बिल्ड सिस्टम के साथ प्रयोग कर रहा हूं और मैं सोच रहा हूं, इसके साथ संस्करण कोड को स्वत: सुधारने का सबसे अच्छा तरीका क्या है। मैं दो विकल्पों के बारे में सोच रहा हूँ

  1. संस्करण कोड फ़ाइल बनाएं, इससे संख्या पढ़ें, इसे बढ़ाएं और इसे फ़ाइल में वापस लिखें
  2. parse AndroidManifest.xml, इसे संस्करण कोड पढ़ें, इसे बढ़ाएं और इसे AndroidManifest.xml पर वापस लिखें

क्या कोई और आसान या उपयुक्त समाधान है?

क्या किसी ने mentiod विकल्पों में से एक का उपयोग किया है और इसे मेरे साथ साझा कर सकता है?


76
2017-07-03 12:52


मूल


ए से पढ़ना version.properties फ़ाइल stackoverflow.com/a/21405744 - Dori


जवाब:


मैंने दूसरे विकल्प के लिए निर्णय लिया है - पार्स करने के लिए AndroidManifest.xml। यहां स्निपेट काम कर रहा है।

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 इस मामले में रिलीज बिल्ड के लिए जारी किया गया है। डीबग बिल्ड के लिए इसे बढ़ाने के लिए task.name समीकरण में परिवर्तन करता है task.whenTaskAdded वापस कॉल करें।


56
2017-07-08 11:12



एक प्रश्न, उन कोड को क्रैडल बिल्ड सिस्टम में कैसे एकीकृत करें? - Jacky
इसके अलावा, यहां कुछ हद तक क्लीनर उत्तर स्थान पर XML को संशोधित नहीं करता है, लेकिन प्रोप फ़ाइल में संस्करण संख्या रखता है: stackoverflow.com/questions/21405457/... - Paul Cantrell
यदि आप नई परियोजना संरचना का उपयोग कर रहे हैं तो फ़ाइल ("srcM mainifest.xml") फ़ाइल ("src / main / AndroidManifest.xml") में फ़ाइल को बस बदलें। - Elhanan Mishraky
अगर मैं अपने AndroidManifest.xml में वर्जनकोड सेट नहीं करता तो क्या होगा? - Igor Ganapolsky
@ जैकी अगर आपको अभी भी कोई काम नहीं मिला है, तो मेरा जवाब देखें: stackoverflow.com/a/39619297/1150251 - iStar


मैं "major.minor.patch.build" योजना का उपयोग कर, संस्करण कोड और संस्करण नाम दोनों को अद्यतन करने के लिए इस कोड का उपयोग कर रहा हूं।

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



आपके द्वारा प्राप्त नियंत्रण की मात्रा के लिए +1 - TheIcemanCometh
आप शीर्ष पर पैटर्न आयात करना भूल गए: java.util.regex आयात करें। पैटर्न - Mic92
इसे ठीक किया, धन्यवाद! - Andres
मुझे पता है कि यह थोडा पुराना है लेकिन हे, यह पूछने में चोट नहीं पहुंचा, लेकिन मैंने उपरोक्त स्निपेट का उपयोग करने की कोशिश की, मुझे यह त्रुटि मिल रही है Error:(48) Execution failed for task ':app:incrementVersionName'. > No match found कोई विचार? - acrichm
@acrichm: सुनिश्चित करें कि आप सेट हैं android:versionName="0.0.0.1" मैनिफेस्ट में मैचों की संख्या की उम्मीद नहीं की जाएगी - Jay


यह आपके द्वारा उपयोग किए जा रहे सटीक सेटअप प्रतीत नहीं होता है, लेकिन मेरे मामले में निर्माण जेनकींस द्वारा चलाया जा रहा है और मैं ऐप के संस्करण कोड के रूप में $ BUILD_NUMBER का उपयोग करना चाहता था। निम्नलिखित मेरे लिए चाल है।

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

36
2018-04-16 17:46



System.genenv क्या है? - Igor Ganapolsky
जेनकींस का उपयोग करते समय यह वास्तव में मुझे बहुत मदद करता था। आप इसका इस्तेमाल कर सकते हैं यह प्लगइन निर्माण संख्या के साथ पर्यावरण चर बनाने के लिए और इसे पढ़ें System.getenv() धीरे-धीरे में - Lamorak


मैं संस्करण कोड के लिए टाइम स्टैंप का उपयोग कर रहा हूं:

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



यह सरल और प्रतिभाशाली है। थम्स अप - Євген Гарастович


यदि आप build.gradle फ़ाइल में संस्करण कोड धारण कर रहे हैं तो अगला स्निपेट का उपयोग करें:

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



वह पैटर्न संस्करण कोड के साथ मेल नहीं खा रहा है। - lagos
क्या आप अपना build.gradle पोस्ट कर सकते हैं? - Elhanan Mishraky
मेरा build.gradle एक सामान्य बिल्ड-फाइल है। वर्जनकोड लाइन जैसा दिखता है versionCode 18 । भले ही मैं एक परीक्षक पर आपका regex भाग गया ("versionCode \d+") यह मेल नहीं खाएगा। - lagos
त्रुटि यह थी कि एक और सफेद जगह। एंड्रॉइड स्टूडियो पर दो सफेद जगहों का उपयोग करें versionCode और अंक, क्योंकि यह पाठ के साथ एक साथ संरेखित होगा versionName। - lagos
अब यह काम करना चाहिए, इसके लिए खेद है। - Elhanan Mishraky


दोनों उत्पाद स्वाद और प्रकार के प्रकार को खाते में ले जाने और प्रकट करने के लिए @ sealskej के तर्क का उपयोग करने के लिए:

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



हमें इसे कहां लिखने की ज़रूरत है ... मेरा मतलब है कि इस कोड को किस श्रेणी / फ़ाइल में जोड़ा जाना चाहिए - ChArAnJiT
यह build.gradle का हिस्सा है क्योंकि यह निर्माण प्रक्रिया का हिस्सा है - Max Ch


ग्रैडल एडवांस्ड बिल्ड वर्जन एंड्रॉइड के लिए एक प्लगइन है जो उत्पन्न करता है versionCode तथा versionName खुद ब खुद। बहुत सारे अनुकूलन हैं। यहां आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं https://github.com/moallemi/gradle-advanced-build-version


4
2018-01-12 05:24



नोट: यह अभी तक संस्करण नाम को स्वचालित रूप से बढ़ाने का समर्थन नहीं करता है - hooby3dfx


वृद्धि संस्करण कोड कार्य (पूर्णांक):

यह संस्करण कोड को बढ़ाकर काम करता है 1, उदाहरण के लिए:

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

वृद्धि संस्करणनाम कार्य (स्ट्रिंग):

चेतावनी: इसमें होना चाहिए 1 Regex के लिए अवधि

यह संस्करण नाम को बढ़ाकर काम करता है 0.01, उदाहरण के लिए: आप आसानी से संशोधित कर सकते हैं और अपनी वृद्धि बदल सकते हैं या अधिक अंक जोड़ सकते हैं।

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

पहले:

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

बाद:

<?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 की पोस्ट को जोड़ने के लिए, इस प्रकार आप अपने संस्करण कोड और संस्करण नाम दोनों को अपडेट कर सकते हैं (यहां मैं मान रहा हूं कि आपका प्रमुख और मामूली संस्करण दोनों 0 है):

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