《Gradle For Android(三)Gradle優化與靈活的使用技巧 》
轉載請注明來自傻小孩b_移動開發( http://www.jianshu.com/users/d388bcf9c4d3) 喜歡的可以關注我,不定期總結文章!您的支持是我的動力哈!
Gradle For Android 導讀
前面兩篇記錄了Gradle基礎依賴、多渠道打包以及簽名配置,對于各位程序猿來說,應該再熟悉不過了~在開發路上,依然要好好對自己的知識作為總結,今天這一篇依然是講述日常開發中gradle中的應用以及在某些場景的使用技巧。
目錄
1、善用占位符
2、善用BuildConfig
3、保護信息安全,方便的全局設置
4、使用gradle.properties
5、常見配置
一、善用用占位符
上一篇在進行多渠道打包的時候,我們說過可以根據渠道不同,個性定制不同包名的apk。然后現在會有一個問題,在我們使用第三方平臺,是必須根據包名與簽名信息申請得到appkey,例如典型的地圖開發appkey、友盟appkey,這些我們需要在AndroidManifest中配置meta-data,例如以下代碼:
lt;meta-data android:name=quot;UMENG_CHANNELquot; android:value=http://www.tuicool.com/articles/quot;dwqirhqifaosfjaofq2dasdaquot; /gt;
如果是這種固定的寫法,當然不能解決我們根本的問題。因此我們需要根據渠道動態去修改這個value。Gradle組件提供了一個不錯的功能,占位符,可以在gradle進行動態設置,舉例:
//在渠道配置中... 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 -gt; manifestPlaceholders.put(quot;UMENG_CHANNEL_VALUEquot;,quot;all_appkeyquot;) }
二、善用BuildConfig
BuildConfig,是在我們module中的build.gradle配置正確,編譯成功后,自動生成的配置文件,一般默認為一下代碼;
package com.yuan.agradle; public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean(quot;truequot;); public static final String APPLICATION_ID = quot;com.yuan.agradle4quot;; public static final String BUILD_TYPE = quot;debugquot;; public static final String FLAVOR = quot;baiduquot;; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = quot;1.0quot;; }
BuildConfig.java無法手動進行編譯,但是他由Gradle進行動態控制。因此在作為app對Gradle的配置起到一個開關的重要作用。首先這里有兩個關鍵字段:1.buildConfigField 2.resValue。
首先向看下配置的代碼:
buildTypes {//表示構建類型 一般有release debug 兩種 debug{ buildConfigField 'String','STATE_TEST','quot;debugquot;'/ildConfigField resValue quot;stringquot;, quot;test_valuequot;, quot;AGradle_debugquot;//resValue } release { //release類型 minifyEnabled false // 啟用混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField 'String','STATE_TEST','quot;releasequot;' /ildConfigField resValue quot;stringquot;, quot;test_valuequot;, quot;AGradle_releasequot; //resValue } }
1、buildConfigField
buildConfigField 這個會根據gradle的配置,在原來默認的BuildConfig.java基礎上,動態添加一個指定數據類型的value。當然,在程序中也是可以訪問到的。使用的 規則 :
buildConfigField 一共有3個參數,第一個是數據類型,就是你定義的常量值是一個什么類型,和Java的類型是對等的,這里是String。第二個參數是常量名,這里是 STATE_TEST。第三個參數是常量值。如此定義之后,就會在BuildConfig.java中生成一個常量名為 STATE_TEST的常量定義。默認配置的生成是:
buildConfigField 'String','STATE_TEST','quot;releasequot;' /ildConfigField
BuildConfig.java 生成截圖為:
buildconfig_1.png
2、resValue
buildConfigField主要改變了java常量,那么我們如何通過gradle動態配置管理資源文件,答案是肯定的。Gradle組件提供了resValue字段,用于動態生成value資源,在程序中也可以訪問到,其中生成的目標存在generated.xml中,使用的規則與buildConfigField 類似,即類型 常量名 常量值,例如以下代碼:
resValue quot;stringquot;, quot;test_valuequot;, quot;AGradle_releasequot; //resValue
generated.xml生成截圖:
Paste_Image.png
運行情況:
1、debug版本運行
debug_1.png
2、release版本運行
release_1.png
三、保護信息安全,方便的全局設置
在開發編譯過程中,我們需要盡可能保證一些敏感性的文本信息安全,例如appkey、簽名信息等。如今都比較推薦持續化構建,免去了程序猿處理編譯打包的工作,一來能讓程序猿更加專注開發、而來方便測試調試。例如目前流行的travis、jenkins等持續化構建環境。對于信息安全,很大程度簽名密碼等敏感信息由CI服務進行配置,而非純文本憑證,這里CI我后期再說明,現在先講述下全局設置。
1、新建一個全局配置的com_cfg.gradle,里面的內容為如下:
// 通用配置 ext { // android BUILD_SDK_VERSION = 23 BUILD_TOOLS_VERSION = quot;23.0.2quot; //build config MIN_SDK_VERSION = 18 TARGT_SDK_VERSION = 24 VERSION_CODE = 1 VERSION_NAME = quot;1.0quot; //siging 這種不推薦喔 KEY_ALIAS = 'yuan' KEY_PASSWORD = '888888' KEY_FILEPATH = quot;../agradle.jksquot; KEY_STORE_PASSWORD = '888888' //appket UMENG_CHANNEL_VALUE_XIAOMI = 'xiaomi_appkey' UMENG_CHANNEL_VALUE_GOOGLE = 'googlepaly_appkey' }
2、在project的build.gradle應用這個gradle配置
apply from: 'com_cfg.gradle'
3、application中的build.gradle使用ext中的自定義常量,例如:
compileSdkVersion BUILD_SDK_VERSION //SDK編譯版本 buildToolsVersion BUILD_TOOLS_VERSION//構建工具版本 對應buildTool defaultConfig { applicationId quot;com.yuan.agradlequot; //配置包名 minSdkVersion MIN_SDK_VERSION // 最小支持sdk版本 targetSdkVersion TARGT_SDK_VERSION // 目標sdk版本 versionCode VERSION_CODE//版本號 versionName VERSION_NAME //版本名稱 testInstrumentationRunner quot;android.support.test.runner.AndroidJUnitRunnerquot; }
Ci服務器也是這種模式,通過終端命令行的形式將對于定義的常量,在gradle里面進行替換操作。這樣全局設置有一個好處,假設project里面存在多個application module,這時候如果采用這種全局配置,可以達到一改應用多出的效果。當然,如果你有部分library module是想發布到jcenter,這時候可以定義一個針對library的配置文件,只需要要在library里面進行apply,這個可以完成獨立的配置。不僅不會讓本身的module更加笨重,并且配置會更清晰!
四、使用gradle.properties
這個跟第三個使用全局的gradle作用有點相似,區別就是全局的gradle是定義了ext,而gradle.properties則是直接提供配置參數。不過用法有點去吧喔,下面舉例:
1、新建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
2、module使用以及注意事項
////編譯版本/////////////////////////////////////////////////////////////////////////////// compileSdkVersion BUILD_SDK_VERSION as int //SDK編譯版本 buildToolsVersion BUILD_TOOLS_VERSION//構建工具版本 對應buildTool /////編譯配置////////////////////////////////////////////////////////////////////////////// defaultConfig { applicationId quot;com.yuan.agradlequot; //配置包名 minSdkVersion MIN_SDK_VERSION as int // 最小支持sdk版本 targetSdkVersion TARGT_SDK_VERSION as int// 目標sdk版本 versionCode VERSION_CODE as int//版本號 versionName VERSION_NAME //版本名稱 testInstrumentationRunner quot;android.support.test.runner.AndroidJUnitRunnerquot; }
很明顯們看到了 as int 關鍵字,這是因為本來gradle.properties配置信息是字符串的格式,如果我們輸入的常量是整形的時候,我們必須通過 as int 進行類型轉化
五、常見配置
1、dexOptions
在Gradle 進行dex的可能會遇到內存不夠用的情況,錯誤信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。這個時候只需要配置dexOptions的javaMaxHeapSize大小即可:
dexOptions { javaMaxHeapSize quot;2gquot; }
2、Java Compilation options
指定jdk版本,影響所有task編譯Java源代碼
android { compileOptions { sourceCompatibility = quot;1.7quot; //JavaVersion.VERSION_1_7 targetCompatibility = quot;1.7quot; //JavaVersion.VERSION_1_7 } }
3、aapt options,影響所有使用aapt的task
android { aaptOptions { noCompress 'foo', 'bar' ignoreAssetsPattern quot;!.svn:!.git:!.ds_store:!*.scc:.*:lt;dirgt;_*:!CVS:!thumbs.db:!picasa.ini:!*~quot; } }
4、lintOptions
程序在buid的時候,會執行lint檢查,有任何的錯誤或者警告提示,都會終止構建,可以控制。
lintOptions { abortOnError false }
希望對有些開發者有幫助~具體查看可以github上的demo,也歡迎加入開發交流群哈,詳情看個人簡介。下一篇是對gradle的混淆說明,歡迎讀者閱讀~
DEMO
Gradle For Android(三)Gradle優化與靈活的使用技巧
傻小孩b mark共勉,寫給在成長路上奮斗的你
Tags: Gradle 安卓開發
文章來源:http://www.jianshu.com/p/25da4ef4c7a4