《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共勉,写给在成长路上奋斗的你