Gradle For Android(三)Gradle優(yōu)化與靈活的使用技巧

《Gradle For Android(三)Gradle優(yōu)化與靈活的使用技巧 》
轉(zhuǎn)載請注明來自傻小孩b_移動開發(fā)http://www.itdecent.cn/users/d388bcf9c4d3)喜歡的可以關(guān)注我,不定期總結(jié)文章!您的支持是我的動力哈!

Gradle For Android 導(dǎo)讀

前面兩篇記錄了Gradle基礎(chǔ)依賴、多渠道打包以及簽名配置,對于各位程序猿來說,應(yīng)該再熟悉不過了~在開發(fā)路上,依然要好好對自己的知識作為總結(jié),今天這一篇依然是講述日常開發(fā)中g(shù)radle中的應(yīng)用以及在某些場景的使用技巧。

目錄

1、善用占位符
2、善用BuildConfig
3、保護(hù)信息安全,方便的全局設(shè)置
4、使用gradle.properties
5、常見配置

一、善用用占位符

上一篇在進(jìn)行多渠道打包的時(shí)候,我們說過可以根據(jù)渠道不同,個(gè)性定制不同包名的apk。然后現(xiàn)在會有一個(gè)問題,在我們使用第三方平臺,是必須根據(jù)包名與簽名信息申請得到appkey,例如典型的地圖開發(fā)appkey、友盟appkey,這些我們需要在AndroidManifest中配置meta-data,例如以下代碼:

<meta-data
           android:name="UMENG_CHANNEL"
           android:value="dwqirhqifaosfjaofq2dasda" />

如果是這種固定的寫法,當(dāng)然不能解決我們根本的問題。因此我們需要根據(jù)渠道動態(tài)去修改這個(gè)value。Gradle組件提供了一個(gè)不錯(cuò)的功能,占位符,可以在gradle進(jìn)行動態(tài)設(shè)置,舉例:

  //在渠道配置中...
       xiaomi { //小米渠道
            applicationId 'com.yuan.agradle1'//個(gè)性定制,小米市場包名不同

            // 小米渠道配置appkey
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'xiaomi_appkey']
        }
        googlepaly { //google play 渠道
            applicationId 'com.yuan.agradle2'

            // googlepaly渠道配置appkey
               manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'googlepaly_appkey'        
        }

當(dāng)然我們也可以一次性設(shè)置,例如如下:

productFlavors.all { flavor ->
               manifestPlaceholders.put("UMENG_CHANNEL_VALUE","all_appkey")
           }

二、善用BuildConfig

BuildConfig,是在我們module中的build.gradle配置正確,編譯成功后,自動生成的配置文件,一般默認(rèn)為一下代碼;

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無法手動進(jìn)行編譯,但是他由Gradle進(jìn)行動態(tài)控制。因此在作為app對Gradle的配置起到一個(gè)開關(guān)的重要作用。首先這里有兩個(gè)關(guān)鍵字段:1.buildConfigField 2.resValue。
首先向看下配置的代碼:

  buildTypes {//表示構(gòu)建類型 一般有release debug 兩種

        debug{
            buildConfigField 'String','STATE_TEST','"debug"'/ildConfigField
            resValue "string", "test_value", "AGradle_debug"http://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
        }

    }

1、buildConfigField
buildConfigField 這個(gè)會根據(jù)gradle的配置,在原來默認(rèn)的BuildConfig.java基礎(chǔ)上,動態(tài)添加一個(gè)指定數(shù)據(jù)類型的value。當(dāng)然,在程序中也是可以訪問到的。使用的 規(guī)則

buildConfigField 一共有3個(gè)參數(shù),第一個(gè)是數(shù)據(jù)類型,就是你定義的常量值是一個(gè)什么類型,和Java的類型是對等的,這里是String。第二個(gè)參數(shù)是常量名,這里是 STATE_TEST。第三個(gè)參數(shù)是常量值。如此定義之后,就會在BuildConfig.java中生成一個(gè)常量名為 STATE_TEST的常量定義。默認(rèn)配置的生成是:

  buildConfigField 'String','STATE_TEST','"release"' /ildConfigField

BuildConfig.java 生成截圖為:

buildconfig_1.png

2、resValue
buildConfigField主要改變了java常量,那么我們?nèi)绾瓮ㄟ^gradle動態(tài)配置管理資源文件,答案是肯定的。Gradle組件提供了resValue字段,用于動態(tài)生成value資源,在程序中也可以訪問到,其中生成的目標(biāo)存在generated.xml中,使用的規(guī)則與buildConfigField 類似,即類型+常量名+常量值,例如以下代碼:

resValue "string", "test_value", "AGradle_release" //resValue

generated.xml生成截圖:

Paste_Image.png

運(yùn)行情況:
1、debug版本運(yùn)行

debug_1.png

2、release版本運(yùn)行

release_1.png

三、保護(hù)信息安全,方便的全局設(shè)置

在開發(fā)編譯過程中,我們需要盡可能保證一些敏感性的文本信息安全,例如appkey、簽名信息等。如今都比較推薦持續(xù)化構(gòu)建,免去了程序猿處理編譯打包的工作,一來能讓程序猿更加專注開發(fā)、而來方便測試調(diào)試。例如目前流行的travis、jenkins等持續(xù)化構(gòu)建環(huán)境。對于信息安全,很大程度簽名密碼等敏感信息由CI服務(wù)進(jìn)行配置,而非純文本憑證,這里CI我后期再說明,現(xiàn)在先講述下全局設(shè)置。

1、新建一個(gè)全局配置的com_cfg.gradle,里面的內(nèi)容為如下:

// 通用配置
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'
}

2、在project的build.gradle應(yīng)用這個(gè)gradle配置

apply from: 'com_cfg.gradle'

3、application中的build.gradle使用ext中的自定義常量,例如:

    compileSdkVersion BUILD_SDK_VERSION //SDK編譯版本
    buildToolsVersion  BUILD_TOOLS_VERSION//構(gòu)建工具版本 對應(yīng)buildTool

    defaultConfig {
        applicationId "com.yuan.agradle" //配置包名
        minSdkVersion MIN_SDK_VERSION // 最小支持sdk版本
        targetSdkVersion  TARGT_SDK_VERSION // 目標(biāo)sdk版本
        versionCode VERSION_CODE//版本號
        versionName  VERSION_NAME //版本名稱

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

Ci服務(wù)器也是這種模式,通過終端命令行的形式將對于定義的常量,在gradle里面進(jìn)行替換操作。這樣全局設(shè)置有一個(gè)好處,假設(shè)project里面存在多個(gè)application module,這時(shí)候如果采用這種全局配置,可以達(dá)到一改應(yīng)用多出的效果。當(dāng)然,如果你有部分library module是想發(fā)布到j(luò)center,這時(shí)候可以定義一個(gè)針對library的配置文件,只需要要在library里面進(jìn)行apply,這個(gè)可以完成獨(dú)立的配置。不僅不會讓本身的module更加笨重,并且配置會更清晰!

四、使用gradle.properties

這個(gè)跟第三個(gè)使用全局的gradle作用有點(diǎn)相似,區(qū)別就是全局的gradle是定義了ext,而gradle.properties則是直接提供配置參數(shù)。不過用法有點(diǎn)去吧喔,下面舉例:

1、新建gradle.properties,并且寫入一些配置參數(shù)

// 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使用以及注意事項(xiàng)

    ////編譯版本///////////////////////////////////////////////////////////////////////////////

    compileSdkVersion BUILD_SDK_VERSION as int //SDK編譯版本
    buildToolsVersion  BUILD_TOOLS_VERSION//構(gòu)建工具版本 對應(yīng)buildTool

    /////編譯配置//////////////////////////////////////////////////////////////////////////////

    defaultConfig {
        applicationId "com.yuan.agradle" //配置包名
        minSdkVersion MIN_SDK_VERSION as int // 最小支持sdk版本
        targetSdkVersion  TARGT_SDK_VERSION as int// 目標(biāo)sdk版本
        versionCode VERSION_CODE as int//版本號
        versionName  VERSION_NAME //版本名稱

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

很明顯們看到了**as int 關(guān)鍵字,這是因?yàn)楸緛韌radle.properties配置信息是字符串的格式,如果我們輸入的常量是整形的時(shí)候,我們必須通過as int **進(jìn)行類型轉(zhuǎn)化

五、常見配置

1、dexOptions

在Gradle 進(jìn)行dex的可能會遇到內(nèi)存不夠用的情況,錯(cuò)誤信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。這個(gè)時(shí)候只需要配置dexOptions的javaMaxHeapSize大小即可:

dexOptions {  javaMaxHeapSize "2g" } 

2、Java Compilation options

指定jdk版本,影響所有task編譯Java源代碼

android {
        compileOptions {
            sourceCompatibility = "1.7" //JavaVersion.VERSION_1_7
            targetCompatibility = "1.7" //JavaVersion.VERSION_1_7
        }
    }

3、aapt options,影響所有使用aapt的task

android {     
    aaptOptions {    
            noCompress 'foo', 'bar'      
            ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"   
                }   
            }

4、lintOptions

程序在buid的時(shí)候,會執(zhí)行l(wèi)int檢查,有任何的錯(cuò)誤或者警告提示,都會終止構(gòu)建,可以控制。

lintOptions {
    abortOnError false
}

希望對有些開發(fā)者有幫助具體查看可以github上的demo,也歡迎加入開發(fā)交流群哈,詳情看個(gè)人簡介。下一篇是對gradle的混淆說明,歡迎讀者閱讀

DEMO

Gradle For Android(三)Gradle優(yōu)化與靈活的使用技巧

傻小孩b mark共勉,寫給在成長路上奮斗的你

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,790評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,255評論 6 342
  • 這一章主要針對項(xiàng)目中可以用到的一些實(shí)用功能來介紹Android Gradle,比如如何隱藏我們的證書文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,961評論 3 25
  • 你怎么還沒買房?付個(gè)首付20w也可以??! 聽到這樣的話,我心里在想我?guī)Ы枘軠慅R15w就不錯(cuò)了。 那你老公在干什么?...
    靄霞閱讀 230評論 0 0

友情鏈接更多精彩內(nèi)容