Mac Jenkins 構建 Android App 時動態設定程式碼引數

邢闖洋發表於2021-12-16

前言

在日常構建打包的過程中,每次打包都需要修改 versionNameversionCode,還有 appNameappIcon 等程式碼引數,這些引數如何通過 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 構建 Android App 時動態設定程式碼引數

配置 Jenkins

好,接下來我們開始配置 Jenkins

這裡我使用 sed 命令,來對 gradle.properties 檔案進行匹配內容替換操作。

新增構建步驟

我們新增一個執行shell的構建步驟

Mac Jenkins 構建 Android App 時動態設定程式碼引數

然後寫入如下內容

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 中有 / 需要進行反斜槓,防止轉義

Mac Jenkins 構建 Android App 時動態設定程式碼引數

好了,現在就可以靈活配置 app 的版本號、名稱、圖示了,還有渠道、分支等也可以靈活配置,這裡就不詳細展開了。

參考文章

Android 如何使用gradle.properties
Jenkins 構建Android App時 動態打入jenkins 構建版本號
jenkins打包apk帶入versionCode和versionName
build.gradle 訪問 gradle.properties 亂碼

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章