在日常開發(fā)中我們經(jīng)常會有多渠道分發(fā)的需求休雌,那么如果針對每個渠道都打包一次那簡直是不舒服斯基到死假瞬,作為以“懶”作為標(biāo)簽的程序員群體镶苞,干這種重復(fù)性的工作喳坠,那感覺簡直不要太酸爽,簡直讓人分分鐘切腹宾尚。所以我們就會想能不能寫個腳本文件丙笋,我只干一次打包的活,所有渠道的包都能生成好煌贴。很明顯是可以的御板,要不然這不是打作者的臉嗎!為了不被打臉——我轉(zhuǎn)載引用一下各位前輩大神的博客(謝謝各位前輩和大神為了不讓我被打臉?biāo)龀龅耐怀鲐暙I(xiàn)牛郑,謝謝5±摺)
Android Studio系列教程六--Gradle多渠道打包
ok,這就一定程度上解決了我們多渠道打包的需求淹朋,但是現(xiàn)在我有一個新的需求:針對不同的渠道需要使用不同的包名笙各,加載不同的資源,源碼使用差異化的實(shí)現(xiàn)础芍。
有得童鞋可能就要說了杈抢,你這包名都不一致,還需要加載不同的資源仑性,源碼還需要差異化實(shí)現(xiàn)惶楼,這簡直就是不同的App了。那我們就用不同的項(xiàng)目來處理這個需求就好了诊杆。但是我們仔細(xì)想一想歼捐,這種方式只適合于不做迭代升級的“一錘子買賣”,如果需要迭代升級晨汹,那酸爽我想應(yīng)該誰用誰知道豹储。
好吧,有需求我們肯定得想辦法去解決淘这,那么今天我就跟大家聊聊剥扣,怎么在一個項(xiàng)目中實(shí)現(xiàn)Android多渠道打包,而且這些渠道的資源和源碼實(shí)現(xiàn)上還存在一定差異化(說到這里铝穷,可能有些朋友又想到了一個新方案朦乏,將共有部分提取出來作為一個SDK而存在,每個渠道都去引用這個SDK 氧骤,這可能在一定程度能解決我們存在的問題,但是有點(diǎn)殺雞用牛刀吃引。我們姑且不談)筹陵。
我們先來看看設(shè)置多渠道后的效果:
我們在app的build.gradle文件中加入如下代碼:
productFlavors {
publicVersion {
applicationId "com.york.pub"
}
customVersion {
applicationId "com.york.custom"
}
TestVersion {
applicationId 'com.york.test'
}
}
我們可以看到如下效果
也就是說生成了debug和release都有了三個渠道刽锤,而且每個渠道使用不同的包名。這個可以說在一定程度上解決了我們多包名打包的問題朦佩。但是如果使用不同的包名并思,一般情況下我們都會在不同的渠道下有著特殊的要求——資源文件的差異性和某些特定頁面的代碼邏輯差異性。這個問題好像有些棘手语稠,我們可以考慮做這樣一個嘗試:因?yàn)槲覀兊脑创a和資源文件都是在src目錄下宋彼,那么我們是不是可以在src目錄下針對不同的渠道建立不同的文件夾,并且通過某種方法在編譯和打包時(shí)指定某個渠道使用某個目錄下的源代碼和資源文件仙畦。那么就變成了這樣一個狀態(tài):
我們對比一下在android studio main目錄下文件夾
到這里我們基本可以得出我們這種實(shí)踐是可行的的結(jié)論输涕,因?yàn)檫@兩個目錄的文件夾的顏色和標(biāo)識是一致的,也就是說android studio識別我們這種做法慨畸。那么我們試下切換一下渠道莱坎,看看是不是與我們預(yù)想的一致
到這里我們可以確定這個方案是可行的了。至于具體的測試和驗(yàn)證就留給各位童鞋自己去做了寸士,我這邊就不湊字?jǐn)?shù)了檐什。在這里我給大家?guī)讉€我在測試和使用過程中的幾點(diǎn)發(fā)現(xiàn):
1、文件夾名稱一定要跟我們在build.gradle文件中定義的渠道名一致弱卡,否則不被識別
2乃正、編譯時(shí)加載的源代碼文件和資源文件是main目錄和對應(yīng)的渠道目錄的并集,對于資源文件會優(yōu)先加載對應(yīng)渠道目錄下的資源文件婶博,對于源碼文件而言瓮具,包結(jié)構(gòu)需要于main目錄一致(不需要用到的包可以沒有),并且在渠道文件夾中凡蜻,需要做邏輯改變的文件應(yīng)該區(qū)別的放到各對應(yīng)渠道文件夾的對應(yīng)包名中搭综,同時(shí)不應(yīng)該在main目錄中保持有與渠道文件中相同文件名的文件(所在包也一致)
3、 渠道定義時(shí)同樣可以定義除包名外的其他區(qū)分屬性