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(3.1.4)實現多渠道打包AndroidGradle
- android gradle 多渠道打包小結AndroidGradle
- Webpack原理與實踐(一):打包流程Web
- Android 多渠道打包開發記錄Android
- Android持續整合:Jenkins+Gradle+360加固+多渠道打包AndroidJenkinsGradle
- 開發常用的輔助函式函式
- 多渠道打包
- Android多渠道打包Android
- 一鍵快速切換開發環境以及多渠道打包開發環境
- Android 多渠道打包配置Android
- Gradle理論與實踐四:自定義Gradle外掛Gradle
- iOS開發·runtime原理與實踐: 基本知識篇iOS
- Android開發 - 掌握ConstraintLayout(七)輔助線(Guideline)AndroidAIGUIIDE
- Android開發 - 儲存輔助類 SharedPreferences 解析Android
- 使用 Tye 輔助開發 dotnet 應用程式
- Gradle最佳實踐Gradle
- Walle —— Android多渠道打包神器Android
- 優酷鴻蒙開發實踐|優酷 Android 與HarmonyOS Hap 混合打包鴻蒙Android
- 《SpringBoot實戰開發》——基於Gradle+Kotlin的企業級應用開發最佳實踐Spring BootGradleKotlin
- AI輔助Kano模型進行產品開發AI模型
- angr原理與實踐(一)——原理
- Webpack原理與實踐Web
- AI 輔助前端開發實戰:讓 AI 成為你的程式設計助手AI前端程式設計
- 使用PHP輔助快速製作一套自己的手寫字型實踐PHP
- 基於大模型LLM(包括ChatGPT)的應用開發與輔助程式設計技能大模型ChatGPT程式設計
- Android Gradle指令碼解決美團多渠道打包再加固渠道資訊丟失問題AndroidGradle指令碼
- Docker容器的原理與實踐 (下)Docker
- Flutter原理與美團的實踐Flutter
- Spring Boot Enable* 的原理與實踐Spring Boot
- Flink Sql Gateway的原理與實踐SQLGateway
- Vue CLI 原理與實踐Vue
- MelGan原理與實踐篇
- 聊聊併發(三)——同步輔助類
- Android美團多渠道打包Walle整合Android
- Android多渠道打包相關介紹Android
- IDEA建立Gradle工程-實踐IdeaGradle
- 《流程引擎原理與實踐》開源電子書