1. 概述
在 App 的開發(fā)階段會(huì)有“測試”和“生產(chǎn)”兩種環(huán)境疏旨。測試環(huán)境主要就是進(jìn)行調(diào)試贝咙,功能完善虑啤,性能調(diào)優(yōu)等的編寫程序的環(huán)境鸳慈,而每個(gè)階段我們對(duì)外發(fā)布的 App 版本都會(huì)配置好正式的生產(chǎn)環(huán)境也就是正式上線的環(huán)境饱溢。它們之間的區(qū)別主要就是不同環(huán)境下使用不同的接口 URL 和數(shù)據(jù)庫。
在開發(fā)和測試過程中走芋,我們對(duì)產(chǎn)品進(jìn)行迭代升級(jí)時(shí)绩郎,有時(shí)會(huì)我們的手機(jī)上已經(jīng)安裝了一個(gè)上線的應(yīng)用情臭,但是開發(fā)過程中我們還要安裝一個(gè)測試的應(yīng)用以便調(diào)試引几。這時(shí)我們可能要先卸載上線的應(yīng)用,再安裝測試的應(yīng)用,而且還有一些配置需要改動(dòng)闯割,比如接口地址、第三方的 app key 等于样,這樣操作起來顯得很麻煩屡律,也容易出錯(cuò)。
下面就針對(duì)這種情況浅萧,我們?cè)?Android Studio 只需做一些相關(guān)配置就可以解決上述問題逐沙。
2. Android Studio 相關(guān)介紹
2.1 package and applicationId
Android Studio 通過 Gradle 構(gòu)建系統(tǒng)中,applicationId 屬性作為應(yīng)用的唯一標(biāo)識(shí)符(包名)洼畅,用于區(qū)分不同應(yīng)用吩案;package 屬性用來定義被引用的資源類 R 文件。
package 在 AndroidManifest.xml
文件的 manifest 標(biāo)簽里面帝簇, applicationId 在 app/build.gradle
文件中的 defaultConfig
配置下徘郭。新建項(xiàng)目時(shí) applicationId 默認(rèn)使用 package 屬性值初始化。
...
// AndroidManifest.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.codinglife.moduzhang.testsample">
...
// app/build.gradle 文件中
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.codinglife.moduzhang.testsample"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
...
我們要實(shí)現(xiàn) Apk 的環(huán)境分離丧肴,即在同一設(shè)備上安裝同一應(yīng)用的不同版本残揉,我們我們只需修改 applicationId 的值,構(gòu)建出不同包名的 Apk 安裝包文件芋浮。而要修改 applicationId 的值抱环,我們只需通過 productFlavors
和 buildTypes
來輕松實(shí)現(xiàn) Apk 的打包定制(或者說是 Build Variants)。
項(xiàng)目中的 productFlavors
和 buildTypes
配置可以在 app/build.gradle
代碼文件或者在頂部操作欄的 File 下 Project Structure
上修改纸巷,作用是一樣的镇草。
2.2 productFlavors
通過定義多個(gè)不同的 productFlavors 來實(shí)現(xiàn)應(yīng)用的不同定制版本,每一個(gè)Flavor 與 buildTypes 配合產(chǎn)出對(duì)應(yīng)的一種輸出類型的 Apk 文件瘤旨,新建的項(xiàng)目初始化只有一個(gè)默認(rèn)的 Flavor 就是 defaultConfig梯啤。
2.3 buildTypes
默認(rèn)情況下,項(xiàng)目的 buildTypes 包含 debug 和 release 兩個(gè)構(gòu)建版本裆站,其中 release 版本的執(zhí)行需要手動(dòng)設(shè)置簽名文件条辟。配置 buildTypes 是通過定義 applicationIdSuffix 來實(shí)現(xiàn)的,就是添加包的后綴名宏胯。
除了上面的配置外羽嫡,productFlavors 和 buildTypes 都會(huì)通過各自的 sourceSet 來提供代碼和資源,默認(rèn)的路徑為:src/flavorName
和 src/typeName
肩袍。利用這個(gè)特性杭棵,我們可以實(shí)現(xiàn)不同定制版本的 Apk 顯示不同的應(yīng)用名稱和桌面圖標(biāo),以便從設(shè)備上進(jìn)行區(qū)分。
productFlavors 和 buildTypes 配合產(chǎn)出各種格式為 “flavorName + typeName” 的 Build Variants魂爪,以打包出不同版本的 Apk先舷。當(dāng)你沒有自定義flavors,默認(rèn)的defaultConfig也會(huì)與buildTypes形成對(duì)應(yīng)的Build Variants滓侍,只是沒有名字蒋川,所以顯示為debug和release。
3. 生產(chǎn)和測試環(huán)境分離操作
以下以 buildTypes 方式為例
- 在 Project Structure 中的Build Types 中撩笆,設(shè)置 debug 版本中的Application Id Suffix 為
.debug
或其它名稱捺球,release 版本不需要?jiǎng)印?br> gradle 文件會(huì)生成如下內(nèi)容
有了這一步,就可以將 debug 版本和 release 版本的 Apk 安裝在同一設(shè)備上了夕冲。
-
我們還可以設(shè)置 debug 版本的應(yīng)用圖標(biāo)氮兵,應(yīng)用名稱等。
在 src 目錄下新建 debug 目錄歹鱼,目錄名要和上一步中的 Application Id Suffix 一致泣栈,然后在 debug 目錄下新建 res 目錄,在 res 目錄下建立圖片和 values 文件夾弥姻。在選擇 debug 版本運(yùn)行時(shí)南片,這里的資源文件會(huì)自動(dòng)替換 main 目錄下相同的資源文件。
我們可以在 strings 文件里面放一些 debug 和 release 版本不同的配置信息蚁阳,如:服務(wù)器接口地址铃绒,然后在程序的入口處賦值給代碼里的全局靜態(tài)變量鸽照。這樣就不用每次來回切換修改螺捐。
-
運(yùn)行時(shí)在 BuildVariants 中選擇運(yùn)行 debug 或 release 版本。
還是要注意在運(yùn)行 release 版本的時(shí)候矮燎,一定要配置簽名信息定血,否則會(huì)報(bào)錯(cuò)。最好把 debug 版本的也設(shè)置統(tǒng)一的簽名文件诞外。
重要參考文章:
Android 利用Gradle實(shí)現(xiàn)app的環(huán)境分離
APP生產(chǎn)和開發(fā)環(huán)境的分離(手把手教你)