গ্রেড অতিরিক্ত বৈশিষ্ট্য সহ স্বতঃআগ্রহ সংস্করণকোড


121

আমি গ্রেড সহ একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করছি। এখনও অবধি আমি ভার্সনকোড বাড়ানোর জন্য ম্যানিফেস্ট ফাইলটি ব্যবহার করেছি, তবে আমি কোনও বাহ্যিক ফাইল থেকে সংস্করণকোডটি পড়তে চাই এবং এটি নির্ভর করে যদি এটি প্রকাশের স্বাদ বা ডিবাগ ফ্লেভারটি সংস্করণকোড বৃদ্ধি করে। আমি অতিরিক্ত বৈশিষ্ট্য চেষ্টা করেছি, তবে আপনি সেগুলি সংরক্ষণ করতে পারবেন না, যার অর্থ পরবর্তী সময় আমি এটি তৈরি করব আমি একই সংস্করণকোড পাচ্ছি। যে কোন সাহায্য অনেক বেশি প্রশংসিত হবে!

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

: আমার উত্তর এখানে দেখুন stackoverflow.com/a/33637600/348189
TacB0sS

আরেকটি বিকল্প (একটি সেট-এবং-ভুলে যাওয়া পদ্ধতির): মাঝারি.com
সাইমন বি।

Gradle আপনার পছন্দ সঙ্গে এক-লাইনের: plugins stackoverflow.com/a/61718437/4548500
SUPERCILEX

উত্তর:


206

আমি একটি বাহ্যিক ফাইল থেকে সংস্করণ কোড পড়তে চাই

আমি নিশ্চিত যে কয়েকটি সম্ভাব্য সমাধান রয়েছে; এখানে একটি:

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
}

এই কোডটি একটি বিদ্যমান version.propertiesফাইলের প্রত্যাশা করে , যা আপনি আগে তৈরি হওয়ার আগে হাতে তৈরি করেছিলেন wouldVERSION_CODE=8

এই কোডটি প্রতিটি বিল্ডের সহজভাবে সংস্করণ কোডটিকে আটকায় - আপনার প্রতি-গন্ধ সংস্করণ কোডটি হ্যান্ডেল করার জন্য আপনার কৌশলটি বাড়ানো দরকার।

আপনি সংস্করণ নমুনা প্রকল্পটি দেখতে পাবেন যা এই কোডটি প্রদর্শন করে।


4
কেবলমাত্র রিলিজ বিল্ড করার সময় এই সংস্করণটিকে কীভাবে বাড়ানো যায়?
পাইওটার

@ পাইওটার: আপনি যদি "রিলিজ বিল্ডে কেবলমাত্র বৃদ্ধি" অর্থ করেন তবে এটি সম্ভব হওয়া উচিত, যদিও আমি বিশদটি জানি না। ব্যক্তিগতভাবে, যেহেতু 2 বিলিয়ন ডলার সংস্করণ কোড উপলব্ধ রয়েছে, তাই আমি ধরে নিচ্ছি যে আমি শেষ হয়ে যাব না। :-)
CommonsWare

3
@ পাইওটর আপনি একটি কাজ তৈরি করবেন যা ভার্সন কোডটি আলাদাভাবে বাড়িয়ে তোলে তারপরে এমন কিছু assembleRelease.finalizedBy incrementVersionবা অনুরূপ কিছু করবে। আমি আমার কোডটি একবার পরিষ্কার করে দেওয়ার পরে পোস্ট করব।
ক্রিস। জেনকিন্স

একটি কাস্টম টাস্ক ব্যবহার করে আপনি ঠিক এর মতো কিছু করতে পারেন ./gradlew incrementVersionCode build। ক্রমানুসারে এইভাবে ডাকা টাস্কগুলির কোনও কাজ ব্যর্থ হওয়ার সাথে সাথে বন্ধ হয়ে যাবে।
ডুরি

3
@ ক্রিস.জেনকিন্স এখনও তার কোডটি গোপন করছে: p এখানে উপরের কাজটি এবং পদ্ধতিতে gist.github.com/doridori/544c24509be236c11fd5 যা অ্যান্ড্রয়েড ডিএসএল-এর সাথে ব্যবহার করা যেতে পারেversionCode getIncrementingVersionCode()
ডোরি

83

এখানে আমার আগের উত্তরটির একটি আধুনিকীকরণ আসে যা নীচে দেখা যাবে। এই একটি গ্রেডেল ৪.৪ এবং অ্যান্ড্রয়েড স্টুডিও ৩.১.১ নিয়ে চলছে ।

এই লিপিটি কী করে:

  • একটি তৈরি করে version.properties ফাইল যদি কেউ নেই (নীচে ভোট পল Cantrell এর উত্তর, যা আমি কোথায় এই উত্তরটি মত যদি তোমার কাছ থেকে ধারণা পেয়েছেন) বিদ্যমান
  • প্রতিটি বিল্ড, ডিবাগ রিলিজের জন্য বা আপনি যে কোনও সময় অ্যান্ড্রয়েড স্টুডিওতে রান বোতাম টিপুন VERSION_BUILD সংখ্যা বৃদ্ধি পায়।
  • প্রতিবার যখন আপনি কোনও রিলিজ একত্রিত করেন ততবার প্লে স্টোরের জন্য আপনার অ্যান্ড্রয়েড সংস্করণকোড বৃদ্ধি পায় এবং আপনার প্যাচ সংখ্যা বাড়বে।
  • বোনাস: বিল্ডটি শেষ হয়ে যাওয়ার পরে projectDir/apkএটি আরও অ্যাক্সেসযোগ্য করার জন্য আপনার APK কে অনুলিপি করে ।

এই স্ক্রিপ্টটি এমন একটি সংস্করণ নম্বর তৈরি করবে যা দেখে মনে হবে v1.3.4 (123)এবং AppName-v1.3.4.apk এর মতো একটি APK ফাইল তৈরি করবে

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

প্রধান সংস্করণ: বড় পরিবর্তনের জন্য ম্যানুয়ালি পরিবর্তন করতে হবে।

গৌণ সংস্করণ: কিছুটা কম বড় পরিবর্তনের জন্য ম্যানুয়ালি পরিবর্তন করতে হবে।

প্যাচ সংস্করণ: চলমান অবস্থায় বৃদ্ধি পায়gradle assembleRelease

বিল্ড সংস্করণ: প্রতিটি বিল্ড বৃদ্ধি করে

সংস্করণ নম্বর: প্যাচ সংস্করণ হিসাবে একই , এটি প্রতিটি সংস্করণ কোডের জন্য যা প্লে স্টোরটি প্রতিটি নতুন এপিপি আপলোডের জন্য বাড়ানো দরকার।

কেবল নীচে 1 - 3 লেবেলযুক্ত মন্তব্যে সামগ্রী পরিবর্তন করুন এবং স্ক্রিপ্টটি বাকী কাজটি করা উচিত। :)

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

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

প্রাথমিক উত্তর:

আমি চাই সংস্করণ নামটিও স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে। সুতরাং এটি আমার পক্ষে পুরোপুরি কাজ করেছিল কমন্সওয়্যারের উত্তরের কেবলমাত্র একটি সংযোজন। এটি আমার জন্য কাজ করে কি না

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

সম্পাদনা করুন:

আমি যেমন কিছুটা অলস, আমি চাই আমার সংস্করণটি যথাসম্ভব স্বয়ংক্রিয়ভাবে কাজ করা হোক। আমি যা চাই তা হ'ল একটি বিল্ড সংস্করণ যা প্রতিটি বিল্ডের সাথে বৃদ্ধি পায়, যখন সংস্করণ নম্বর এবং সংস্করণ নাম কেবল তখনই বাড়ানো হয় যখন আমি একটি রিলিজ বিল্ড তৈরি করি।

এটিই আমি গত এক বছর ধরে ব্যবহার করছি, বেসিকগুলি কমন্সওয়্যারের উত্তর এবং আমার আগের উত্তর, আরও কিছু থেকে from নিম্নলিখিত সংস্করণে এর ফলাফল:

সংস্করণ নাম: 1.0.5 (123) -> মেজর.মিনোর.প্যাচ (বিল্ড), মেজর এবং মাইনর ম্যানুয়ালি পরিবর্তন করা হয়েছে।

বিল্ড.gradle এ:

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

    ...
}

...

প্যাচ এবং versionCode যদি আপনার সাথে টার্মিনাল মাধ্যমে আপনার প্রকল্প জড় বেড়ে যায় 'জড়' , 'assembleRelease' বা 'AR' যা আপনার প্রকল্পের রুট APK নামক / রিলিজে একটি নতুন ফোল্ডার তৈরি করে যাতে আপনি বিল্ড / আউটপুট মাধ্যমে সন্ধান করতে হবে না / আরও / আরও / আপনার এপিকে খুঁজতে আরও

আপনার সংস্করণ বৈশিষ্ট্যগুলির মতো দেখতে এটির প্রয়োজন হবে:

VERSION_NUMBER=1
VERSION_BUILD=645
VERSION_PATCH=1

স্পষ্টতই 0 দিয়ে শুরু করুন


2
দ্বিতীয় 'ভেরিয়েন্ট.আউটপুটস.ইচ {আউটপুট ->' সংশ্লিষ্ট '}' দিয়ে মুছে ফেলা যায়।
redocoder

এটি আমার সমস্ত বিল্ডগুলি কেবল x86_64 নেটিভ কোডে পরিণত করছে
চিস্কো

@ চিস্কো আমি সন্দেহ করি গ্রেড কোডের এই অংশটিই এর কারণ। একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং আপনার গ্রেড কোডটি ভাগ করুন এবং আমরা কী ভুল তা বের করার চেষ্টা করতে পারি। :)
just_user

1
আমি এখন নিশ্চিত করতে পারি যে এটির মূল কারণ ছিল না। আমার ক্ষমা।
চিস্কো

1
@ আলেকজান্ডারগরিলিউক এটির প্লে স্টোর দ্বারা ব্যবহৃত সংস্করণ কোড যা প্রতিটি আপলোডের জন্য অবিচ্ছিন্নভাবে বাড়ানো দরকার। আপনি বড় বা ছোট সংস্করণটি বাড়িয়ে দিলে প্যাচ নম্বরটি সম্ভবত পুনরায় সেট হয়ে যাবে। সংস্করণ নম্বরটি কখনই না হওয়া উচিত, আপনি একই প্যাকেজের নামের সাথে প্লে স্টোরটিতে অ্যাপ্লিকেশন আপলোড করলে কখনও পুনরায় সেট করা যায় না।
just_user

40

কমন্সওয়্যারের দুর্দান্ত উত্তরের একটি সামান্য শক্তিশালী সংস্করণ যদি উপস্থিত না থাকে তবে সংস্করণ ফাইলটি তৈরি করে:

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
}

সংস্করণ ফাইলটি উপস্থিত না থাকলে তৈরি করার অংশটি কোথায়?
পোর্টফোলিওবিল্ডার

4
if(versionPropsFile.exists())ফাইলটি না থাকলে এটি বিস্ফোরিত না হওয়ার বিষয়টি নিশ্চিত করে। versionProps.store(versionPropsFile.newWriter(), null) ফাইলটি ইতিমধ্যে বিদ্যমান কিনা তা বিবেচনা করে ওভাররাইট করে es
পল কেন্ট্রেল

?:গ্রোভির অর্থ কী তা পরীক্ষা করে দেখতে হয়েছিল। এলভিস অপারেটর তিন অপারেটর একটি সংক্ষেপিত হয়।
ড্যানিয়েল

30

আমি এটি করার জন্য কয়েকটি বিকল্পের দিকে তাকিয়েছিলাম এবং শেষ পর্যন্ত সিদ্ধান্ত নিয়েছিলাম যে সংস্করণকোডের জন্য স্বয়ংক্রিয়ভাবে সংস্করণকোড বাড়ানোর চেষ্টা করার পরিবর্তে এবং আমার পুনর্বিবেচনা নিয়ন্ত্রণ সিস্টেমটি পরীক্ষা করে দেখার পরিবর্তে বর্তমান সময়টি ব্যবহার করা সহজ।

আপনার সাথে নিম্নলিখিতগুলি যুক্ত করুন 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
    }
}

তবে, যদি আপনি 2696 বছরের বেশি বিল্ড আপলোডের প্রত্যাশা করেন, তবে আপনি একটি আলাদা সমাধান ব্যবহার করতে পারেন।


2
আপনি যদি এখন এটি পড়ছেন এবং একটি নতুন অ্যাপ্লিকেশন দিয়ে শুরু করছেন তবে আপনি বিয়োগ করতে পারেন 1510351294:))
এন্ট্রেকো

আমি এটা পেতে পারি না !! আপনি কি বিশ্লেষণ বা ক্র্যাশলিটিক্স বা অন্য কোনও পরিষেবা ব্যবহার করেন না যা সংস্করণ কোড এবং নাম সহ ডেটা দেয়? এবং আপনি এগুলি সহজেই খেলছেন?
আমির জিয়ারতী

আপনার যদি যুক্তিসঙ্গত সংস্করণের নাম থাকে তবে আমার মনে হয় এটি ঠিক আছে। ক্র্যাশলাইটিক্স সংস্করণটির নামও সরবরাহ করে।
নেটসিরা্যাক্স

@ এমএমবি আপনি '1451606400' কোথা থেকে পাবেন? বা # 1510351294 # ইন্টেরকো থেকে আমি নিরর্থক গণনা করার চেষ্টা করছি!
জোসেফ ওয়াম্বুরা

18

versionCodeস্বয়ংক্রিয়ভাবে পাওয়ার আরেকটি উপায় হ'ল versionCodeচেক আউট gitশাখায় কমিটের সংখ্যা নির্ধারণ করা । এটি নিম্নলিখিত লক্ষ্যগুলি সম্পাদন করে:

  1. versionCodeযে কোনও মেশিনে ( Continuous Integrationএবং এবং / অথবা Continuous Deploymentসার্ভার সহ ) স্বয়ংক্রিয়ভাবে এবং ধারাবাহিকভাবে উত্পন্ন হয় ।
  2. এটি সহ অ্যাপ্লিকেশন versionCodeগুগলপ্লেতে জমা দেওয়ার যোগ্য।
  3. রেপোর বাইরে কোনও ফাইলের উপর নির্ভর করে না।
  4. রেপোতে কোনও কিছুই চাপ দেয় না
  5. প্রয়োজনে ম্যানুয়ালি ওভাররাইড করা যেতে পারে

উপরের উদ্দেশ্যগুলি সম্পাদন করতে গ্রেড-গিট লাইব্রেরি ব্যবহার করা । আপনার build.gradleফাইল /appডিরেক্টরিতে নীচে কোড যুক্ত করুন :

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
}

দ্রষ্টব্য: এই পদ্ধতির কাজ করার জন্য, কেবল একই শাখা (উদাঃ master) থেকে গুগল প্লে স্টোরে স্থাপন করা ভাল ।


সংক্ষেপে সমাধানের সময়, আমি কল্পনা করতে পারি যে এটি 2 গিট লাইনে ঠিক কী ঘটছে তার উপর নির্ভর করে এটি বিল্ড সময়কে তীব্রভাবে কমিয়ে দেবে। কোন অভিজ্ঞতা?
আশাকরি

1
এই পদক্ষেপটি অক্ষম করা থাকলে আমি কোনও কার্যকারিতা উন্নতি লক্ষ্য করি না। স্থানীয়ভাবে এবং আমাদের বিল্ড মেশিনগুলিতে এক বছরেরও বেশি সময় ধরে পদ্ধতি ব্যবহার করা হচ্ছে এবং পারফরম্যান্স কোনও সমস্যাই হয়নি। আপনি যদি কোনও পারফরম্যান্স সমস্যা লক্ষ্য করেন তবে আমাকে জানান!
C0D3LIC1OU5

যদিও আপনার সমাধানটি মার্জিত, এটি কিছু বাজে অপ্রত্যাশিত চমক দিতে পারে। এটি সমালোচনা যে সংস্করণকোডগুলি সর্বশেষ প্রকাশের চেয়ে সর্বদা বড়। আপনার যদি 50 টি কমিটের সাথে একটি শাখা থাকে এবং আপনি তখন আরও একটি শাখা তৈরি করেন যা নতুন তবে কেবল 40 টি কমিট রয়েছে, সম্ভবত কিছু সংযুক্ত বৈশিষ্ট্য থেকে বহু সংখ্যক কমিটগুলি স্কোয়াশ করার কারণে। আমি প্রচুর কারণ দেখতে পাচ্ছি যে আপনার প্রতিশ্রুতিবদ্ধ ইতিহাস সর্বদা বর্ধিত কমিটের লিনিয়ার স্ট্রিম না হয়।
জেএইচ এইচ

@JHH এই ফলাফলগুলি অপ্রত্যাশিত নয়। আমি যেমন একটি নোটে উল্লেখ করেছি, একই শাখা থেকে মোতায়েন করার সময় এই পদ্ধতিটি সবচেয়ে ভাল কাজ করে।
C0D3LIC1OU5

13

সম্প্রতি আমি অ্যান্ড্রয়েডের জন্য গ্রেড প্লাগইনে কাজ করছি যা উত্পন্ন করে করছিলাম যা স্বয়ংক্রিয়ভাবে সংস্করণ কোড এবং সংস্করণনাম তৈরি করে। কাস্টমাইজেশন প্রচুর আছে। এখানে আপনি এটি সম্পর্কে আরও তথ্য পেতে পারেন https://github.com/moallemi/gradle-advanced-build-version


এটি একটি দুর্দান্ত প্লাগইন! ভাগ করে নেওয়ার জন্য ধন্যবাদ
Cory রবিনসন

10

আরেকটি বিকল্প, বৃদ্ধিশীল জন্য versionCodeএবং versionNameএকটি টাইম স্ট্যাম্প ব্যবহার করছে।

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 2022 ফর্ম্যাটড তারিখ = তারিখ.ফর্ম্যাট ('yyMMddHHmm') পূর্ণসংখ্যার সক্ষমতা ছাড়িয়ে গেছে


1
ব্যক্তিটি একটি অটো-ইনক্রিমেন্ট বিল্ড নম্বর চেয়েছিল
পিটার_পিলগ্রিম

6
@ পেটার_পিলগ্রিম ক্যারো ওপেন OP
ম্যাথু

আমি মনে করি এটি একটি মার্জিত সমাধান, এটি এমন ফাইলগুলিতে নির্ভর করে না যা মুছে যায় বা না পারে বা এটি ক্রমাগত গিট হিসাবে প্রদর্শিত হবে। এটি অন্ততপক্ষে 22 বছর পরের জন্য প্রতিটি বিল্ডকে অনন্যভাবে সনাক্ত করতে আপনাকে সহায়তা করে।
আশাকরি

উদ্ধৃত developer.android.com:"Warning: সর্বাধিক মান Google প্লে versionCode জন্য করতে পারবেন 2100000000. "তাহলে, কর্তক আসলে 2021 হয়
ths

অন্তঃসীমাটির জন্য স্থির করুন: মিনিট বাদ দিন এবং তারিখ বিন্যাস 'yyMMddHH' ব্যবহার করুন, সংস্করণ কোডটিতে কমপক্ষে কয়েক ঘন্টা থাকবে।
পয়েন্টার নুল

10

কেবলমাত্র সংস্করণে সংস্করণ কোড বাড়ানোর জন্য এটি করুন:

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
    }

একটি বিদ্যমান প্রত্যাশা c://YourProject/app/version.properties ফাইল , যা আপনি প্রথম বিল্ড করার আগে হাতে হাতে তৈরি করবেনVERSION_CODE=8

ফাইল version.properties:

VERSION_CODE=8


বরং এটিকে কোনও কার্যের ভিতরে রাখুন এবং জেনারেট করুন রিলেজবিল্ডফনফিগ সেই কাজের উপর নির্ভর করে।
লেগোস 13

versionName "1.0।" + getSvnRevision () একটি ত্রুটির কারণ ঘটায়। GetSvnRevision () পদ্ধতিটি কোথায় রেফারেন্স করছে? আপনি কি নিশ্চিত যে এটির সংস্করণ নাম "1.0" হওয়া উচিত নয়? + কোড (সংস্করণটির নামটি আপনার সংস্করণ কোডের সাথে বাড়বে)?
পোর্টফোলিওবিল্ডার

1
@ পোর্টফোলিওবিল্ডার, getSvnRivision () এর কোডে প্রতিস্থাপন করুন
নিকউনুখেখ

3

ফাইল তৈরি করুন version.properties

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

পরিবর্তন 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
}

}

আউটপুট: 1.1.3.6


ধন্যবাদ। এবং কেন আপনি সংস্করণনোডে একটি সংস্করণ কোড প্রবেশ করিয়েছেন? এমনকি দ্বিতীয় অবস্থানেও রয়েছে।
কুলমাইন্ড

তবে এটি উদাহরণস্বরূপ, 1.71.3.76 এর মতো দেখাবে। আমি মনে করি, এটি সংস্করণ কোড থেকে পৃথক করে 1.3.76 ভাল better
কুলমাইন্ড

হ্যাঁ . আপনি "$ {_ মেজর} .. $ {_ গৌণ}। $ {_ প্যাচ}। $ {_ সংস্করণকোড}" বা প্যাচটি সরিয়ে ফেলতে পারেন
আহমাদ আগজাদেহ

(_মজর == 99) যদি (_মিনোর == 99) হওয়া উচিত ??
অনিরুদ্ধ বাগরী

2

নির্ধারণ versionName মধ্যেAndroidManifest.xml

android:versionName="5.1.5"

অ্যাপ্লিকেশন স্তরের ভিতরে android{...}ব্লক build.gradle:

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

অ্যাপ্লিকেশন স্তরের বাইরে android{...}ব্লক 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
}

সিজেড এপিএল তৈরির পরে:

android:versionName="5.1.6"

দ্রষ্টব্য: যদি আপনার versionName আমার থেকে আলাদা, আপনি পরিবর্তনের প্রয়োজন Regex এবং নির্যাস অংশের যুক্তিবিজ্ঞান


1

উপরে প্রদর্শিত উদাহরণগুলি বিভিন্ন কারণে কাজ করে না

এই নিবন্ধ থেকে ধারণাগুলির উপর ভিত্তি করে আমার প্রস্তুত-থেকে-ব্যবহারের বৈকল্পিক:

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 ক্রেডিট (স্বীকৃত উত্তর) পল কেন্ট্রেল (ফাইল উপস্থিত না থাকলে এটি তৈরি করুন) আহমাদ আগজাদেহ (সংস্করণের নাম এবং কোড)

তাই আমি তাদের সমস্ত ধারণাগুলি একসাথে ছড়িয়ে দিয়েছি এবং এটি নিয়ে এসেছি। এটি প্রথম পোস্টটি যা জিজ্ঞাসা করেছিল ঠিক তেমনই ড্রাগ এবং ড্রপ সমাধান।

এটি স্বয়ংক্রিয়ভাবে সংস্করণ কোড এবং সংস্করণনাম প্রকাশের স্থিতি অনুসারে আপডেট করবে। অবশ্যই আপনি আপনার প্রয়োজনগুলি স্যুট করতে ভেরিয়েবলগুলি চারপাশে স্থানান্তর করতে পারেন।

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 ফাইলের সংস্করণকোড স্ট্রিং প্রতিস্থাপন করা হবে।

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

উপরের স্ক্রিপ্টটি আপনার মডিউলটির বিল্ড.gradle ফাইলের মধ্যে রাখুন।

রেফারেন্স ওয়েবসাইট: http://devdeeds.com/auto-increment-build-number- using-gradle-in-android/

ধন্যবাদ & শুভেচ্ছা!


0

প্রথম মন্তব্য কোডটি প্রতিটি "পুনর্নির্মাণ প্রকল্প" চলাকালীন সংখ্যা বৃদ্ধি করবে এবং "সংস্করণ সম্পত্তি" ফাইলটিতে মানটি সংরক্ষণ করবে।

দ্বিতীয় মন্তব্যযুক্ত কোডটি "বিল্ড এপিএস" এর সময় এপিএল ফাইলের নতুন সংস্করণ নাম উত্পন্ন করবে।

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

আপনি কি পরিবর্তন করেছেন তা দয়া করে কিছু পাঠ্য যুক্ত করুন। এবং কেন
ম্যাথু কেরিয়ান

0

ম্যাক আইভেলের গ্রেডেল 5.1.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.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!")
}

কোডটি হ'ল @ ایڈ_ইউসার এর থেকে একটি


0

আমার দুটি পছন্দ আছে যা আমি সত্যিই পছন্দ করি। প্রথমটি প্লে স্টোর এবং অন্যটি গিটের উপর নির্ভর করে।

প্লে স্টোর ব্যবহার করে আপনি সর্বাধিক উপলব্ধ আপলোড হওয়া সংস্করণ কোডটি দেখে সংস্করণ কোডটি বাড়িয়ে নিতে পারেন । এই সমাধানটির সুবিধাটি হ'ল একটি APK আপলোড কখনই ব্যর্থ হয় না কারণ প্লে স্টোরের যা কিছু তার চেয়ে আপনার সংস্করণ কোডটি সর্বদা এক থেকে বেশি। খারাপ দিকটি হ'ল প্লে স্টোরের বাইরে আপনার APK বন্টন আরও কঠিন হয়ে পড়ে। আপনি কুইকটি স্টার্ট গাইড অনুসরণ করে এবং প্লাগইনটিকে সংস্করণ কোডগুলি স্বয়ংক্রিয়ভাবে সমাধান করার জন্য বলে গ্র্যাডেল প্লে প্রকাশক ব্যবহার করে এটি সেট আপ করতে পারেন :

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

android {
    ...
}

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

গিট ব্যবহার করে, আপনার ভাণ্ডারটিতে কতটি কমিট এবং ট্যাগ রয়েছে তার উপর ভিত্তি করে আপনি সংস্করণ কোডটি বৃদ্ধি করতে পারেন। এখানে সুবিধাটি হ'ল আপনার আউটপুট পুনরায় উত্পাদনযোগ্য এবং আপনার রেপোর বাইরের কোনও কিছুর উপর নির্ভর করে না। খারাপ দিকটি হ'ল আপনার সংস্করণ কোডটি ফাটিয়ে দেওয়ার জন্য আপনাকে একটি নতুন প্রতিশ্রুতি বা ট্যাগ করতে হবে। আপনি এটি সংস্করণ মাস্টার গ্রেডল প্লাগইন যোগ করে সেট আপ করতে পারেন :

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

android {
    ...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.