gradle 的功能真的是不可謂不強大, 我們可以在 gradle 做出很多自定義的配置
下面主要講一下我在工作中遇到的一些配置項
前提
要做到,我們在 gradle做了一些配置,然后我們在 java 代碼中能夠讀取到對應(yīng)的配置值, 這點很重要.
這里就需要用到 BuildConfig 這個類了
BuildConfig 這個類是 gradle 在編譯的過程中自動生成的一個類
先看看我們嗎項目中生成的BuildConfig文件:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.zuiapps.zuiworld";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "normal";
public static final int VERSION_CODE = 10002;
public static final String VERSION_NAME = "1.0.2.dev";
// Fields from product flavor: normal
public static final String API_BASE_URL = "http://xxxx.zuimeia.com/";
// Fields from default config.
public static final String CHANNEL = "";
}
這個類是直接可以在代碼中引用的, 同樣我們在 gradle 文件中做出的一些配置也會反應(yīng)到這個文件中.
下面舉三個我在項目中遇到的自動配置例子
例子1: 自動開關(guān) Log
一般我們在打 release 包的時候都需要吧 Log 給關(guān)掉,
對了這里我也相信大多數(shù)的項目中都有 LogUtil 類似的這么一個類, 里面能夠設(shè)置 log 開關(guān)什么的
這里我們就可以用到 BuildConfig.DEBUG 來判斷是否是 release 包, 從而做到 log 的打開與關(guān)閉
LogUtil.setLogEnable(BuildConfig.DEBUG);
例子2: 自動配置api 的測試環(huán)境 和正式環(huán)境
多數(shù)情況我們都是在代碼中寫一個常量設(shè)置 BaseApi的 URL
但是有很多時候, QA 人員需要在測試環(huán)境和正式環(huán)境中來回切換, 對于我們開發(fā)來說倒是挺簡單的, 改個變量在編譯一下現(xiàn)在有了 instant run. 但是對于QA來說,總不能每次要就再改個變量再打個包給他們吧
這里其實可以使用 gradle 自動化配置, 打一個正式環(huán)境的包, 再打一個測試環(huán)境的包
這里就需要用到gradle 中的productFlavors了, 多渠道打包的時候大家都應(yīng)該見過(但是如果是這樣多渠道打包的話.真心挺費時間的,可以考慮其他方法打渠道包)
productFlavors {
normal {
buildConfigField 'String', 'API_BASE_URL', '"http://xxxx.zuimeia.com/"'
}
qa {
buildConfigField 'String', 'API_BASE_URL', '"http://xxxxtest.zuimeia.com/"'
}
instant {
// 這樣 會相對快一些
buildConfigField 'String', 'API_BASE_URL', "${cfg.test_base_url}"
minSdkVersion 21
}
}
從上面的代碼可以看到整個3個渠道, 一個真實環(huán)境的一個測試環(huán)境的, 還有一個只是為了更快的 instant 打包的,開發(fā)的時候一般用這個.
關(guān)于多渠道打包的知識這里不多做解釋,
下面重點看這句:
buildConfigField 'String', 'API_BASE_URL', '"http://desig.zuimeia.com/"'
這句的意思是我們在 BuildConfig 類中加入一個String 常量,名字是 API_BASE_URL 值是"http://xxxx.zuimeia.com/".
需要注意的是, 這里 是一開始一個單引號, 然后里面就是 雙引號+內(nèi)容了. 這個自己多試幾遍就知道了.
然后我們在應(yīng)用 BASE_API_URL 的時候課直接使用 gradle 中配置了:
String API_BASE_URL = BuildConfig.API_BASE_URL;
一些特殊渠道的配置
現(xiàn)在網(wǎng)上關(guān)于多渠道打包的文章不少,都很少推薦直接所示用 productFlavors 這樣的方式打渠道包.
但是有一些渠道還必須這樣打, 如小米, 魅族.
我們公司的產(chǎn)品都會為針對小米和魅族單獨制作 Icon, 如果使用一些通用的打渠道包的方式,來打的話就不那么適用了.
所以這里還是要使用 productFlavors 來打小米和魅族的渠道包.
productFlavors {
xiaomi {buildConfigField 'String', 'CHANNEL', '"xiaomi"'}
meizu {buildConfigField 'String', 'CHANNEL', '"meizu"'}
normal {
buildConfigField 'String', 'API_BASE_URL', '"http://xxx.zuimeia.com/"'
}
qa {
buildConfigField 'String', 'API_BASE_URL', '"http://xxxtest.zuimeia.com/"'
}
instant {
// 這樣 會相對快一些
buildConfigField 'String', 'API_BASE_URL', "${cfg.test_base_url}"
minSdkVersion 21
}
}
當然為了能夠在打小米的包的時候使用小米的 icon, 打魅族包的時候使用魅族的 Icon 那么需要在src 目錄下加入xiaomi和mmeizu 的資源文件
如下圖:

注意
當我在productFlavors 中住了一些自定義的配置,還需要在defaultConfig 中做一些默認配置.
其實看上面就能看出來, 當我打小米渠道的時候沒有指明 API_BASE_URL 那是因為我配置默認的API_BASE_URL, 如果使用默認的值就再次不需要指明了
看如下默認配置:
defaultConfig {
applicationId cfg.applicationId
minSdkVersion cfg.minSdkVersion
targetSdkVersion cfg.targetSdkVersion
versionCode cfg.versionCode
versionName cfg.versionName
multiDexEnabled true
buildConfigField 'String', 'API_BASE_URL', "${cfg.normal_base_url}"
buildConfigField 'String', 'CHANNEL', '""'
}
結(jié)語
基本關(guān)于 gradle 自動化配置參數(shù)的一些內(nèi)存差不多了. 關(guān)于一些打渠道包的方法網(wǎng)上應(yīng)該有不少,這里不多講
還有上面關(guān)于 $獲取變量值的 這個其實很簡單的看一些看開源項目的什么的就能 get 的技能了, 這也不多做介紹了
以上, 感謝閱讀