![]()
本文轉(zhuǎn)自: http:///Android/2016/02/29/flavors-with-gradle/?utm_source=tuicool&utm_medium=referral 在使用Gradle來(lái)打包Android應(yīng)用之前,Android自動(dòng)化打包通常會(huì)選擇使用ant,ant是一種一步一步來(lái)執(zhí)行任務(wù)的工具,通常打包一個(gè)apk要經(jīng)過(guò)一個(gè)復(fù)雜的過(guò)程,ant工具通過(guò)一步一步完成這些過(guò)程來(lái)生成一個(gè)apk。如果要實(shí)現(xiàn)一個(gè)復(fù)雜一點(diǎn)的打包過(guò)程,它的xml配置文件的長(zhǎng)度也是足以讓你崩潰的。Gradle的出現(xiàn)讓打包過(guò)程變得十分輕松,而且配置起來(lái)也是簡(jiǎn)單易懂。以前需要寫(xiě)好幾天的配置文件現(xiàn)在只要簡(jiǎn)單的幾步就能完成,配合Android Studio更加得心應(yīng)手。
一個(gè)完整的打包流程如下: 基本的build.gradle如果你用Android Studio生成一個(gè)項(xiàng)目的話,在app模塊中你會(huì)看到一個(gè)build.gradle文件,這個(gè)文件就是配置這個(gè)模塊的地方,大致文件結(jié)構(gòu)如下:
這里就不一行行地解釋了,關(guān)于Gradle的語(yǔ)法可以自行Google。 這里主要有兩個(gè)小技巧:
BuildVariantsGradle的Android插件中有個(gè)BuildVariants的概念,其實(shí)簡(jiǎn)單來(lái)說(shuō)其實(shí)就是buildTypes+productFlavors,buildType前面我們看到過(guò)了,主要就是debug和release的分別。而productFlavors就是我們用來(lái)打包不同版本app的主要方式。從字面意思來(lái)翻譯指的就是不同的“產(chǎn)品特點(diǎn)”。 Android Studio會(huì)自動(dòng)根據(jù)build.gradle 生成對(duì)應(yīng)的BuildVariants。比如以下代碼:
會(huì)生成以下的BuildVariants:
productFlavors的維度productFlavors可以是多維的,聽(tīng)起來(lái)好像很難理解,這里舉個(gè)栗子,有如下代碼:
能夠生成如下的BuildVariants:
這里我們就可以看到,我們有兩個(gè)維度,一個(gè)是是否免費(fèi),另一個(gè)是渠道,我們能夠生成2*2=4種Flavor,并且每個(gè)Flavor都有debug和release,總共就有8種不同的APK。所以理論上來(lái)說(shuō)通過(guò)組合Flavor,我們可以做到各種不同的分類(lèi)。 接下來(lái)我們來(lái)看看productFlavors能做什么? ### 定義渠道 在國(guó)外一般來(lái)說(shuō)開(kāi)發(fā)者不太需要去管渠道的問(wèn)題,他們的App只需要發(fā)往GooglePlay就可以了,但是在中國(guó),我們有眾多的APK分發(fā)平臺(tái),我們的APK需要發(fā)往各種地方,在做APP統(tǒng)計(jì)的時(shí)候我們就需要在APK里寫(xiě)入一些特征變量,發(fā)送到統(tǒng)計(jì)平臺(tái),以區(qū)分不同的渠道,在過(guò)去用ant打包的時(shí)代,我們通常的做法就是用不同的渠道名來(lái)重復(fù)ant任務(wù)一遍一遍地打包。 如果用gradle:我們可以通過(guò)增加一個(gè)名為channel的dimension來(lái)給每一個(gè)渠道一個(gè)特殊標(biāo)示,代碼就是我們之前看到的。但是你可能會(huì)問(wèn),我怎么在統(tǒng)計(jì)的時(shí)候獲取這個(gè)渠道名呢?其實(shí)很簡(jiǎn)單,Android Studio會(huì)為我們生成一個(gè)名叫BuildConfig的類(lèi),這個(gè)類(lèi)有一些關(guān)于打包的靜態(tài)變量,下面是一個(gè)示例:
其實(shí)不止是渠道,通過(guò)這個(gè)類(lèi)我們還可以很方便地獲得這個(gè)APK的各種信息。相信大家一眼就能看出來(lái)每個(gè)字段的意思。(我們甚至還可以自定義字段)。 如果渠道非常多,你也可以通過(guò)讀配置文件的方式動(dòng)態(tài)生成不同的flavors。 如果我每個(gè)flavor都有點(diǎn)特別呢?有的時(shí)候我們每個(gè)flavor可能不只是一個(gè)渠道名這么簡(jiǎn)單,我的ICON可能給每個(gè)渠道的有所不同,我的包名也可能有所不同。所有這些,都可以直接在這個(gè)flavor中重新定義:
如果需要不同的源代碼或資源文件,可以在app/src下新建一個(gè)名為“flavor名”的目錄(這里就是googleplay)。也就是app/src/googleplay,然后這個(gè)目錄下的結(jié)構(gòu)和app/src/main中是一樣的,打包的時(shí)候會(huì)優(yōu)先使用當(dāng)前flavor下的文件。 其他Gradle小技巧Provider名稱我們知道Provider的authority是系統(tǒng)中全局唯一的,有時(shí)候我們要為不同的flavor將authority改成不同的,通過(guò)gradle你可以這樣實(shí)現(xiàn):
你問(wèn)我Java代碼中怎么獲取?難道你忘了BuildConfig了嘛? Manifest 占位符有些SDK會(huì)把配置在Manifest文件中的meta信息里,而不同的flavor這個(gè)信息不一樣,這是我們可以通過(guò)Manifest 占位符來(lái)實(shí)現(xiàn):
總結(jié)Gradle的靈活程度超乎想象,如果基本功能無(wú)法滿足你,你還可以通過(guò)自己編寫(xiě)Groovy插件或者task來(lái)實(shí)現(xiàn)無(wú)窮的可能性,歡迎將你的思路分享出來(lái)~ |
|