注 此文是之前配置的方案,好處在于通過文件的方式隔離配置參數(shù),壞處在于不夠簡(jiǎn)潔究西,在下目前提供一種更加便捷的環(huán)境配置方案,后來的小伙伴可以自行選擇之勘天,個(gè)人傾向于此種配置方案怔揩,對(duì)應(yīng)的文章地址為 android 更為簡(jiǎn)潔的gradle 參數(shù)配置 - 簡(jiǎn)書。
此文只是簡(jiǎn)單的通過配置變量的方式實(shí)現(xiàn)配置信息之間的切換脯丝,除去了頻繁更改地址、開關(guān)伏伐、AppKey等其它的配置信息宠进。
本篇文章簡(jiǎn)單的使用了gradle的生命周期,有興趣的童鞋可以自行百度了解一下藐翎。
一般android studio剛創(chuàng)建的project的setting.gradle文件只包括一行: ?
這一行的意思是構(gòu)建mutiProject材蹬,按照正常的邏輯來說,其實(shí)android studio創(chuàng)建的每個(gè)module都算是一個(gè)單獨(dú)的Project吝镣,而gradle通過構(gòu)建此文件堤器,將這些項(xiàng)目統(tǒng)一構(gòu)建為mutiProject。
gradle的構(gòu)建過程簡(jiǎn)單理解如下所示:
setting.gradle文件只有一份末贾,這也就意味著整個(gè)mutiProject的gradle對(duì)象只有一份闸溃,它可以在任何project的gradle文件當(dāng)中獲取到這個(gè)對(duì)象。
build.gradle文件有多份,每個(gè)module下存在于單個(gè)build.gradle文件辉川,這就意味著表蝙,每個(gè)module都具備單獨(dú)的project對(duì)象,這就意味著每個(gè)module都是一個(gè)單獨(dú)的project乓旗。
setting.gradle文件對(duì)應(yīng)著gradle對(duì)象的初始化府蛇,那一般的初始化操作可以在此gradle腳本文件當(dāng)中運(yùn)行,但不要原始生成的include標(biāo)簽?zāi)ㄈビ煊蓿@是gradle構(gòu)建mutiProject關(guān)鍵所在汇跨。
首先,我在項(xiàng)目當(dāng)中配置了debug.properties以及release.properties,這兩個(gè)文件:
第二步妆距,在gradle.properties文件當(dāng)中定義一個(gè)boolean值IS_RELEASE_MODE穷遂,這個(gè)變量就是加載配置了debug和release兩個(gè)版本的配置文件的開關(guān),如果有多種配置信息的毅厚,請(qǐng)改用字符串定義變量塞颁。,true表示Release參數(shù)吸耿,false代表debug參數(shù)祠锣。
注:此處不得不說一下,gradle.properties文件當(dāng)中的屬性咽安,我暫且這樣理解為伴网,在setting.gradle文件初始化gradle對(duì)象的時(shí)候,這個(gè)文件當(dāng)中的屬性已經(jīng)默認(rèn)加載到這個(gè)gradle對(duì)象當(dāng)中妆棒,所以這個(gè)文件當(dāng)中定義的屬性是可以直接調(diào)用澡腾。
第三步,setting.gradle當(dāng)中讀取文件當(dāng)中定義屬性代碼展示如下(請(qǐng)配合參考groovy語言糕珊,$符是腳本語言的通用處理符號(hào))
同時(shí)动分,如果想后期讀取自己定義的properties文件,這時(shí)候就需要用來gradle對(duì)象的擴(kuò)展屬性红选,對(duì)于gradle的擴(kuò)展屬性是通過gradle.ext標(biāo)識(shí)符來完成的澜公,特別聲明,gradle.ext.屬性名只需要在第一次賦值的時(shí)候需要帶上ext標(biāo)簽喇肋,在后面的過程可以直接gradle.屬性名進(jìn)行任意的更改和取值坟乾。
調(diào)用讀取配置文件的方法
基本參數(shù)配置完畢,可以通過gradle指令(gradlew clean指令就可觀察對(duì)應(yīng)擴(kuò)展屬性的值)在IS_RELEASE_MODE=true的情況下蝶防,輸出如下所示甚侣。
如果諸位童鞋覺得這個(gè)指令等待時(shí)間過長(zhǎng),那就自定義一個(gè)task间学,運(yùn)行指令如上圖所示殷费,task的代碼塊是定義在project 類當(dāng)中印荔,所以只能在build.gradle文件當(dāng)中進(jìn)行配置:
以上gradle的ext擴(kuò)展屬性對(duì)應(yīng)配置腳本信息已經(jīng)完畢。而這里需要解釋的是上文當(dāng)中有兩種讀取配置文件屬性的處理方式宗兼,下文會(huì)具體指出其中需要注意的地方躏鱼。
第四步,在依賴的最頂層的libray 當(dāng)中的build.gradle中做如下配置殷绍,為什么說要在最頂層的libray當(dāng)中做這個(gè)配置染苛,這是由于每個(gè)project(也就是as當(dāng)中的module)都會(huì)在build當(dāng)中生成對(duì)應(yīng)自己build.gradle當(dāng)中配置的BuildConfig.java類,所以主到,把這些配置信息放到最頂層的庫茶行,是為了其它依賴者也能夠公用這個(gè)庫的BuildConfig.java類。具體配置如下:
gradle編譯完畢之后會(huì)在當(dāng)前build.gradle對(duì)應(yīng)的project的build目錄下生成BuildConfig類:
同時(shí)登钥,在gradle.properties當(dāng)中將IS_RELEASE_MODE=false畔师,BuildConfig編譯完畢之后就能完成debug.properties文件屬性值的切換。
到了這個(gè)地方牧牢,按照以上步驟走看锉,基本上可以解決多個(gè)版本配置信息之間的切換了。但上面提到的兩種屬性處理方式塔鳍,在這里伯铣,我就通過未定義到BuildConfig的TEST7 屬性來說明具體原因,這個(gè)點(diǎn)具體如下所示轮纫,如果我將TEST5采用非字符串的處理方式腔寡,BuildConfig如下所示:
這就導(dǎo)致BuildConfig.java文件默認(rèn)報(bào)錯(cuò),我想大家還有一種比較簡(jiǎn)單的處理方式掌唾,那就是在配置文件當(dāng)中直接對(duì)需要加在字符串的直接加上字符串就行了放前,我為了統(tǒng)一性,采用代碼控制了這個(gè)問題糯彬,為了配置文件的屬性的統(tǒng)一性凭语。
下面單獨(dú)說下這個(gè)TEST7屬性的處理方式:在第三方sdk當(dāng)中經(jīng)常有<meta-data />標(biāo)簽形式定義的APP_KEY模式,這個(gè)就可以通過android 代碼塊中的maniPlaceHolder實(shí)現(xiàn)撩扒。
我想大家已經(jīng)get到這個(gè)TEST7使用的點(diǎn)了叽粹,對(duì),沒錯(cuò)却舀,它一般用于和AndroidManifest.xml完成變量的交互,它采用非字符串讀取方式的處理方式锤灿,那是因?yàn)樵谀J(rèn)加載到AndroidManifest.xml中的這個(gè)變量會(huì)被處理為字符串格式挽拔,也可以簡(jiǎn)單理解,系統(tǒng)內(nèi)部已經(jīng)做了字符串的添加操作但校,這時(shí)候再來一次的話螃诅,就會(huì)導(dǎo)致清單文件的這個(gè)變量讀取成帶字符串的值,這會(huì)導(dǎo)致第三方SDK或其它情況的錯(cuò)誤。(請(qǐng)注意术裸,有興趣的同學(xué)可以按照字符串方式處理倘是,然后反編譯,可以很清楚的在清單配置文件當(dāng)中看到這個(gè)變量的value值袭艺。)
demo指向搀崭,能用代碼說話,就別說廢話了--https://github.com/kaycool/EnvironmentConfigDemo