《Gradle For Android(三)Gradle優化與靈活的使用技巧 》
轉載請註明來自傻小孩b(gold.xitu.io/user/57e089…喜歡的能夠關注我,不按期總結文章!您的支持是個人動力哈!java
前面兩篇記錄了Gradle基礎依賴、多渠道打包以及簽名配置,對於各位程序猿來講,應該再熟悉不過了~在開發路上,依然要好好對本身的知識做爲總結,今天這一篇依然是講述平常開發中gradle中的應用以及在某些場景的使用技巧。android
一、善用佔位符
二、善用BuildConfig
三、保護信息安全,方便的全局設置
四、使用gradle.properties
五、常見配置git
上一篇在進行多渠道打包的時候,咱們說過能夠根據渠道不一樣,個性定製不一樣包名的apk。而後如今會有一個問題,在咱們使用第三方平臺,是必須根據包名與簽名信息申請獲得appkey,例如典型的地圖開發appkey、友盟appkey,這些咱們須要在AndroidManifest中配置meta-data,例如如下代碼:github
<meta-data
android:name="UMENG_CHANNEL"
android:value="dwqirhqifaosfjaofq2dasda" />複製代碼
若是是這種固定的寫法,固然不能解決咱們根本的問題。所以咱們須要根據渠道動態去修改這個value。Gradle組件提供了一個不錯的功能,佔位符,能夠在gradle進行動態設置,舉例:api
//在渠道配置中...
xiaomi { //小米渠道
applicationId 'com.yuan.agradle1'//個性定製,小米市場包名不一樣
// 小米渠道配置appkey
manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'xiaomi_appkey']
}
googlepaly { //google play 渠道
applicationId 'com.yuan.agradle2'
// googlepaly渠道配置appkey
manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'googlepaly_appkey'
}複製代碼
固然咱們也能夠一次性設置,例如以下:安全
productFlavors.all { flavor ->
manifestPlaceholders.put("UMENG_CHANNEL_VALUE","all_appkey")
}複製代碼
BuildConfig,是在咱們module中的build.gradle配置正確,編譯成功後,自動生成的配置文件,通常默認爲一下代碼;服務器
package com.yuan.agradle;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.yuan.agradle4";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "baidu";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}複製代碼
BuildConfig.java沒法手動進行編譯,可是他由Gradle進行動態控制。所以在做爲app對Gradle的配置起到一個開關的重要做用。首先這裏有兩個關鍵字段:1.buildConfigField 2.resValue。
首先向看下配置的代碼:app
buildTypes {//表示構建類型 通常有release debug 兩種
debug{
buildConfigField 'String','STATE_TEST','"debug"'/ildConfigField
resValue "string", "test_value", "AGradle_debug"//resValue
}
release { //release類型
minifyEnabled false
// 啓用混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField 'String','STATE_TEST','"release"' /ildConfigField resValue "string", "test_value", "AGradle_release" //resValue } }複製代碼
一、buildConfigField
buildConfigField 這個會根據gradle的配置,在原來默認的BuildConfig.java基礎上,動態添加一個指定數據類型的value。固然,在程序中也是能夠訪問到的。使用的 規則:svn
buildConfigField 一共有3個參數,第一個是數據類型,就是你定義的常量值是一個什麼類型,和Java的類型是對等的,這裏是String。第二個參數是常量名,這裏是 STATE_TEST。第三個參數是常量值。如此定義以後,就會在BuildConfig.java中生成一個常量名爲 STATE_TEST的常量定義。默認配置的生成是:工具
buildConfigField 'String','STATE_TEST','"release"' /ildConfigField複製代碼
BuildConfig.java 生成截圖爲:
二、resValue
buildConfigField主要改變了java常量,那麼咱們如何經過gradle動態配置管理資源文件,答案是確定的。Gradle組件提供了resValue字段,用於動態生成value資源,在程序中也能夠訪問到,其中生成的目標存在generated.xml中,使用的規則與buildConfigField 相似,即類型+常量名+常量值,例如如下代碼:
resValue "string", "test_value", "AGradle_release" //resValue複製代碼
generated.xml生成截圖:
運行狀況:
一、debug版本運行
二、release版本運行
在開發編譯過程當中,咱們須要儘量保證一些敏感性的文本信息安全,例如appkey、簽名信息等。現在都比較推薦持續化構建,免去了程序猿處理編譯打包的工做,一來能讓程序猿更加專一開發、而來方便測試調試。例如目前流行的travis、jenkins等持續化構建環境。對於信息安全,很大程度簽名密碼等敏感信息由CI服務進行配置,而非純文本憑證,這裏CI我後期再說明,如今先講述下全局設置。
一、新建一個全局配置的com_cfg.gradle,裏面的內容爲以下:
// 通用配置
ext {
// android
BUILD_SDK_VERSION = 23
BUILD_TOOLS_VERSION = "23.0.2"
//build config
MIN_SDK_VERSION = 18
TARGT_SDK_VERSION = 24
VERSION_CODE = 1
VERSION_NAME = "1.0"
//siging 這種不推薦喔
KEY_ALIAS = 'yuan'
KEY_PASSWORD = '888888'
KEY_FILEPATH = "../agradle.jks"
KEY_STORE_PASSWORD = '888888'
//appket
UMENG_CHANNEL_VALUE_XIAOMI = 'xiaomi_appkey'
UMENG_CHANNEL_VALUE_GOOGLE = 'googlepaly_appkey'
}複製代碼
二、在project的build.gradle應用這個gradle配置
apply from: 'com_cfg.gradle'複製代碼
三、application中的build.gradle使用ext中的自定義常量,例如:
compileSdkVersion BUILD_SDK_VERSION //SDK編譯版本
buildToolsVersion BUILD_TOOLS_VERSION//構建工具版本 對應buildTool
defaultConfig {
applicationId "com.yuan.agradle" //配置包名
minSdkVersion MIN_SDK_VERSION // 最小支持sdk版本
targetSdkVersion TARGT_SDK_VERSION // 目標sdk版本
versionCode VERSION_CODE//版本號
versionName VERSION_NAME //版本名稱
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}複製代碼
Ci服務器也是這種模式,經過終端命令行的形式將對於定義的常量,在gradle裏面進行替換操做。這樣全局設置有一個好處,假設project裏面存在多個application module,這時候若是採用這種全局配置,能夠達到一改應用多出的效果。固然,若是你有部分library module是想發佈到jcenter,這時候能夠定義一個針對library的配置文件,只須要要在library裏面進行apply,這個能夠完成獨立的配置。不只不會讓自己的module更加笨重,而且配置會更清晰!
這個跟第三個使用全局的gradle做用有點類似,區別就是全局的gradle是定義了ext,而gradle.properties則是直接提供配置參數。不過用法有點去吧喔,下面舉例:
一、新建gradle.properties,而且寫入一些配置參數
// android
BUILD_SDK_VERSION = 23
BUILD_TOOLS_VERSION = 23.0.2
//build config
MIN_SDK_VERSION = 18
TARGT_SDK_VERSION = 24
VERSION_CODE = 1
VERSION_NAME = 1.0複製代碼
二、module使用以及注意事項
////編譯版本///////////////////////////////////////////////////////////////////////////////
compileSdkVersion BUILD_SDK_VERSION as int //SDK編譯版本
buildToolsVersion BUILD_TOOLS_VERSION//構建工具版本 對應buildTool
/////編譯配置//////////////////////////////////////////////////////////////////////////////
defaultConfig {
applicationId "com.yuan.agradle" //配置包名
minSdkVersion MIN_SDK_VERSION as int // 最小支持sdk版本
targetSdkVersion TARGT_SDK_VERSION as int// 目標sdk版本
versionCode VERSION_CODE as int//版本號
versionName VERSION_NAME //版本名稱
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}複製代碼
很明顯們看到了as int 關鍵字,這是由於原本gradle.properties配置信息是字符串的格式,若是咱們輸入的常量是整形的時候,咱們必須經過as int 進行類型轉化
一、dexOptions
在Gradle 進行dex的可能會遇到內存不夠用的狀況,錯誤信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。這個時候只須要配置dexOptions的javaMaxHeapSize大小便可:
dexOptions { javaMaxHeapSize "2g" }複製代碼
二、Java Compilation options
指定jdk版本,影響全部task編譯Java源代碼
android {
compileOptions {
sourceCompatibility = "1.7" //JavaVersion.VERSION_1_7
targetCompatibility = "1.7" //JavaVersion.VERSION_1_7
}
}複製代碼
三、aapt options,影響全部使用aapt的task
android { aaptOptions { noCompress 'foo', 'bar' ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc:.*:_*:!CVS:!thumbs.db:!picasa.ini:!*~" } } 複製代碼
四、lintOptions
程序在buid的時候,會執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,能夠控制。
lintOptions {
abortOnError false
}複製代碼
但願對有些開發者有幫助~具體查看能夠github上的demo,也歡迎加入開發交流羣哈,詳情看我的簡介。下一篇是對gradle的混淆說明,歡迎讀者閱讀~
Gradle For Android(三)Gradle優化與靈活的使用技巧
傻小孩b mark共勉,寫給在成長路上奮鬥的你