Android 利用Gradle實現(xiàn)app的環(huán)境分離

環(huán)境分離

有過互聯(lián)網軟件開發(fā)經驗的朋友一定對于測試環(huán)境和生產環(huán)境這兩個詞很是熟悉鹃愤,一般軟件開發(fā)階段都是在測試環(huán)境(比較常用的是內網環(huán)境)上運行調試呜师,而正式打包發(fā)布時會配置生產環(huán)境(也稱之為線上環(huán)境)的服務器峡扩,也就是不同的接口URL和數(shù)據(jù)庫的區(qū)別昼激。在開發(fā)和測試階段限煞,我們常常需要在同一個設備上同時安裝著兩套甚至多套環(huán)境的同一個應用抹恳,便于觀察調試。

但對于Android App來講署驻,相同包名的apk在同一個設備上只能存在一個奋献。所以我們無法做到在同一個設備上同時安裝生產環(huán)境和測試環(huán)境的安裝包,這對于日常的開發(fā)工作和測試人員的測試工作極不方便旺上∑柯欤總不能將整個工程復制一份,再通過修改包名的方式打包出另一個apk吧宣吱。所以在這種情況下窃这,以往常見的做法就是在app中提供一個隱形的入口,供內部人員切換服務器地址征候,然后通過以下代碼重啟App:

private void restartApp(){
    Intent intent = getContext().getPackageManager().getLaunchIntentForPackage(getContext().getPackageName());
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

顯然杭攻,這種做法也只是一種緩兵之計,多少還是有些不盡人意疤坝。然而兆解,值得慶幸地是,進入Android Studio時代后跑揉,Google開始使用引入Gradle構建系統(tǒng)锅睛,applicationId的出現(xiàn)使得環(huán)境分離的問題迎刃而解。

package 與 applicationId

在使用Eclipse開發(fā)Apk或舊版本的Gradle構建系統(tǒng)中畔裕,應用的包名由AndroidManifest.xml文件中package屬性決定衣撬。同時,這個package還被用來定義命名被引用的資源類R文件扮饶。

但是在新的Android Gradle構建系統(tǒng)中具练,package屬性的兩大作用得到了解藕:applicationId作為應用的唯一標識符(包名),用于區(qū)分不同應用甜无;package屬性定義資源類R文件扛点,用于引用哥遮。

applicationId存在于app/build.gradle文件中的defaultConfig配置下,新建項目時默認使用package屬性值初始化陵究,所以如果沒有特殊的需求眠饮,一般我們不會在意和修改這個值:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1"

    defaultConfig {
        applicationId "com.example.my.app"
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    ...

所以,要實現(xiàn)Apk的環(huán)境分離铜邮,也就是在同一設備上安裝同一應用的不同版本仪召,從本質上我們要修改applicationId的值,構建打包出不同包名的apk安裝文件松蒜。Gradle構建系統(tǒng)提供了兩種方式供開發(fā)人員修改applicationId的值扔茅,productFlavors和buildTypes,通過這兩個方式我們可以輕松實現(xiàn)apk的打包定制秸苗,或者說Build Variants(構建變種)召娜。

Build Variants

項目的productFlavors和buildTypes配置可以在app/build.gradle代碼文件或者Project Structure上修改,作用是一樣的惊楼。

productFlavors

項目可以通過定義多個不同的productFlavors來實現(xiàn)應用的不同定制版本玖瘸,每一個Flavor與buildTypes配合產出對應的一種輸出類型的apk文件,新建的項目初始化只有一個默認的Flavor:defaultConfig

productFlavors.png

注意:默認的defaultConfig為新建的productFlavors提供基本的配置檀咙,也就說雅倒,productFlavors的配置會覆蓋defaultConfig中相同的屬性,從而實現(xiàn)產品的不同定制版輸出弧可。對于環(huán)境分離屯断,這里可以通過定義新的applicationId屬性來實現(xiàn)。

buildTypes

默認情況下侣诺,項目的buildTypes包含debug和release兩個構建版本,其中release版本的執(zhí)行需要手動設置簽名文件氧秘。對于環(huán)境分離年鸳,與productFlavors不同的是,buildTypes通過定義applicationIdSuffix來實現(xiàn)的丸相,即添加后綴名:

buildTypes.png

除了這些可配置的屬性外搔确,productFlavors和buildTypes都會通過各自的sourceSet來提供代碼和資源,默認的路徑為:src/flavorName和src/typeName灭忠。利用這個特性膳算,我們可以實現(xiàn)不同定制版本的apk顯示不同的應用名稱和桌面圖標,以便從設備上進行區(qū)分弛作。

productFlavors和buildTypes配合產出各種格式為“flavorName + typeName”的Build Variants涕蜂,以打包出不同版本的apk。當你沒有自定義flavors映琳,默認的defaultConfig也會與buildTypes形成對應的Build Variants机隙,只是沒有名字蜘拉,所以顯示為debug和release。比如這段配置:

android {

    ...

    productFlavors{
        beta{
            applicationId 'com.yifeng.mdstudysamples.beta'
        }
        production{
            applicationId 'com.yifeng.mdstudysamples'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix '.debug'
        }
    }
}

我們配置了beta和production兩種productFlavors有鹿,release和debug兩種buildTypes旭旭。所以,對應的Build Variants就有四種葱跋,分別為:betaDebug持寄、betaRelease、productionDebug和productRelease娱俺∩晕叮可以在Build Variants窗口查看并選擇對應的構建類型運行應用:

Build Variants.png

注意:前面提到,buildTypes通過添加后綴的方式修改applicationId(包名)的矢否,換句話說仲闽,就是在productFlavors的基礎上修改包名的。所以僵朗,在上面這個例子中赖欣,betaRelease構建類型打包出的apk文件的包名是:com.yifeng.mdstudysamples.beta.debug。

實現(xiàn)方式

通過上面這些介紹验庙,基本上大家能夠知道在Android上如何實現(xiàn)app的環(huán)境分離了顶吮。我們可以選擇使用productFlavors和buildTypes這兩種方式在同一個設備上來安裝同一個應用的不同版本。他們道理上是一樣的粪薛,只是相比之下悴了,使用buildTypes不用新建productFlavors,更為方便违寿。這里我就buildTypes為例簡單描述一下環(huán)境分離的實現(xiàn)湃交。

1.對于一個默認productFlavors和buildTypes配置的項目,我們修改debug配置的applicationIdSuffix屬性藤巢,設為".debug"(名字可以隨意設置)搞莺,release版本不用變動。

android {
    
    ...

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix '.debug'
        }
    }
}

有了這一步掂咒,已經能夠將debug版本和release的apk安裝在同一個設備上了才沧。還可以做到更好,比如修改debug版本的桌面圖標绍刮、應用名稱等温圆,便于區(qū)分。

2.我們在src目錄下新建一個debug目錄孩革,將main目錄下的res目錄復制一份到debug目錄下岁歉,修改各個分辨率下的桌面Icon和strings.xml文件中的應用名稱,加個debug標識嫉戚。目錄結構如圖所示:

debug_res.png

在構建打包時刨裆,debug目錄下的res資源采用疊加的方式合并到main里面去澈圈,并替換相同的內容,而這個例子只需要修改桌面Icon和應用名稱帆啃,所以這里我只復制了res目錄下的相關文件瞬女,其他文件并未復制。

3.修改代碼里的服務器接口地址努潘,選擇對應的Build Variants類型诽偷,運行即可。其實也可以在debug和main目錄下的string.xml資源文件中定義服務器地址疯坤,然后在程序的入口處賦值給代碼里的全局靜態(tài)變量报慕。

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市压怠,隨后出現(xiàn)的幾起案子眠冈,更是在濱河造成了極大的恐慌,老刑警劉巖菌瘫,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜗顽,死亡現(xiàn)場離奇詭異,居然都是意外死亡雨让,警方通過查閱死者的電腦和手機雇盖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栖忠,“玉大人崔挖,你說我怎么就攤上這事♀帜” “怎么了狸相?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捐川。 經常有香客問我卷哩,道長,這世上最難降的妖魔是什么属拾? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮冷溶,結果婚禮上渐白,老公的妹妹穿的比我還像新娘。我一直安慰自己逞频,他們只是感情好纯衍,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苗胀,像睡著了一般襟诸。 火紅的嫁衣襯著肌膚如雪瓦堵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天歌亲,我揣著相機與錄音菇用,去河邊找鬼。 笑死陷揪,一個胖子當著我的面吹牛惋鸥,可吹牛的內容都是我干的。 我是一名探鬼主播悍缠,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼卦绣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了飞蚓?” 一聲冷哼從身側響起滤港,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趴拧,沒想到半個月后烤低,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡告希,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年楞捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄渺。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缝龄,死狀恐怖,靈堂內的尸體忽然破棺而出挂谍,到底是詐尸還是另有隱情叔壤,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布口叙,位于F島的核電站炼绘,受9級特大地震影響,放射性物質發(fā)生泄漏妄田。R本人自食惡果不足惜俺亮,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疟呐。 院中可真熱鬧脚曾,春花似錦、人聲如沸启具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拷沸,卻和暖如春色查,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撞芍。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工秧了, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勤庐。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓示惊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愉镰。 傳聞我的和親對象是個殘疾皇子米罚,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容