Questin:遇到不同的網(wǎng)絡(luò)環(huán)境(類似測(cè)試環(huán)境租漂,發(fā)布環(huán)境)之間的切換阶女,你會(huì)怎么做呢?如何一次打出多個(gè)渠道包呢哩治?
一秃踩,多版本
基于buildTypes
(1)debug:調(diào)試版本,無(wú)混淆
(2)release:發(fā)布版本,有混淆、壓縮
二业筏,多環(huán)境
基于productFlavors
(1)develop:開(kāi)發(fā)環(huán)境憔杨,開(kāi)發(fā)和自測(cè)時(shí)使用
(2)check:測(cè)試環(huán)境,克隆一份生產(chǎn)環(huán)境的配置蒜胖,在這里測(cè)試通過(guò)后消别,再發(fā)布到生產(chǎn)環(huán)境。
之所以沒(méi)命名為test是因?yàn)樵趃radle編譯時(shí):ProductFlavor names cannot start with 'test'
(3)product:生產(chǎn)環(huán)境台谢,正式提供服務(wù)的寻狂。
三,多渠道
基于Android新的應(yīng)用簽名方案APK Signature Scheme v2中的APK Signing Block區(qū)塊
我這里使用的是美團(tuán)封裝的Walle庫(kù)朋沮。使用Walle庫(kù)請(qǐng)確保你的Android Gradle 插件版本在2.2.0以上蛇券。
為什么不直接使用productFlavors來(lái)打包多渠道?因?yàn)閜roductFlavors打多渠道包太慢了,打30個(gè)包差不多十幾分鐘怀读,無(wú)法忍受诉位!
為什么不使用美團(tuán)之前基于META-INF進(jìn)行渠道標(biāo)識(shí)的方案?因?yàn)锳ndroid7.0之后的這種黑科技已經(jīng)失效了菜枷!
用法:
1苍糠、配置build.gradle
(1) 在位于項(xiàng)目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴, 如下:
buildscript {
? ? dependencies {
? ? ? ? classpath 'com.android.tools.build:gradle:2.2.3'
? ? ? ? classpath 'com.meituan.android.walle:plugin:1.0.3'
? ? }
}
(2) 在當(dāng)前App的 build.gradle 文件中apply這個(gè)插件啤誊,并添加上用于讀取渠道號(hào)的aar
(3) 這里岳瞭,我根據(jù)不同的環(huán)境生成了不同包名的apk,方便在手機(jī)上同時(shí)安裝多個(gè)環(huán)境的應(yīng)用蚊锹。為了讓gradle動(dòng)態(tài)更改apk的名稱和圖標(biāo)瞳筏,我們需要在manifest文件中使用{app_name}等占位符。
(4) 在代碼中獲取多渠道信息
String channel=WalleChannelReader.getChannel(getApplicationContext());
(5) 在代碼中獲取多環(huán)境信息
intenvType=BuildConfig.ENV_TYPE;
這里的BuildConfig是由gradle動(dòng)態(tài)生成的:
而ENV_TYPE這個(gè)字段其實(shí)就來(lái)自于我們的build.gradle:
這里我們最好定義一個(gè)常量類區(qū)分這些環(huán)境的類型:
2牡昆、打包多環(huán)境
這里我們直接執(zhí)行assemble命令姚炕,打包所有的buildType*productFlavors
或者使用命令行也可以:
gradle assemble
這里我們可以看到debug包都是1.4M,而release包都是0.7M,顯然丢烘,我們的混淆和壓縮配置是生效了的柱宦,雖然這里我并沒(méi)寫(xiě)混淆規(guī)則。
這樣播瞳,我們就可以在代碼中掸刊,根據(jù)環(huán)境字段envType的不同,來(lái)選擇不同的網(wǎng)絡(luò)環(huán)境了赢乓。
3忧侧,打包多渠道
在Project的根目錄下新建channel文件:
執(zhí)行g(shù)radle命令:
(1) 打包文件內(nèi)的渠道包
gradle assembleProductRelease -PchannelFile=channel
(2) 打包自定義數(shù)組內(nèi)的渠道包
gradle assembleProductRelease -PchannelList=qihu,vivo,lenovo
關(guān)于Walle庫(kù)的更多使用:詳見(jiàn)Github-walle
最后,奉上源碼:WalleDemo