概述
這應該是本系列的重點了。參數化打包,打包時注入參數到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
選擇參數類型。系統提供了多種參數類型供選擇,如Branch
Tag
Branch 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
上傳到遠程服務器,并提供二維碼下載等。