Gradle多渠道打包的原理、實踐與輔助開發
背景
在釋出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
相關文章
- Flutter 多渠道打包實踐Flutter
- Android使用Gradle實現多渠道打包AndroidGradle
- Android多渠道打包實踐Android
- Gradle For Android(二) 多渠道打包與簽名配置GradleAndroid
- Android 詳解Gradle(3.1.4)實現多渠道打包AndroidGradle
- Gradle 實現 Android 多渠道定製化打包GradleAndroid
- Gradle實戰:Android多渠道打包方案彙總GradleAndroid
- android gradle 多渠道打包小結AndroidGradle
- Gradle模組化配置及多渠道打包Gradle
- 關於Android studio Gradle 實現多渠道打包AndroidGradle
- Android Studio 使用Gradle多渠道打包AndroidGradle
- Gradle for Android系列之五 多渠道打包GradleAndroid
- Webpack原理與實踐(一):打包流程Web
- Android 多渠道打包開發記錄Android
- Gradle for Android(三)多渠道打包、配置簽名資訊GradleAndroid
- 多渠道打包
- Android多渠道打包工具Gradle外掛使用詳解AndroidGradle
- Gradle prodcutFlavors 多渠道Gradle
- 借騰訊開源 VasDolly,談談 Android 簽名和多渠道打包的原理!Android
- Android持續整合:Jenkins+Gradle+360加固+多渠道打包AndroidJenkinsGradle
- 優酷鴻蒙開發實踐|優酷 Android 與HarmonyOS Hap 混合打包鴻蒙Android
- 史上最詳細的Android Studio系列教程六--Gradle多渠道打包AndroidGradle
- 一鍵快速切換開發環境以及多渠道打包開發環境
- Android多渠道打包Android
- Android 生成簽名apk與多渠道打包AndroidAPK
- RocketMQ的原理與實踐MQ
- iOS開發·runtime原理與實踐: 基本知識篇iOS
- Android 自動化打包實踐 gradle打包並推送到git遠端庫AndroidGradleGit
- Android 多渠道打包配置Android
- angr原理與實踐(一)——原理
- Webpack原理與實踐Web
- Flutter原理與美團的實踐Flutter
- Gradle理論與實踐四:自定義Gradle外掛Gradle
- Walle —— Android多渠道打包神器Android
- android多渠道打包最快方案Android
- Gradle最佳實踐Gradle
- Docker容器的原理與實踐 (下)Docker
- MelGan原理與實踐篇