仅生成签名 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 blog 那里得到了帮助。以下是代码-

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=/home/username/.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=/home/username/.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:

生成一个普通属性文件

密钥库=/path/to/my/keystore keystore.password=我的密码