繁体   English   中英

仅在生成签名的APK上自动递增版本代码

[英]Auto increment version code on Generate signed APK only

我已经成功增加了版本代码。 但是我只想在从菜单构建->生成签名的APK生成签名的APK时增加它。 以下是我的gradle代码。

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
def versionPropsFile = file('version.properties')

if (versionPropsFile.canRead()) {
    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    def code = versionProps['build.version'].toInteger() + 1

    versionProps['build.version']=code.toString()
    versionProps.store(versionPropsFile.newWriter(), null)

    defaultConfig {
        applicationId "com.test"
        multiDexEnabled true
        versionCode code
        versionName "1.1"
        minSdkVersion 18
        targetSdkVersion 23
    }
}
else {
    throw new GradleException("Could not read version.properties!")
}

buildTypes {
    release {
        //minifyEnabled false
        //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
    debug {
        debuggable true
    }
}
dexOptions {
    incremental true
    javaMaxHeapSize "4g"
    preDexLibraries = false
}}

我的version.properties文件包含以下信息:次要= 7分支= 4主要= 10 build.version = 73

我可以通过将我的代码挂接到assembleRelease gradle任务上来做到这一点。 从Tim的博客获得了帮助。 以下是代码-

apply plugin: 'com.android.application' 
android {
         compileSdkVersion 23
         buildToolsVersion "23.0.3"

         def Properties versionProps = loadVersionFile()
         defaultConfig {
                      applicationId "com.test"
                      multiDexEnabled true
                      versionCode getCode(versionProps)
                      versionName getName(versionProps)
                      minSdkVersion 18
                      targetSdkVersion 23
        }
        signingConfigs {
                       release {
                                storeFile file(".../keys.jks")
                                storePassword "..."
                                keyAlias "..."
                                keyPassword "..."
                       }
       }


       buildTypes {
                   release {
                            signingConfig signingConfigs.release

                           //minifyEnabled false
                           //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
                  }
                  debug {
                            debuggable true
                  }
       }
       dexOptions {
            ...
       }
  }

def loadVersionFile() {
                    def versionPropsFile = file('version.properties')
                    def Properties versionProps
                    if (versionPropsFile.canRead()) {

                    versionProps = new Properties()
                    versionProps.load(new FileInputStream(versionPropsFile))

                    } else {
                          throw new GradleException("Could not read                                                 version.properties!")
                    }
                  return versionProps}

def getCode(Properties versionProps) {
         return versionProps['build.version'].toInteger()}

def getName(Properties versionProps) {
         return  versionProps['product.version']}


assembleRelease << {
         def versionPropsFile = file('version.properties')
         def code
         def Properties versionProps
         if (versionPropsFile.canRead()) {
                versionProps = new Properties()
                versionProps.load(new FileInputStream(versionPropsFile))
                code = versionProps['build.version'].toInteger() + 1
         } else {
             throw new GradleException("Could not read version.properties!")
         }

         versionProps['build.version'] = code.toString()
         versionProps.store(versionPropsFile.newWriter(), null)
         project.android.defaultConfig.versionCode code}

allprojects {
repositories {
    jcenter()
    mavenCentral()
    flatDir {
        dirs 'libs'
    }

    maven {
        ...
    }
}}

dependencies {...}

apply plugin: 'com.google.gms.google-services'

找出必须放置gradle.properties的位置

提取整个签名配置第一个选项是,将整个签名配置提取到单独的用户文件中。 在gradle.properties中创建一个新属性:

MyProject.signing = /家庭/用户名/ .signing / myproject的

MyProject不需要匹配任何应用程序名称,实际上,您可以随意命名属性。 另外,如果您在Windows上,请使用\\代替/。

将密钥库放置在/home/username/.signing/myproject.keystore中。

现在,在/home/username/.signing中创建文件名myproject.gradle(如果需要,请创建文件夹)。 该文件将包含您的签名配置,该签名配置应用于对软件包进行签名。 看起来可能如下所示:

android {
  signingConfigs {
    release {
      storeFile file(project.property("MyProject.signing") + ".keystore")
      storePassword "mypassword"
      keyAlias "KeyAlias"
      keyPassword "mypassword"
    }
  }

  buildTypes {
    release {
      signingConfig signingConfigs.release
    }
  }
}

现在是时候在要使用此签名配置的项目中配置实际的build.gradle文件了。 只需添加以下几行:

if(project.hasProperty("MyProject.signing")
    && new File(project.property("MyProject.signing") + ".gradle").exists()) {
  apply from: project.property("MyProject.signing") + ".gradle";
}

只从文件中提取一些变量

project.ext {
  uploadRepo = 'http://....'
  uploadUser = 'myusername'
  uploadPass = 'mypass'
}

现在,通过在加载文件后将配置放入if中,确保仅使用变量(如果可用)。 因此,您的build.gradle可能如下所示:

if(project.hasProperty("MyProject.signing")
    && new File(project.property("MyProject.signing") + ".gradle").exists()) {
  apply from: project.property("MyProject.signing") + ".gradle";

  // Configure stuff that relies on these variables
  uploadArchives {
    repositories.mavenDeployer {
      repository(url: uploadRepo) {
        authentication(userName: uploadUser, password: uploadPass)
      }
    }
    // .. whatever else you need ...
  }

}

仅从文件中提取一些字符串再次向gradle.properties添加路径(这次我们将其作为完整路径):

MyProject.properties = /家庭/用户名/ .signing / myproject.properties

if(project.hasProperty("MyProject.properties")
    && new File(project.property("MyProject.properties")).exists()) {

  Properties props = new Properties()
  props.load(new FileInputStream(file(project.property("MyProject.properties"))))

  android {
    signingConfigs {
      release {
        storeFile file(props['keystore'])
        storePassword props['keystore.password']
        // ...
      }
    }
  }
}

只需在/home/username/.signing/myproject.properties中生成一个普通的属性文件

keystore = /路径/到/我/ keystore keystore.password = mypassword

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM