Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

大頭呆發表於2019-02-28

摘要

本文介紹了在Mac系統上進行Jenkins配置,然後新建專案整合WalleAndResGuard,對託管在Git上的Android專案進行持續整合的過程,其中Walle是美團開源的Android Signature V2 Scheme簽名下的新一代渠道包打包神器,;AndResGuard是微信開源的資原始檔混淆工具。我整合的整體流程如下:配置好Jenkins整合環境,用Jenkins的gradle外掛打出未簽名的包,然後用AndResGuard提供的jar包進行資原始檔混淆,得到混淆過後的未簽名包(AndResGuard目前還未支援V2簽名,只有v1簽名),然後通過Android SDK提供的apksigner工具對包進行V2簽名,最後用Walle提供的jar包對Apk檔案寫入渠道資訊,輸出渠道包。

配置Jenkins整合環境

因為本文不是主要介紹怎麼配置Jenkins整合環境的,而且網上的教程也很多。我個人在Mac上的配置過程沒遇到什麼大的問題,Windows下可能略有不同。

  • 預先安裝Java和Git,並配置好本機的環境變數;
  • 先安裝Homebrew,輸入命令brew install jenkins安裝Jenkins;
  • 輸入密碼,進入Jenkins,安裝外掛,很多外掛已經安裝好了, 安裝Environment Injector就行了
  • 在系統管理-系統設定中配置ANDROID_HOME
Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統
  • 在系統管理-全域性工具配置中配置Jdk
    Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統
  • 在系統管理-全域性工具配置中配置Gradle,可以讓Jenkins自動安裝也可以選本地的,只要版本號和專案的一樣就行,同時配置本機Gadle命令的環境變數。
    Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

建立Android專案

在Android Studio中新建一個專案,整合下Walle,然後簡單輸出下渠道資訊:

        String channel = WalleChannelReader.getChannel(this.getApplicationContext());
        TextView textView=findViewById(R.id.text);
        textView.setText("channel=="+channel);
複製程式碼

然後上傳到Github。
在Jenkins中新建一個自由風格的軟體專案,點引數化構建:

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

這樣在構建的時候就可以手動輸入渠道包了。
在構建環境中定義好需要打包的專案變數和配置

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

打包

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

呼叫AndResGuard的jar包對Apk檔案進行資源混淆,注意AndResGuard輸出的簽名包是V1簽名,所以需要我們取未簽名的包自己去對齊和V2簽名。

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

輸出如下,開啟任意一個Apk檔案,看到資原始檔已經被混淆了。

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統
Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

進行V2簽名(需要加入sdk/build-tools路徑到本機的全域性變數):

zipalign -v 4 in.apk out.apk   //4位元組對齊優化
java -jar apksigner.jar sign  --ks key.jks  --ks-key-alias releasekey  --ks-pass pass:pp123456  --key-pass pass:pp123456  --out output.apk  input.apk
複製程式碼

將輸入的渠道包列表輸入到markets.txt檔案:

cd ${WORKSPACE}
if [[ ! -d "${SOURCE_TARGET}" ]]; then
  git clone ${PROJECT_GIT_REPO} ${WORKSPACE} -b ${PROJECT_GIT_BRANCH}
fi
cd ${WORKSPACE}

git pull --no-commit --all

echo "最新提交:"$(git log -p -1 --pretty=format:"%s (%an)" --name-only | grep ")")

APP_VERSION=$(
path=${WORKSPACE}/build.gradle
key="versionName"
loop=1
version=""
while read line
do
     readText=${line%%%=*}
    if [[ $readText =~ $key ]]
     then
          version=${readText:15:5}
          break
     fi
     ((loop++))
done < $path
echo $version
)
echo APP_VERSION=$APP_VERSION > ${WORKSPACE}/build.properties

echo $Markets
if [ "$Markets" !=  "" ]; then 
   rm -f markets.txt

   arr=$(echo $Markets|tr "," "
")
   for x in $arr; do
    echo $x >> markets.txt
  done
fi
複製程式碼

最後呼叫Walle的jar包進行多渠道打包

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

輸出如下,安裝之後也可以正確讀出寫入的渠道的資訊了:

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統
Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

構建

以後每次構建的時候選擇Build with Parameters輸入渠道列表就行了:

Jenkins+Git+Walle+AndResGuard打造Android多渠道打包系統

後記

據開發者說AndResGuard下個版本會支援V2簽名,參看–連結,到時候整個流程會簡化許多。

追加:3月1日後develop分支已新增v2簽名功能,參看–Provide the latest jar file for v2 signature

可以去掉引數化構建方式和寫入的shell命令,直接在markets.txt上寫渠道列表。不過我這麼做是方便運營的同學打包。

想要了解更多實現細節請前往本專案github地址–github.com/renjianan/J…

相關文章