1. 程式人生 > >Android 開發 Gradle 配置多環境和多渠道

Android 開發 Gradle 配置多環境和多渠道

1.配置多環境

1.1 配置build.gradle

在新建立專案後,app目錄下的build.gradle中,會預設有buildTypes屬性,就像這樣。
預設buildTypes

buildTypes:編譯型別,預設的就是debugrelease

雖然上圖中只有一個release屬性,但是debug其實也是預設存在的,關於這點,你可以開啟Android studioBuild Variants(預設位置在Android studio的左下角靠左邊欄處)自行檢視,如下圖。

Build Variants :構建變種版本

我們要做的就是其實就是對這個buildTypes 進行擴充和重寫

以博主公司為例,分teststagepro 三個環境,每個對應不同的baseURLappName

 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預設就有debugrelease兩種型別
debugrelease分別重寫為testpro環境,再另外多加一個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>