1.配置多環(huán)境
1.1 配置build.gradle
在新建立項目后,app目錄下的build.gradle中,會默認(rèn)有buildTypes屬性,就像這樣。
buildTypes:編譯類型,默認(rèn)的就是debug,release
雖然上圖中只有一個release屬性,但是debug其實也是默認(rèn)存在的,關(guān)于這點,你可以打開Android studio的Build Variants(默認(rèn)位置在Android studio的左下角靠左邊欄處)自行查看,如下圖。
Build Variants :構(gòu)建變種版本
我們要做的就是其實就是對這個buildTypes 進(jìn)行擴(kuò)充和重寫
以博主公司為例,分test、stage、pro 三個環(huán)境,每個對應(yīng)不同的baseURL、appName。
buildTypes {
//pro環(huán)境
release {
buildConfigField("String", "BASE_URL", "\"http://pro.cn\"")
}
//stage環(huán)境
stage {
buildConfigField("String", "BASE_URL", "\"http://stage.cn\"")
}
//test環(huán)境
debug {
buildConfigField("String", "BASE_URL", "\"http://test.cn\"")
}
}
buildConfigField : 配置宏,可以在gradle里配置一個值讓java 代碼中訪問到
buildTypes默認(rèn)就有debug和release兩種類型
把debug和release分別重寫為test和pro環(huán)境,再另外多加一個stage,這樣就可以構(gòu)成三個環(huán)境。
1.2 項目內(nèi)調(diào)用
在項目build完后,會生成一個BuildConfig文件。
你就可以直接在自己項目里調(diào)用
BuildConfig類如果你要切換環(huán)境,就又回到了上面提到的Build Variants,此時你再打開,它就變成了下面這樣。
可以任意切換自己想要的環(huán)境。
2.配置多渠道
2.1 配置build.gradle
多渠道配置需要手動添加另一個屬性productFlavors
productFlavors {
"other"{} //別的渠道及本地調(diào)試
"baidu" {} //百度
"weixin" {} //微信
"toutiao" {} //今日頭條
"sougou" {} //搜狗
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
productFlavors:從項目中構(gòu)建了一個應(yīng)用的自定義版本
manifestPlaceholders:用于替換AndroidManifest清單文件的指定位置數(shù)據(jù)
2.2 配置 AndroidManifest.xml
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
這樣在build的時候,就可以把manifestPlaceholders 指定的[UMENG_CHANNEL_VALUE: name] 鍵值對映射到AndroidManifest.xml的${UMENG_CHANNEL_VALUE}
這個時候再查看Build Variants就已經(jīng)變成了這個樣子,在這里選擇自己想要的環(huán)境及渠道。
至此,大功告成,在打包apk的時候就可以選擇自己想要的環(huán)境和渠道。
build.gradle
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.gradlesimple.jyn"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
buildConfigField("String", "BASE_URL", "\"http://pro.cn\"")
manifestPlaceholders = [
app_name: "proAPP"
]
}
//stage環(huán)境
stage {
buildConfigField("String", "BASE_URL", "\"http://stage.cn\"")
manifestPlaceholders = [
app_name: "stageAPP"
]
}
//test環(huán)境
debug {
buildConfigField("String", "BASE_URL", "\"http://test.cn\"")
manifestPlaceholders = [
app_name: "testAPP"
]
}
}
productFlavors {
"other"{} //別的渠道及本地調(diào)試
"baidu" {} //百度
"weixin" {} //微信
"toutiao" {} //今日頭條
"sougou" {} //搜狗
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gradlesimple.jyn">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="${app_name}">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
</application>
</manifest>