概述

这应该是本系列的重点了。参数化打包,打包时注入参数到apk 包中,动态修改相关参数。

添加构建参数

找到相应project点击配置,对工程进行配置。General菜单下勾选This project is parameterized ,就会出现添加参数的下拉按钮。

  • 点击添加参数按钮并选择 Choise Parameter类型参数。命名为BUILD_TYPE,值为Release 和 Debug。注意:首字母大写

  • jenkins打包Python镜像 jenkins打包命令_Android

  • jenkins_9
  • 同样方式添加 PRODUCT_FLAVORS,但注意渠道名称的首字母大写并且和项目中定义的渠道名称一致
  • jenkins打包Python镜像 jenkins打包命令_Android_02

  • jenkins_10
  • 同样方式定义APP_VERSION_NAME,如下。

  • jenkins打包Python镜像 jenkins打包命令_jenkins打包Python镜像_03

  • jenkins_11
  • 同样方式定 IS_JENKINS ,用来确定是不是jenkins 打包。从而为jenkins 打包定制一些特殊需求。


  • jenkins打包Python镜像 jenkins打包命令_时间戳_04

  • jenkins_12
  • 添加名称为BUILD_TIME类型为Dynamic Parameter的参数。注意只有安装了Dynamic Parameter Plug-in 插件,才会有该类型的参数。


  • jenkins打包Python镜像 jenkins打包命令_时间戳_05

  • jenkins_13
  • 添加名称为 GIT_TAG_2类型为Git Parameter的参数。可通过设置项Parameter Type选择参数类型。系统提供了多种参数类型供选择,如 Branch Tag Branch or Tag 。可通过设置项Sort Mode选择排序方式,如我们这里选择 DESCENDING SMART(智能降序)。


  • jenkins打包Python镜像 jenkins打包命令_Gradle_06

  • jenkins_14

构建

在gradle命令中使用参数构建

我们已经增加好了参数,下面我们需要在构建的时候使用这些参数。修改 gradle 构建任务为
clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug





jenkins打包Python镜像 jenkins打包命令_时间戳_07


jenkins_24


参数注入到 Android 项目中

勾选 Pass all job parameters as Project properties 参数才能注入到Android项目中。有些博文说的按钮勾选Pass all job parameters as Gradle properties 因为版本不同,所以选项的名称略有不同。我们需要把APP_VERSION_NAMEIS_JENKINSBUILD_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'



jenkins打包Python镜像 jenkins打包命令_时间戳_08


jenkins_15


在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

开始构建
  • 现在我的工程面板变成了这样



jenkins打包Python镜像 jenkins打包命令_Android_09


jenkins_16



点击 Build with Parameters

  • 现在我们看下我们的构建面板,如下。
  • 选择好参数后就可以构建了。
  • 从构建成功后的包名可以看出我们的参数成功注入到Android项目中了。


  • jenkins打包Python镜像 jenkins打包命令_Gradle_10

  • jenkins_18

用于存档的文件

现在每次打包成功,我们都要去工作空间下载打包文件,很麻烦体验也不好。现在我们设置一个用于存档的路径。效果如下,点击apk 文件就能下载,且就在构建面板上,一眼就能看到。



jenkins打包Python镜像 jenkins打包命令_时间戳_11


jenkins_20



这是一个 构建后操作,我打包后的 apk文件存放在 app/build/outputs/release/${BUILD_TIME}/* 路径下( BUILD_TIME 是时间戳,这里是动态引用我们前面定义的参数),必须保证这个路径真实存在。



jenkins打包Python镜像 jenkins打包命令_jenkins打包Python镜像_12


jenkins_19


构建命名

现在构建后命名像这样



jenkins打包Python镜像 jenkins打包命令_Gradle_13


jenkins_21



不美观、而且无法看到一些关键信息。我们需要添加一个 构建环境信息,如下。



jenkins打包Python镜像 jenkins打包命令_jenkins打包Python镜像_14


jenkins_22



效果如下




jenkins打包Python镜像 jenkins打包命令_Gradle_15


jenkins_23


总结

参数化打包可以根据选择参数不同。动态修改 apk 中的参数。比如不同版本的对应后台接口的ip 不同 。后面我们会继续讨论如何把打包好的安装包通过ssh上传到远程服务器,并提供二维码下载等。