Android APK打渠道包實施方案

第一夫人發表於2024-09-27

最近剛好在做Android打渠道包相關的需求,記錄下心得筆記,希望給有需要的朋友一個參考。

首先,我們來理解下概念:

1、母包(就是原始的安卓包)

2、渠道標識(自定義的各個渠道標識,例如:baidu,xiaomi,uc等等)

3、渠道包(在母包中打入了渠道標識之後,生成的新安卓包)

其實就這3個東西,那麼我們有了母包,有了渠道標識,如何來獲取到我們需要的渠道包呢,需要用到哪些技術,哪些資源呢?這是大家最關心的點!

技術:Java、NodeJS、Python等其他語言開發的打包工具,後面會說目前流行的一些打包方案

資源:ECS伺服器、物件儲存、域名、CDN、Serverless、函式計算等等

初級思路:

1、把打包工具部署在ECS上,並部署打包需要的語言環境,java環境,Python環境,NodeJS環境等

2、母包也存放在ECS上,打好的渠道包也存放在ECS伺服器上

3、根據業務策略,把ECS上打好的渠道包同步到物件儲存上

4、使用CDN訪問物件儲存上的渠道包資源,達到加速的效果

透過這個思路,是可以實現最終的目的,但是方案不夠完美,例如:

1、母包、渠道包存放在ECS上,需要維護儲存空間

2、ECS伺服器配置問題,太高吧,成本也高,太低吧,影響打包效率

3、需要自己部署和維護打包環境

我現在用的Walle這個方案跑的專案!

最佳化思路:

1、取消打包用的ECS伺服器

2、母包、渠道包完全存放在物件儲存裡面

3、使用Serverless、函式計算服務來實現打包

目前流行的方案對比和說明

Android APK打渠道包實施方案

Walle:美團開發的Android Signature V2 Scheme簽名下的新一代渠道包打包神器,專案地址:https://github.com/Meituan-Dianping/walle

VasDolly:騰訊開發的Android V1 and V2 Signature Channel Package Plugin,專案地址:https://github.com/Tencent/VasDolly/

ApkTool和Android Gradle Plugin:安卓開發的小夥伴應該都很熟悉了!

EdgeOne邊緣APK動態打包騰訊雲 EdgeOne +騰訊雲 COS + 騰訊雲 SCF 產品組合在邊緣實現 Android APK 多渠道的動態打包方案

渠道資訊注入形式說明:

動態:無需把渠道資訊真的打入到母包裡面,一般是透過【加速域名+渠道標識引數】來訪問母包,動態的將渠道標識插入到母包裡面並返回給客戶端下載

靜態:需要把渠道資訊真的打入到母包裡面,生成一個新的渠道包

渠道資訊注入端說明:

邊緣:渠道資訊寫入的包是加速節點上的包

源站:渠道資訊寫入的包是源站裡面的母包

理解了這些概念,接下里我們一起看看,EdgeOne邊緣APK動態打包是如何實現的,先來一張流程圖

Android APK打渠道包實施方案

從圖上,我們可以總結出如下幾個步驟:

1、原始母包(A)上傳到COS

2、自動觸發函式計算將原始母包處理成一個新的母包(B)

3、使用者使用加速域名+渠道引數請求新母包(B)

4、觸發函式計算,將渠道資訊動態注入到新母包裡面,得到一個渠道包(C)

5、將渠道包(C)返回給使用者下載安裝

整個過程,出現3個包,我分別用ABC來標註了

A包很好理解,就是我們的原始母包,存放在COS上

B包也好理解,就是函式計算自動處理之後得到一個新的包,也存放在COS上

C包,其實這裡是不可見的,但是使用者最終下載得到的就是C包,但是這個C包又沒有存放在COS裡面 ,那麼它在哪裡呢,我認為它是存放在加速節點上,快取起來了,就像我們使用CDN訪問一個圖片資源一樣,一旦節點上有快取了,那麼之後訪問就不會到源站來訪問,而是直接訪問節點上的資源,所以說,C包對我們來說,其實是透明的,我們也不用過分多關注它,知道是這麼回事兒就可以了。

那麼這裡的A包和B包有什麼區別呢,這就是步驟2裡面函式計算實現的功能,函式計算向A包注入了空白資料,並重新生成了一個合法的B包,為後面的C包提供了基礎

這裡的【注入空白資料】的相關知識,涉及到V1版本簽名,V2版本簽名等原理,有需要的小夥伴,自行查閱資料瞭解,這裡不展開細說。

最後,獲取到的渠道包如何驗證和獲取包體裡面的渠道標識,Walle和VasDolly開發裡面都有介紹!

相關文章