Gradle多渠道打包的原理、實踐與輔助開發

安卓開發高階技術分享發表於2019-01-16

背景

在釋出apk時,經常遇到需要釋出多個版本,每個版本均有細微差異的情況,稱為多渠道打包,Android Studio中提供了利用Gradle實現多渠道打包的功能。

原理

我們知道,apk的打包過程分7步:

1、打包資原始檔,生成R.java檔案

2、處理aidl檔案,生成相應java 檔案

3、編譯工程原始碼,生成相應class 檔案

4、轉換所有class檔案,生成classes.dex檔案

5、打包生成apk

6、對apk檔案進行簽名

7、對簽名後的apk檔案進行對齊處理

多渠道打包,就是對這個過程進行一定程度的干涉,Android Studio的Gradle可以通過設定productFlavors來實現這個功能,通過自定義buildTypes,在打包時把主目錄與自定義的buildType目錄合併,每個buildType對應一個渠道,實現多渠道打包。

 

在實際操作中,針對不同的待打包檔案,還要採取不同的方式:

1、配置檔案,增設引數,在打包時讀取不同版本的引數;

2、資原始檔,各版本準備與主版本不同的資原始檔,在打包時合併或置換;

3、程式碼檔案,各版本準備自己需要的程式碼檔案,或在程式碼中針對不同的版本修改業務邏輯;

規則

1、資原始檔的覆蓋,圖片、音訊、 XML 型別的 Drawable 等資原始檔,將會進行檔案級的覆蓋。

 

2、資原始檔的合併,字串、顏色值、整型等資源以及 AndroidManifest.xml ,將會進行元素級的覆蓋(不同版本只要寫與主版本不同的元素即可)。

 

3、程式碼資源的準備,程式碼檔案不會覆蓋或合併,同一個類檔案, 在不同目錄(buildTypes 、 productFlavors 、 main)中只能存在一次,否則會有類重複的錯誤。

 

這種做法的問題是,由於main目錄下不能有這個程式碼檔案,所以每個版本都需要維護一個本版本的程式碼檔案,在後續開發中會有嚴重的程式碼檔案冗餘問題。

如果程式碼變動不大,沒必要使用多個程式碼檔案,可以在gradle中定義一個與版本有關的常量,在程式碼中根據這個常量判斷版本,輸出不同的業務邏輯

 

需要說明的是,在製作不同版本的java檔案時,會發現圖示不是熟悉的java程式碼的藍色圖示,只是普通的資料夾圖示,裡面也不能右鍵建立package,這是因為當前的Build Variants不是當前版本,AS並沒有使用那部分程式碼,在Build Variants中更換為當前版本即可。

 

4、覆蓋等級為:buildTypes > productFlavors > main。

實踐

一個從零開始做gradle多渠道打包的流程如下:

首先,我們要為每個版本建立BuildTypes及對應的檔案目錄

 

點開左下角的Build Variant,可以看到多版本的配置已經生效

 

根據上文所述,根據各版本需要更換資原始檔

 

編寫xml資源中待替換的元素

 

製作各版本的java程式碼檔案

 

再次強調,這種方式下,在main中不能有同名程式碼檔案。

或者自定義版本常量,在main的程式碼中編寫各版本的業務邏輯

 

打包時,可以選擇多個版本一起打包

 

生成多個apk檔案

 

一個簡單的多渠道打包過程就完成了。

速度問題與快速多渠道打包

Gradle多渠道打包最大的問題是速度太慢,像上文那樣同時打包3個apk,其實就是依次打3個apk,消耗的時間遠遠超過打包1個,如果待發布的產品版本過多(幾十個),一次打包消耗的時間就很可觀了,還依賴gradle就不合適了。

這種情況下,一個好的作法是先用gradle打包,把得到的apk當做壓縮包,用自定義工具去直接修改apk檔案。

所以快速多渠道打包的基本原理是:先製作1個基礎apk,然後自己寫一個配置工具,去批量地解壓縮基礎apk並修改檔案,從而取得較快的釋出速度。

在Github上有一個很實用的開源專案,快速多渠道打包開源專案AndroidMultiChannelBuildTool,是使用Python實現的,使用也很簡單,本文在此不再贅述。

利用多渠道輔助開發

Gradle多渠道打包不限於製作apk,在debug時也會起作用,我們可以利用這一點輔助開發。

例如,我們可以在開發過程中模擬後臺資料,這樣可以在後臺服務介面開發滯後時,先完成Android端的業務開發。

前面說過,在多渠道打包會出現多個Build Variants

 

在這裡選擇需要debug的版本,就可以mock模擬資料。

利用這樣的原理,我們可以製作一個mock版本,在開發前期使用mock版本模擬返回服務端資料,在連線後臺除錯和產品釋出時,使用prod版本釋出,而他們使用的業務邏輯都是main中的同一套程式碼,所以能很好的加速開發。

附錄

Android高階技術大綱,以及系統進階視訊;

 

附錄一;Android高階技術大綱

附錄二;Android進階系統資料視訊

獲取方式;

加Android進階群;701740775。即可前往免費領取。免費備註一下csdn

相關文章