1. 程式人生 > >gradle實現樂固+walle自動化構建專案

gradle實現樂固+walle自動化構建專案

gradle實現樂固+walle自動化構建專案

問題說明

針對v2的簽名方式,由美團團隊創造了walle工具進行多渠道資訊寫入,這樣在同一個release包中,寫入不同資訊就可以實現多渠道的目的,這種高效率的實現方式,成為了目前產出多渠道包的主流。
但同時誕生了一個問題:在通過三方加固之後,寫入的資訊被抹去了,要重新進行寫入,而且加固軟體的出現,侷限了我們只能在本機進行打包加固,不利於jenkins自動化打包釋出。所以我產出這篇博文,記錄我是怎麼處理這個問題的,希望能幫助到大家。

前期準備

在解決以上問題之前,我先對我目前所搭建的環境進行說明:

  1. 目前有配置完好的jenkins伺服器,並映射了域名,可以做到直接性的檔案訪問。
  2. 有騰訊(QQ)賬號,並通過騰訊雲的子賬號,生成了SecretId和SecretKey。

自動化流程說明

首先,開啟騰訊樂固的官方網站查詢資料:
https://cloud.tencent.com/document/api/283/17753
由網站文件可知:

  1. 樂固同360加固不同,樂固僅提供api介面,由我方自己呼叫。
  2. 呼叫的核心引數AppInfo:
  • AppUrl:待加固的APP的下載地址,不需要身份校驗。
  • AppMd5:由於對方在下載完畢後,會對下載的APP進行MD5校驗,所以此處產生的MD5值需要與待加固的APP保持一致。
  1. 加固流程:
    (1) 打包release版本APP,可以是已經簽名好的APP。
    (2) 將APP push進伺服器,提供可下載的URL。
    (3) 計算本地的APP的MD5值。
    (4) 生成樂固請求引數,主要是將2、3步驟生成的資料寫入,介面為CreateShieldInstance。
    (5) 輪詢加固結果,介面為DescribeShieldInstances。
    (6) 如果加固成功,則返回引數中的AppUrl會提供加固好未簽名的APP下載地址。
    (7) 下載已經加固好的APP。
    (8) 對該APP進行對齊、簽名。
    (9) 對該APP進行walle資訊寫入。
    (10) 將完成的APP push進發布伺服器,所有步驟完成。

具體流程解析和實現

  1. 配置jenkins,先對應用進行打包:
    增加一個execute shell的構建步驟,執行:./gradlew clean assembleRelease
    在這裡插入圖片描述
  2. 根據R神大佬的AS–›Gradle樂固加固和下載一文,我們配置好legu task的執行引數,引用步驟如下:
    (1) 在project app的同級目錄下,新建一個名為legu的資料夾
    (2) 將大佬寫的.gradle檔案複製在該資料夾下的lejiagu.gradle中,名字隨便取,只要預編譯不報錯,則程式碼提示報紅無視。
    在這裡插入圖片描述
    (3) 在自己app級的.gradle中引入該檔案
    在這裡插入圖片描述
    (4) 在lejaigu.gradle中,填入leguConfig的必填項引數,如下:
    在這裡插入圖片描述
    如果一切順利,此時執行legu task:gradlew legu,會成功生成加固完成的apk包。
  3. 很好,成功就在眼前。我們現在還需要對應用進行對齊、簽名和寫入渠道資訊了。不過這裡出現了問題:
    在android sdk中,為我們提供了兩個工具進行應用的對齊和簽名,分別是:
    zipalign.exe和apksigner.bat(windows平臺)
    它們都在build-tools/你的targetVersion/中,我們需要使用這兩個工具才能對應用進行對齊和v2簽名。
    看到exe我開始犯難,因為在其他平臺,如linux,可執行不了exe檔案,那麼為了寫出來通用性高,可移植的指令碼,我們需要對平臺進行判斷,包括其他一些差異,如檔案路徑/和\。
    一開始我的思路是【複用】:
    我們都知道,在打release包時,gradle執行了assembleRelease task,該task除了打包之外,還進行了引用的對齊和簽名,那麼雖然這兩個task是隱藏的,但是通過檢視android.tools.build:gradle原始碼,我們可以找到官方的思路和方法,退一步來說,可以仿寫出來-------------------------------
    想法很美好,現實很骨感,我追了2天的android.tools.build:gradle原始碼,僅發現了zipalign的task,而簽名的task始終沒有找到,對於這部分原始碼的解析,我會再另一篇文章中專門講解。
    好吧,這條路走不通了。
    那麼檢視walle的官方說明,我們找到了一個python指令碼 ,用於處理對齊、簽名、多渠道寫入,這不是正是我們需要的嗎?
  4. 整合對齊,簽名,多渠道python指令碼
    我們先將該檔案整合進我們的專案,還好都是基本工具,所以不大,直接丟進legu資料夾中。
    在這裡插入圖片描述
    其中ApkResigner.py是主流程的檔案,我們不需要去改動,僅對channel和config.py修改即可。
    配置好之後,先在本地跑一下,這裡有個細節:
    需要CD到legu目錄下,指令碼才能正常執行,應該是和我的配置有關。
    不出意外,一切正常,在channels下生成了多渠道簽名包。
    現在我們把這一切丟到jenkins上去,由於路徑差異,有些地方需要修改:
    我的方式是,在jenkins執行打包命令之前,修改config.py,主要是設定伺服器上的SDK路徑,確定build-tools的檔案位置。
    在這裡插入圖片描述
    做好這一切後,我們編譯一下…等待結果。
    在這裡插入圖片描述
    很好。。打包成功!