Gradle For Android(三)Gradle优化与灵活的使用技巧

《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,例如以下代码:

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

如果是这种固定的写法,当然不能解决我们根本的问题。因此我们需要根据渠道动态去修改这个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 ->
               manifestPlaceholders.put("UMENG_CHANNEL_VALUE","all_appkey")
           }

二、善用BuildConfig

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。
首先向看下配置的代码:

  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
        }

    }

1、buildConfigField
buildConfigField 这个会根据gradle的配置,在原来默认的BuildConfig.java基础上,动态添加一个指定数据类型的value。当然,在程序中也是可以访问到的。使用的 规则

buildConfigField 一共有3个参数,第一个是数据类型,就是你定义的常量值是一个什么类型,和Java的类型是对等的,这里是String。第二个参数是常量名,这里是 STATE_TEST。第三个参数是常量值。如此定义之后,就会在BuildConfig.java中生成一个常量名为 STATE_TEST的常量定义。默认配置的生成是:

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

BuildConfig.java 生成截图为:

buildconfig_1.png

2、resValue
buildConfigField主要改变了java常量,那么我们如何通过gradle动态配置管理资源文件,答案是肯定的。Gradle组件提供了resValue字段,用于动态生成value资源,在程序中也可以访问到,其中生成的目标存在generated.xml中,使用的规则与buildConfigField 类似,即类型+常量名+常量值,例如以下代码:

resValue "string", "test_value", "AGradle_release" //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  =  "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应用这个gradle配置

apply from: 'com_cfg.gradle'

3、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.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 "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 **进行类型转化

五、常见配置

1、dexOptions

在Gradle 进行dex的可能会遇到内存不够用的情况,错误信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。这个时候只需要配置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的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,可以控制。

lintOptions {
    abortOnError false
}

希望对有些开发者有帮助具体查看可以github上的demo,也欢迎加入开发交流群哈,详情看个人简介。下一篇是对gradle的混淆说明,欢迎读者阅读

DEMO

Gradle For Android(三)Gradle优化与灵活的使用技巧

傻小孩b mark共勉,写给在成长路上奋斗的你

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,283评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,714评论 6 342
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,544评论 3 25
  • 你怎么还没买房?付个首付20w也可以啊! 听到这样的话,我心里在想我带借能凑齐15w就不错了。 那你老公在干什么?...
    霭霞阅读 213评论 0 0