概述
这应该是本系列的重点了。参数化打包,打包时注入参数到apk
包中,动态修改相关参数。
添加构建参数
找到相应project
点击配置,对工程进行配置。General
菜单下勾选This project is parameterized
,就会出现添加参数
的下拉按钮。
- 点击
添加参数
按钮并选择Choise Parameter
类型参数。命名为BUILD_TYPE
,值为Release 和 Debug
。注意:首字母大写
- 同样方式添加
PRODUCT_FLAVORS
,但注意渠道名称的首字母大写并且和项目中定义的渠道名称一致
- 同样方式定义
APP_VERSION_NAME
,如下。
- 同样方式定
IS_JENKINS
,用来确定是不是jenkins 打包。从而为jenkins
打包定制一些特殊需求。
- 添加名称为
BUILD_TIME
类型为Dynamic Parameter
的参数。注意只有安装了Dynamic Parameter Plug-in 插件,才会有该类型的参数。
- 添加名称为
GIT_TAG_2
类型为Git Parameter
的参数。可通过设置项Parameter Type
选择参数类型。系统提供了多种参数类型供选择,如Branch
Tag
Branch or Tag
。可通过设置项Sort Mode
选择排序方式,如我们这里选择DESCENDING SMART
(智能降序)。
构建
在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
项目中了。
用于存档的文件
现在每次打包成功,我们都要去工作空间下载打包文件,很麻烦体验也不好。现在我们设置一个用于存档的路径。效果如下,点击apk
文件就能下载,且就在构建面板上,一眼就能看到。
这是一个
构建后操作
,我打包后的apk
文件存放在app/build/outputs/release/${BUILD_TIME}/*
路径下(BUILD_TIME
是时间戳,这里是动态引用我们前面定义的参数),必须保证这个路径真实存在。构建命名
现在构建后命名像这样
不美观、而且无法看到一些关键信息。我们需要添加一个
构建环境
信息,如下。
效果如下
总结
参数化打包可以根据选择参数不同。动态修改 apk
中的参数。比如不同版本的对应后台接口的ip
不同 。后面我们会继续讨论如何把打包好的安装包通过ssh
上传到远程服务器,并提供二维码下载等。