Android 開發 Gradle 配置多環境和多渠道
1.配置多環境
1.1 配置build.gradle
在新建立專案後,app
目錄下的build.gradle
中,會預設有buildTypes
屬性,就像這樣。
buildTypes
:編譯型別,預設的就是debug
,release
雖然上圖中只有一個release
屬性,但是debug
其實也是預設存在的,關於這點,你可以開啟Android studio
的Build Variants
(預設位置在Android studio的左下角靠左邊欄處)自行檢視,如下圖。
Build Variants :構建變種版本
我們要做的就是其實就是對這個buildTypes
進行擴充和重寫
以博主公司為例,分test
、stage
、pro
三個環境,每個對應不同的baseURL
、appName
。
buildTypes {
//pro環境
release {
buildConfigField("String", "BASE_URL", "\"http://pro.cn\"")
}
//stage環境
stage {
buildConfigField("String", "BASE_URL", "\"http://stage.cn\"")
}
//test環境
debug {
buildConfigField("String", "BASE_URL", "\"http://test.cn\"")
}
}
buildConfigField : 配置巨集,可以在gradle裡配置一個值讓java 程式碼中訪問到
buildTypes
預設就有debug
和release
兩種型別
把debug
和release
分別重寫為test
和pro
環境,再另外多加一個stage
,這樣就可以構成三個環境。
1.2 專案內呼叫
在專案build完後,會生成一個BuildConfig
檔案。
你就可以直接在自己專案裡呼叫BuildConfig
如果你要切換環境,就又回到了上面提到的Build Variants
,此時你再開啟,它就變成了下面這樣。
可以任意切換自己想要的環境。
2.配置多渠道
2.1 配置build.gradle
多渠道配置需要手動新增另一個屬性productFlavors
productFlavors {
"other"{} //別的渠道及本地除錯
"baidu" {} //百度
"weixin" {} //微信
"toutiao" {} //今日頭條
"sougou" {} //搜狗
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
productFlavors
:從專案中構建了一個應用的自定義版本
manifestPlaceholders
:用於替換AndroidManifest
清單檔案的指定位置資料
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
就已經變成了這個樣子
至此,大功告成,在打包apk的時候就可以選擇自己想要的環境和渠道。
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環境
stage {
buildConfigField("String", "BASE_URL", "\"http://stage.cn\"")
manifestPlaceholders = [
app_name: "stageAPP"
]
}
//test環境
debug {
buildConfigField("String", "BASE_URL", "\"http://test.cn\"")
manifestPlaceholders = [
app_name: "testAPP"
]
}
}
productFlavors {
"other"{} //別的渠道及本地除錯
"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>