需求:

  1. 使用 Android studio ,使用 gradle 进行构建

  2. 在实际开发中,我们需要使用jenkins进行打包。就需要配置我们的 gradle 脚本以支持参数化的方式。

  3. 想获得一个可配置打包脚本的方法,允许 配置人员根据需要修改 服务器地址,versionCode, versionName 等

  4. 隔离的源代码的配置,使用者在 jenkins里进行配置。

概述:

先展示我配置好的 参数,可以在命令提示行下执行,如下:

gradle assembleBeta -PVERSION_CODE_PARA=101 -PVERSION_NAME_PARA=fd21.0 -POUT_PUT_DIR_PARA=/Users/zhangyunfei/Desktop/yyy -PAPI_HOST_USER_PARA=http://10.0.1.245:9000 -PAPI_HOST_CABZOO_PARA=http://10.0.1.245:9002 -POUT_PUT_APK_SUFFIX_PARA=245
参数说明:
  1. assembleBeta 其中 Beta是我配置好的 构建任务,
  2. -P标示后面跟的内容是参数,比如:
    -PVERSION_CODE_PARA=101 表示  传入一个 VERSION_CODE_PARA 参数,它的值是 101

这里的参数都是自定义的,我在这里参入了多个参数,有 versionName,versionCode ,输入文件路径,和 指定的服务器地址。

实现:

修改versionCode和 versionName 
上面的演示中,我们传入了gradle的参数,如何在gradle中使用呢? 下面是我配置 versionCode和 versionName 的代码,示例如下:
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
signingConfig signingConfigs.debug
buildConfigField("String", "API_HOST_USER", "\"http://10.0.1.232:9000\"")
buildConfigField("String", "API_HOST_CABZOO", "\"http://10.0.1.232:9002\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "true")
if (project.hasProperty('VERSION_CODE_PARA')) {
versionCode Integer.parseInt(VERSION_CODE_PARA)
}
if (project.hasProperty('VERSION_NAME_PARA'
)) {
versionName VERSION_NAME_PARA
}

}
我们需要配置 defaultConfig 节点,读取上面传入的参数的值作为 versionCode或者 versionName。在读取参数的时候,我们先检查参数是否存在,使用代码: 
  project.hasProperty('参数名') 
所有通过命令行传入的参数都或作为 project 内建对象的属性,我们这里判断了 指定的参数名 是否存在。如何使用参数呢?直接使用即可,比如下面:
  
   versionCode Integer.parseInt(VERSION_CODE_PARA)    注意这里,进行了 转型,从字符串转型为 int 类型
   versionName VERSION_NAME_PARA 

和普通的变量使用方法是一样的。我们还会遇到在 字符串中使用的时候,可以使用 表达式 来引用,比如:
   ${参数名}
示例:
  fileName = fileName.replace(".apk", "-${android.defaultConfig.versionName}.apk")

明白了变量(属性,参数)的读取方式,我们就可以像普通代码那样编码了。我们继续回到我们的主题行来。我们需要 在 buildTypes 节点(任务)下,添加一个 自定义的打包方式,比如 名称叫做 beta 的配置。beta 是我自定义的,在开头我们见过这个参数的使用,在 “gradle assembleBeta ” 中的Beta就会调用这个我们配置好的任务,演示代码如下:
        if (project.hasProperty('API_HOST_USER_PARA') && project.hasProperty('API_HOST_CABZOO_PARA')) {

            beta {
debuggable true
signingConfig signingConfigs.debug
minifyEnabled false
buildConfigField("String", "API_HOST_USER", "\"" + API_HOST_USER_PARA + "\"")
buildConfigField("String", "API_HOST_CABZOO", "\"" + API_HOST_CABZOO_PARA + "\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "false")
}
}

控制输出的APK的 名称和存放路径

我们继续配置 apk 输出 的目录的配置,这就需要获得 编译完成后的文件名称的配置,如何获得和设置输入路径呢?代码如下:

android.applicationVariants.all { variant ->

    variant.outputs.each { output ->{
.......
}
}

我想在输出的 apk 文件名中添加 版本名称(versionName),写下代码:

if (android.defaultConfig.versionName != null) {
fileName = fileName.replace(".apk", "-${android.defaultConfig.versionName}.apk")
}

为输入的apk文件名增加指定的后缀

if (project.hasProperty('OUT_PUT_APK_SUFFIX_PARA')) {
fileName = fileName.replace(".apk", "-${OUT_PUT_APK_SUFFIX_PARA}.apk")
}

为输出的apk文件名增加 当前日期 部分

 def today = new Date().format('yyMMddHHmm');
fileName = fileName.replace(".apk", "-${today}.apk")

我还想指定 apk的存放 目录:

if (project.hasProperty('OUT_PUT_DIR_PARA')) {
File output_dir1 = file("${OUT_PUT_DIR_PARA}");
output.outputFile = new File(output_dir1, fileName)
println "输出文件位置: " + output.outputFile
//}
}

这部分的示例代码如下:

android.applicationVariants.all { variant ->

    variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = outputFile.name;
if (android.defaultConfig.versionName != null) {
fileName = fileName.replace(".apk", "-${android.defaultConfig.versionName}.apk")
}
if (project.hasProperty('OUT_PUT_APK_SUFFIX_PARA')) {
fileName = fileName.replace(".apk", "-${OUT_PUT_APK_SUFFIX_PARA}.apk")
}
def today = new Date().format('yyMMddHHmm');
fileName = fileName.replace(".apk", "-${today}.apk")
if (project.hasProperty('OUT_PUT_DIR_PARA')) {
File output_dir1 = file("${OUT_PUT_DIR_PARA}");
output.outputFile = new File(output_dir1, fileName)
println "输出文件位置: " + output.outputFile
//}
} else {
output.outputFile = new File(outputFile.parent, fileName)
println "输出文件位置: " + output.outputFile
}
}
}
}

我的整个gradle 脚本,build.gradle 文件如下:
apply plugin: 'android'

dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':jlb_common')
compile project(':JlbLibUmeng')
compile project(':zyf.util.bluetoothprinter')
} android {
signingConfigs {
release {
keyAlias 'jlb.scanner.apk'
keyPassword ' '
storeFile file(' ')
storePassword ' '
}
debug {
keyAlias 'androiddebugkey'
keyPassword ' '
storeFile file(' ')
storePassword ' '
}
}
compileSdkVersion 19
buildToolsVersion "22.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
} // Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests') // Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
buildTypes {
debug {
signingConfig signingConfigs.debug
buildConfigField("String", "API_HOST_USER", "\"http://10.0.1.232:9000\"")
buildConfigField("String", "API_HOST_CABZOO", "\"http://10.0.1.232:9002\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "false")
}
release {
minifyEnabled true
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.release
buildConfigField("String", "API_HOST_USER", "\"http://uc.jinlinbao.com\"")
buildConfigField("String", "API_HOST_CABZOO", "\"http://cabzoo.jinlinbao.com\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "true")
}
// product_245 {
// debuggable true
// signingConfig signingConfigs.debug
// minifyEnabled false
// buildConfigField("String", "API_HOST_USER", "\"http://10.0.1.245:9000\"")
// buildConfigField("String", "API_HOST_CABZOO", "\"http://10.0.1.245:9002\"")
// }
if (project.hasProperty('API_HOST_USER_PARA') && project.hasProperty('API_HOST_CABZOO_PARA')) { beta {
debuggable true
signingConfig signingConfigs.debug
minifyEnabled false
buildConfigField("String", "API_HOST_USER", "\"" + API_HOST_USER_PARA + "\"")
buildConfigField("String", "API_HOST_CABZOO", "\"" + API_HOST_CABZOO_PARA + "\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "false")
}
}
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
signingConfig signingConfigs.debug
buildConfigField("String", "API_HOST_USER", "\"http://10.0.1.232:9000\"")
buildConfigField("String", "API_HOST_CABZOO", "\"http://10.0.1.232:9002\"")
buildConfigField("Boolean", "IS_CHECK_VERSION_UPDATE", "true")
if (project.hasProperty('VERSION_CODE_PARA')) {
versionCode Integer.parseInt(VERSION_CODE_PARA)
}
if (project.hasProperty('VERSION_NAME_PARA')) {
versionName VERSION_NAME_PARA
}
}
productFlavors {
}
} android {
lintOptions {
abortOnError false
}
} android.applicationVariants.all { variant -> variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = outputFile.name;
if (android.defaultConfig.versionName != null) {
fileName = fileName.replace(".apk", "-${android.defaultConfig.versionName}.apk")
}
if (project.hasProperty('OUT_PUT_APK_SUFFIX_PARA')) {
fileName = fileName.replace(".apk", "-${OUT_PUT_APK_SUFFIX_PARA}.apk")
}
def today = new Date().format('yyMMddHHmm');
fileName = fileName.replace(".apk", "-${today}.apk")
if (project.hasProperty('OUT_PUT_DIR_PARA')) {
File output_dir1 = file("${OUT_PUT_DIR_PARA}");
output.outputFile = new File(output_dir1, fileName)
println "输出文件位置: " + output.outputFile
//}
} else {
output.outputFile = new File(outputFile.parent, fileName)
println "输出文件位置: " + output.outputFile
}
}
}
}
 

在 Android studio 中 配置Gradle 做到 “根据命令行提示符生成指定versionCode, versionName,指定apk的打包输出路径”的更多相关文章

  1. 在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”

    需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址.比如 开发服务器使用 192.168.1.232服务器, 测试服务器使用 192.168.1.245服务器, 正式上 ...

  2. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  3. Android Studio中使用Gradle打包

    首先要注意一点,Android Studio中把proguard.txt已经命名为proguard-rules.pro,由此可见,採用Gradle打包,混淆规则文件的名称是不重要的.能够自己随便命名. ...

  4. 如何在Android Studio中使用Gradle发布项目至Jcenter仓库

    简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...

  5. Android Studio中配置及使用OpenCV示例

    Android Studio配置及使用OpenCV 前言:最近在做项目移植,项目较大,在Eclipse中配置的Jni及OpenCV环境没任何问题,但是迁移到Studio中就问题一大堆,网上也找了一些资 ...

  6. Android Studio中由于gradle插件版本和gradle版本对应关系导致的编译失败的问题

    今天在Android Studio中导入新项目,import之后编译报错,报错信息基本都是和版本相关,查询gradle版本相关知识,了解到gradle插件版本和gradle版本有相应的匹配关系,对应如 ...

  7. 在android studio中配置运行时签名

    做项目的时候,有时需要用到第三方接口,而基本第三方接口都是要求我们要先进行签名.结果每次调试都得手动进行签名一次,实在麻烦.所以android studio提供了一种在运行的时候自动进行签名的方法,在 ...

  8. [Android Studio系列(五)] Android Studio手动配置Gradle的方法

    1 问题 (1) android sutdio第一次打开一个工程巨慢怎么办? (2) 手动配置Gradle Home为什么总是无效? (3) 明明已经下载了Gradle,配置了gradle home, ...

  9. android studio中为gradle指定cmake版本

    Android Studio相当于是Intellij基础上写了一个AS插件,这个插件使用gradle作为构建系统,因此构建出现问题先考虑gradle的文档. gradle可以使用native buil ...

随机推荐

  1. 人民币金额转化汉字的java写法

    最近看到一个把一个浮点数转化为汉字人民币的小题,感觉很有意思就去用java实现了一下,没想到没有想得那么简单,在网上搜了一下也不近人意,经过几次修改后,现在实现了,现在分享一下. 一.当输入一个浮点数 ...

  2. SpringMVC之RequestContextHolder分析

    最近遇到的问题是在service获取request和response,正常来说在service层是没有request的,然而直接从controlller传过来的话解决方法太粗暴,后来发现了Spring ...

  3. 简简单单搞掂恼人的Laravel 5安装

    想折腾下Laravel 5了.Laravel是这世界上最好且没有之一的语言──PHP──的众多框架中的一个,是我比较感兴趣的PHP Web Framework. 但是安装Laravel可不是件容易的事 ...

  4. JAXB--@XmlElementWrapper注解和泛型一起使用

    当java对象的某个属性使用泛型时,普通对象都没问题,但是遇到HashSet这种集合类封装的元素时,就会出现元素内容序列化不出来的问题,详见如下: 一.示例: 第一步:定义java对象 package ...

  5. c++中浮点数精度设置

    1.包含头文件<iomanip>,附注manip是manipulator,操控的简写. 2.第一种写法: cout<<setiosflags(ios::); 第二种写法: co ...

  6. HLS

    2018-04-14 WMY-竹海 相约电子ee 首先要启动软件,界面如下所示: 以最简单的矩阵运算为例吧,来介绍一下HLS的使用. 对于HLS的输入为C++或C代码,当然systemC也可以,主要完 ...

  7. ActionBar 笔记

    博客地址: http://blog.csdn.net/eclipsexys/article/details/8688538 官方文档: http://developer.android.com/gui ...

  8. android studio - Indexing paused due to batch updated

    傻逼的 Android Studio  又开抽疯了....  日 打开项目就出现   Indexing paused due to batch updated ,并且半天没反应........ 解决办 ...

  9. Tornado中gen.coroutine详解

    1.gen.coroutine的作用 自动执行生成器 2.Future对象 在介绍异步使用之前,先了解一下Future对象的作用. Future简单可以理解为一个占位符,将来会执行的对象,类似java ...

  10. u3d中的坐标系

    任何子级游戏对象 (Child GameObject) 的检视器 (Inspector) 中的变换 (Transform) 值都会相对于父级 (Parent) 的变换 (Transform) 值而显示 ...