car*_*vaq 112 android gradle build.gradle android-gradle-plugin
我正在用gradle构建一个Android应用程序.到目前为止,我使用Manifest文件来增加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'
}
Com*_*are 191
我想从外部文件中读取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.
这段代码简单地碰到了每个构建版本的代码 - 您需要扩展该技术来处理每个版本的代码.
您可以看到演示此代码的Versioning示例项目.
jus*_*ser 74
这是我之前的答案的现代化,可以在下面看到.这个与Gradle 4.4和Android Studio 3.1.1一起运行.
这个脚本做了什么:
projectDir/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
构建版本:增加每个构建
版本号:与补丁版本相同,这适用于Play Store需要为每个新的apk上传增加的版本代码.
只需更改下面标有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
}
编辑:
因为我有点懒,我希望我的版本控制尽可能自动地工作.我想要的是拥有随每次构建而增加的构建版本,而版本号和版本名称仅在我进行版本构建时增加.
这是我过去一年所使用的,基础知识来自CommonsWare的答案和我之前的答案,以及更多.这导致以下版本控制:
版本名称:1.0.5(123) - > Major.Minor.Patch(Build),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的新文件夹,则增加Patch和versionCode ,这样您就不必查看构建/输出/更多/更多/更多来找到你的apk.
您的版本属性需要如下所示:
VERSION_NUMBER=1
VERSION_BUILD=645
VERSION_PATCH=1
显然从0开始.:)
Pau*_*ell 36
如果版本文件不存在,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
}
emm*_*mby 26
我看了几个选项来做到这一点,并最终决定只使用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年的版本,则可能需要使用其他解决方案.
C0D*_*OU5 16
另一种versionCode自动获取方式是设置versionCode为已签出git分支中的提交数.它实现了以下目标:
versionCode在任何计算机(包括Continuous Integration和/或Continuous Deployment服务器)上自动且一致地生成.versionCode可以提交给GooglePlay.使用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).
moa*_*emi 12
最近我正在研究Android的gradle插件,它可以自动生成versionCode和versionName.有很多定制.在这里你可以找到更多关于它的信息 https://github.com/moallemi/gradle-advanced-build-version
car*_*vaq 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月1日开始,formattedDate = date.format('yyMMddHHmm')超过了Integers的容量
Nic*_*hek 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
在里面创建新文件 <yourProjectLocation>/app/version.properties
MAJOR=0
MINOR=0
PATCH=1
VERSION_CODE=1
在build.gradle(模块文件)中添加以下几行:
android {
    // other properties....
    // add following lines...
    def _versionCode=0
    def _major=0
    def _minor=0
    def _patch=0
    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==100) {
            _patch=0
            _minor=_minor+1
        }
        if(_minor == 10){
            _minor = 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}.${_minor}.${_patch}(${_versionCode})"
    defaultConfig {
        // other properties...
        // change only these two lines
        versionCode _versionCode
        versionName _versionName
    }
}
输出 : 0.0.1(1)
| 归档时间: | 
 | 
| 查看次数: | 81362 次 | 
| 最近记录: |