概述
这应该是本系列的重点了。参数化打包,打包时注入参数到apk 包中,动态修改相关参数。
添加构建参数
找到相应project点击配置,对工程进行配置。General菜单下勾选This project is parameterized ,就会出现添加参数的下拉按钮。
- 点击
添加参数按钮并选择Choise Parameter类型参数。命名为BUILD_TYPE,值为Release 和 Debug。注意:首字母大写
jenkins_9
- 同样方式添加
PRODUCT_FLAVORS,但注意渠道名称的首字母大写并且和项目中定义的渠道名称一致
jenkins_10
- 同样方式定义
APP_VERSION_NAME,如下。
jenkins_11
- 同样方式定
IS_JENKINS,用来确定是不是jenkins 打包。从而为jenkins打包定制一些特殊需求。
jenkins_12
- 添加名称为
BUILD_TIME类型为Dynamic Parameter的参数。注意只有安装了Dynamic Parameter Plug-in 插件,才会有该类型的参数。
jenkins_13
- 添加名称为
GIT_TAG_2类型为Git Parameter的参数。可通过设置项Parameter Type选择参数类型。系统提供了多种参数类型供选择,如BranchTagBranch or Tag。可通过设置项Sort Mode选择排序方式,如我们这里选择DESCENDING SMART(智能降序)。
jenkins_14
构建
在gradle命令中使用参数构建
我们已经增加好了参数,下面我们需要在构建的时候使用这些参数。修改 gradle 构建任务为
clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug
参数注入到 Android 项目中
勾选 Pass all job parameters as Project properties 参数才能注入到Android项目中。有些博文说的按钮勾选Pass all job parameters as Gradle properties 因为版本不同,所以选项的名称略有不同。我们需要把APP_VERSION_NAME、IS_JENKINS、BUILD_TIME 这三个参数注入到项目中。所以我们还需要在Android项目的gradle.properties
中添加这三个参数,打包时注入替换这三个参数的默认值。
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
APP_VERSION_NAME=1.0.1
IS_JENKINS=true
BUILD_TIME='1992'
在Android 项目中使用注入参数
//修改生成的apk名字及输出文件夹
applicationVariants.all { variant ->
variant.outputs.all { output ->
//新名字
def newName
//时间戳
def timeNow
//输出文件夹
def outDirectory
//是否为Jenkins打包,输出路径不同
if ("true".equals(IS_JENKINS)) {
//Jenkins打包输出到服务器路径
timeNow = BUILD_TIME
//BUILD_PATH为服务器输出路径
//JenkinsTest-v1.0.1-product-release-2019-10-18 10:35:34.apk
newName = 'JenkinsTest-v' + APP_VERSION_NAME + '-' + upFirstWorld(variant.productFlavors[0].name) + '-' + upFirstWorld(variant.buildType.name) + '.apk'
} else {
//本机打包输出在本机路径
timeNow = getDate()
if ('debug'.equals(variant.buildType.name)) {
newName = "AutoBuildTest-v${APP_VERSION_NAME}-debug.apk"
} else {
//JenkinsTest-v1.0.1-xiaomi-release.apk
newName = 'JenkinsTest-v' + APP_VERSION_NAME + '-' + upFirstWorld(variant.productFlavors[0].name) + '-' + upFirstWorld(variant.buildType.name) + '.apk'
}
}
// 打包后放到 app/build/release/时间戳下 包下
output.outputFileName = new File("../../../release/${timeNow}", newName)
}
}
我把APP_VERSION_NAME添加到生成的apk的名称中,把生成的apk 放到不同时间戳文件夹下。完整的参数gradle配置信息见我的github。
开始构建
- 现在我的工程面板变成了这样
点击
Build with Parameters
-
现在我们看下我们的构建面板,如下。
- 选择好参数后就可以构建了。
- 从构建成功后的包名可以看出我们的参数成功注入到
Android项目中了。
jenkins_18
用于存档的文件
现在每次打包成功,我们都要去工作空间下载打包文件,很麻烦体验也不好。现在我们设置一个用于存档的路径。效果如下,点击apk 文件就能下载,且就在构建面板上,一眼就能看到。
这是一个
构建后操作,我打包后的apk文件存放在app/build/outputs/release/${BUILD_TIME}/* 路径下(BUILD_TIME 是时间戳,这里是动态引用我们前面定义的参数),必须保证这个路径真实存在。构建命名
现在构建后命名像这样
不美观、而且无法看到一些关键信息。我们需要添加一个
构建环境信息,如下。
效果如下
总结
参数化打包可以根据选择参数不同。动态修改 apk 中的参数。比如不同版本的对应后台接口的ip 不同 。后面我们会继续讨论如何把打包好的安装包通过ssh上传到远程服务器,并提供二维码下载等。











网友评论