Gradleの追加プロパティを使用したVersionCodeの自動インクリメント


121

Gradleを使用してAndroidアプリを作成しています。これまでは、Manifestファイルを使用してversionCodeを増やしていましたが、外部ファイルからversionCodeを読み取り、リリースフレーバーかデバッグフレーバーかによって、versionCodeを増やします。追加のプロパティを試しましたが、保存できません。つまり、次にビルドするときに、同じversionCodeを取得しています。どんな助けでも大歓迎です!

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

別のオプション(セットと-忘れアプローチ):medium.com/@passsy/...
サイモンB.

Gradleプラグインを選択できるワンライナー:stackoverflow.com/a/61718437/4548500
SUPERCILEX

回答:


207

外部ファイルからversionCodeを読みたい

考えられる解決策はいくつもあると思います。ここに一つあります:

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、最初のビルドの前に手動で作成する既存のファイルを想定していVERSION_CODE=8ます。

このコードは、ビルドごとにバージョンコードを単純にバンプします。フレーバーごとのバージョンコードを処理するには、この手法を拡張する必要があります。

このコードを示すバージョン管理サンプルプロジェクトを確認できます。


4
このバージョンのインクリメントを有効にするには、リリースビルドの作成中にのみどうすればよいですか?
Piotr

@Piotr:「リリースビルドで番号を増やすだけ」という意味の場合は、可能ですが、詳細はわかりません。個人的には、利用できるバージョンコードが約20億個あるため、不足することはないと想定しています。:-)
CommonsWare、2014

3
@Piotrでは、バージョンコードを個別にインクリメントするタスクを作成してから、assembleRelease.finalizedBy incrementVersion同様のことを行います。整理が済んだら、コードを投稿します。
Chris.Jenkins 2014年

カスタムタスクを使用すると、次のようなことができます./gradlew incrementVersionCode build。この方法で順次呼び出されるタスクは、いずれかのタスクが失敗するとすぐに停止します。
2016年

3
@のchris.jenkinsとしてまだ彼のコードを音信される:ここで、pはタスクとメソッドの形で上にあるgist.github.com/doridori/544c24509be236c11fd5とアンドロイドDSLの内部で使用することができますversionCode getIncrementingVersionCode()
通り

83

これが私の以前の答えの近代化です。これはGradle 4.4Android Studio 3.1.1で実行されています。

このスクリプトの機能:

  • 存在しない場合はversion.propertiesファイルを作成します(賛成票の下のPaul Cantrellの回答です。ここで、この回答が気に入った場合にアイデアを得ました)
  • ビルド、デバッグリリースごと、またはAndroid Studioの実行ボタンを押すたびに、VERSION_BUILD数が増加します。
  • リリースをアセンブルするたびに、PlayストアのAndroid バージョンコードが増加し、パッチ番号が増加します。
  • おまけ:ビルドが完了したら、APKをprojectDir/apkにコピーして、アクセスしやすくします。

このスクリプトは、AppName-v1.3.4.apkのv1.3.4 (123)ようなapkファイルのようなバージョン番号を作成します。

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

メジャーバージョン:大きな変更を行うには手動で変更する必要があります。

マイナーバージョン:大きな変更がわずかに少ない場合は、手動で変更する必要があります。

パッチバージョン:実行時に増加gradle assembleRelease

ビルドバージョン:すべてのビルドを増やします

バージョン番号:パッチバージョンと同じです。これは、新しいAPKをアップロードするたびにPlayストアが増やす必要があるバージョンコード用です。

以下の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 {
        ...
    }
}

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

最初の回答:

versionNameも自動的に増加させたい。したがって、これは私にとって完璧に機能したCommonsWareの回答への追加にすぎません。これは私のために働くものです

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

編集:

私は少し怠惰なので、バージョン管理をできるだけ自動的に機能させたいと思っています。私が欲しいのは、ビルドごとに増加するビルドバージョンを持つことですが、バージョン番号バージョン名は、リリースビルドを作成したときにのみ増加します。

これは私が過去1年間使用してきたものであり、基本はCommonsWareの回答と私の以前の回答に加えていくつかのものです。これにより、次のバージョン管理が行われます。

バージョン名:1.0.5(123) -> Major.Minor.Patch(ビルド)、MajorおよびMinorは手動で変更されます。

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

    ...
}

...

'assemble''assembleRelease'または'aR'を使用してターミナルからプロジェクトをアセンブルすると、パッチとバージョンコードが増加します。これにより、プロジェクトルートにapk / RELEASEという新しいフォルダーが作成されるため、ビルド/出力を調べる必要がありません。 / more / more / moreでAPKを見つけます。

バージョンプロパティは次のようにする必要があります。

VERSION_NUMBER=1
VERSION_BUILD=645
VERSION_PATCH=1

明らかに0から始めます。:)


2
2番目の「variant.outputs.each {output->」は、対応する「}」とともに削除できます。
redocoderは、

これにより、すべてのビルドがx86_64ネイティブコードのみになります
Chisko

@Chisko私はこのgradleコードの一部が原因だと思います。新しい質問をして、gradleコードを共有してください。何が悪いのかを把握することができます。:)
just_user 2017

1
これが根本的な原因ではないことを確認できました。謝罪いたします。
チスコ

1
@AlexanderGavriliukは、Playストアで使用されるバージョンコードで、アップロードするたびに常に増加する必要があります。メジャーバージョンまたはマイナーバージョンを増やすと、パッチ番号はおそらくリセットされます。同じパッケージ名でアプリをPlayストアにアップロードした場合、バージョン番号がリセットされることはありません。
just_user

40

CommonsWareの優れた答えの少し引き締められたバージョンは、バージョンファイルが存在しない場合に作成します。

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) ファイルがすでに存在するかどうかに関係なく、ファイルを上書きします。
ポールカントレル

?:Groovyの意味を確認する必要がありました。エルビス演算子は三項演算子の短縮です。
ダニエル

30

私はこれを行うためのいくつかのオプションを調べ、最終的に、versionCodeを自動的にインクリメントしてリビジョン管理システムにチェックインするのではなく、versionCodeに現在の時刻を使用する方が簡単であると判断しました。

次のものをに追加します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
減算

私はこれを取得しません!! アナリティクス、crashlytics、またはバージョンコードと名前のデータを提供するその他のサービスを使用しないでください。そして、あなたはこれらをこれで簡単に遊んでいますか?
Amir Ziarati、2018年

妥当なバージョン名があれば、問題ないと思います。Crashalyticsはバージョン名も提供します。
netcyrax

@emmby「1451606400」番号はどこから取得しますか?または#Entrecoの '1510351294'は無駄に計算しようとしています!
ジョセフワンブラ

18

versionCode自動的に取得する別の方法はversionCode、チェックアウトされたgitブランチのコミット数を設定することです。次の目的を達成します。

  1. versionCode任意のマシン(Continuous Integrationおよび/またはContinuous Deploymentサーバーを含む)で一貫して自動的に生成されます。
  2. このアプリversionCodeはGooglePlayに送信できます。
  3. リポジトリ外のファイルには依存しません。
  4. リポジトリに何もプッシュしません
  5. 必要に応じて、手動で上書きできます

上記の目的を達成するためのgradle-gitライブラリの使用。以下のコードを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
}

注:この方法が機能するためには、同じブランチからのみGoogle Playストアにデプロイすることをお勧めします(例master)。


本質的には優れたソリューションですが、2つのgit行で何が起こっているかに応じて、ビルド時間が大幅に遅くなると想像できます。何か経験はありますか?
2017年

1
この手順を無効にしても、パフォーマンスは向上しません。1年以上ローカルおよびビルドマシンでメソッドを使用しており、パフォーマンスはまったく問題になりません。パフォーマンスの問題に気づいたら、知らせてください!
C0D3LIC1OU5 2017年

あなたの解決策はエレガントですが、予期せぬ厄介な驚きをもたらす可能性があります。versionCodesが常に前のリリースよりも大きいことが重要です。コミット数が50のブランチが1つあり、さらに新しいブランチを作成したが、コミット数が40しかない場合は、いくつかのマージされた機能からのコミット数を押しつぶしている可能性があります。あなたのコミット履歴が常に増分コミットの線形ストリームであるとは限らない理由はたくさんあります。
JHH 2017年

@JHHこれらの結果は予想外ではありません。ノートで述べたように、この方法は同じブランチからデプロイする場合に最適に機能します。
C0D3LIC1OU5 2017年


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
}

2022年1月1日以降、formattedDate = date.format( 'yyMMddHHmm')が整数の容量を超えています


1
その人は自動インクリメントのビルド番号を求めていました
peter_pilgrim

6
@peter_pilgrimカロはOPです。
マシューは

私はこれがエレガントなソリューションだと思います、それは消えるか、消えないかもしれない、または常にgitに現れるファイルに依存しません。また、少なくとも次の12年間の各ビルドを一意に識別するのに役立ちます。
うまくいけば

developer.android.com:"Warningを引用:versionCodeが2100000000. "だからであるために最大の価値のGoogle Playが可能に、カットオフは、実際には2021年である
THS

int制限の修正:分を省略し、日付形式「yyMMddHH」を使用します。バージョンコードには少なくとも時間が含まれます。
Pointer Null

10

リリースバージョンでのみversionCodeをインクリメントするには、次のようにします。

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


むしろそれをタスク内に置き、generateReleaseBuildConfigがそのタスクに依存するようにします。
ラゴス

versionName "1.0。" + getSvnRevision()はエラーを引き起こします。getSvnRevision()メソッドはどこを参照していますか?versionName "1.0。" +コード(バージョン名はバージョンコードとともに増加します)にしないでください。
ポートフォリオビルダー

1
@ portfoliobuilder、getSvnRevision()をコードに置き換える
NickUnuchek

4

ファイルを作成する 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


ありがとう。そして、なぜversionCodeをversionNameに挿入したのですか?2位でも。
CoolMind、2016年

しかし、たとえば1.71.3.76のようになります。1.3.76がバージョンコードから分離されている方がいいと思います。
CoolMind、2016年

はい 。「$ {_ major} .. $ {_ minor}。$ {_ patch}。$ {_ versionCode}」に変更するか、パッチを削除できます
Ahmad Aghazadeh

if(_major == 99)はif(_minor == 99)である必要がありますか?
Anirudh Bagri

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
}

歌ったAPKを作成した後:

android:versionName="5.1.6"

注:versionNameが私と異なる場合は、正規表現を変更してパーツロジック抽出する必要があります。


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への謝辞(承認された回答)Paul Cantrell(存在しない場合はファイルを作成)ahmad aghazadeh(バージョン名とコード)

だから私は彼らの考えをすべてまとめてこれを思いついた。これは、最初の投稿が要求したものに対するドラッグアンドドロップソリューションです。

リリースステータスに応じて、versionCodeとversionNameが自動的に更新されます。もちろん、必要に応じて変数を移動できます。

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 Task Graphを使用して、ビルドタイプを確認/切り替えることができます。

基本的な考え方は、ビルドごとにversionCodeを増分することです。各ビルドで、version.propertiesファイルに保存されているカウンター。新しいAPKがビルドされるたびに更新され、build.gradleファイルのversionCode文字列がこの増分されたカウンター値に置き換えられます。

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

上記のスクリプトをメインモジュールのbuild.gradleファイル内に配置します。

参照ウェブサイト: http : //devdeeds.com/auto-increment-build-number-using-gradle-in-android/

ありがとうございます。それでは、お元気で!


0

最初にコメントされたコードは、各「プロジェクトの再構築」中に数値をインクリメントし、その値を「バージョンプロパティ」ファイルに保存します。

2番目のコメント付きコードは、「APKのビルド」中にAPKファイルの新しいバージョン名を生成します。

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

MacのGradle 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!")
}

コードは@just_userからの ものです


0

私が本当に気に入っている2つの解決策があります。1つはPlayストアに依存し、もう1つはGitに依存します。

Playストアを使用すると、アップロードされた利用可能な最高のバージョンコードを確認することで、バージョンコードを増やすことができます。このソリューションの利点は、バージョンコードがPlayストアにあるものより常に1つ高いため、APKアップロードが失敗しないことです。欠点は、Playストアの外でAPKを配布することがより困難になることです。クイックスタートガイドに従ってプラグインにバージョンコードを自動的解決するように指示することで、Gradle Play Publisherを使用してこれを設定できます

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

android {
    ...
}

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

Gitを使用すると、リポジトリのコミットとタグの数に基づいてバージョンコードを増やすことができます。ここでの利点は、出力が再現可能であり、リポジトリ外の何にも依存しないことです。欠点は、バージョンコードを変更するために新しいコミットまたはタグを作成する必要があることです。これは、Version Master Gradleプラグインを追加することで設定できます

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.