前言
在日常構建打包的過程中,每次打包都需要修改 versionName
,versionCode
,還有 appName
和 appIcon
等程式碼引數,這些引數如何透過 Jenkins
的引數化構建來完成,實現構建時直接傳入這些引數來時間自動化打包。
那麼就需要將這些程式碼引數能夠統一管理,我們平時的 appName appIcon 這些引數都是放在 AndroidManifest.xml
檔案裡,像這種引數都需要抽出來統一管理。
引數統一管理
這裡我選擇將需要動態化的引數統一放到專案根目錄的 gradle.properties
檔案中去,我的配置如下
# 忽略其他配置...
APP_NAME=我的App
APP_ICON=@mipmap/ic_launcher
VERSION_CODE=108
VERSION_NAME=1.0.8
這裡我將以上這四個引數進行了引數化,我這裡的 APP_ICON
引數是一個 adaptive-icon
的 xml 檔案,他也可以是你的圖片資原始檔。
像這樣:
APP_ICON=@drawable/icon_logo
那麼接下來就是將以上的引數配置放在需要他們的地方,找到 app 工程目錄下的 build.gradle
將以上引數放置進去。
android {
defaultConfig {
// 忽略其他引數...
versionCode Integer.parseInt(VERSION_CODE) //打包時候的 versionCode
versionName VERSION_NAME //打包時候的 versionName
}
buildTypes {
// 打 debug 包的構建引數
debug {
// 忽略其他引數...
manifestPlaceholders = [
APP_NAME : getAppName(),
APP_ICON : APP_ICON
]
}
// 打 release 包的構建引數
release {
// 在清單檔案中需要引用的引數
manifestPlaceholders = [
APP_NAME : getAppName(),
APP_ICON : APP_ICON
]
}
}
}
// 將從 gradle.properties 取出的中文轉為 UTF-8 編碼,防止亂碼
def getAppName() {
return new String(APP_NAME.getBytes("iso8859-1"), "UTF-8")
}
好,這個時候就差 AndroidManifest.xml
檔案中的 appName 和 appIcon 了,開啟清單檔案
改為如下
<application
android:name=".App"
android:icon="${APP_ICON}"
android:label="${APP_NAME}">
</application>
配置 Jenkins
好,接下來我們開始配置 Jenkins
這裡我使用 sed
命令,來對 gradle.properties
檔案進行匹配內容替換操作。
新增構建步驟
我們新增一個執行shell的構建步驟
然後寫入如下內容( Mac 上需要在 sed -i ‘’ 帶兩個單引號,Centos 不需要)
sed -i '' "s/APP_NAME.*/APP_NAME=$APP_NAME/g" $WORKSPACE/gradle.properties
sed -i '' "s/APP_ICON.*/APP_ICON=$APP_ICON/g" gradle.properties
sed -i '' "s/VERSION_CODE.*/VERSION_CODE=$VERSION_CODE/g" $WORKSPACE/gradle.properties
sed -i '' "s/VERSION_NAME.*/VERSION_NAME=$VERSION_NAME/g" $WORKSPACE/gradle.properties
然後將這四個引數都配置到引數化構建中,就可以在構建的時候輸入這四個引數了。這裡就不在贅述如何增加構建引數了。有一點需要注意的是,在Jenkins 立即構建配置引數時,APP_ICON 中有 / 需要進行反斜槓,防止轉義
好了,現在就可以靈活配置 app 的版本號、名稱、圖示了,還有渠道、分支等也可以靈活配置,這裡就不詳細展開了。
參考文章
Android 如何使用gradle.properties
Jenkins 構建Android App時 動態打入jenkins 構建版本號
jenkins打包apk帶入versionCode和versionName
build.gradle 訪問 gradle.properties 亂碼
本作品採用《CC 協議》,轉載必須註明作者和本文連結