grade那些事

我的gradle配置参数


在gradle.properties中会配置这些参数
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2048m

构建初始化的很多工作是关于java虚拟机的启动,加载虚拟机环境,加载class文件等,如果这些动作交给一个d单独的后台进程去做,那么,第一次初始化之后的修改代码再构建是不是可以节省很多时间呢?答的,通过在gradle.properties加入这样一句来开启,如果想让修改全局所有项目都生效,那么修改这个文件~/.gradle/gradle.properties
org.gradle.daemon=true
项目开发过程中,难免需要用到三方库,这就形成了项目之间的依赖关系,GRADLE提供了多种集成三方库的方式,提供了很方便的项目依赖管理,本地库,库工程,maven库全支持。既然用到库,就会遇到库版本的问题和升级问题,其中maven库的依赖管理支持一种动态版本的方式,也就是说,GRADLE可以做到不依赖具体某个版本的库,而是每次从repo拉取最新的库到本地做编译。具体使用是这样的:

拿gson库举例,如果依赖2.2.1这个版本,可以在build.gradle文件里这样写

dependencies {
compile ‘com.google.code.gson:gson:2.2.1’
}
如果不想依赖具体的库,想每次从maven repo中拉取最新的库,那么,可以写成这样:

dependencies {
compile ‘com.google.code.gson:gson:2.2.+’
}
也可以写成这样

dependencies {
compile ‘com.google.code.gson:gson:2.+’
}
甚至可以这样

dependencies {
compile ‘com.google.code.gson:gson:+’
}

其中含义相信不用我解释,大家也看得明白吧。
用”+”来通配一个版本族,这样有个好处是maven上有新库了,不用你操心升级,GRADLE编译的时候自动升级了,但是带来了两个坏处,一是,有可能新版库的接口改了,导致编译失败,这个时候需要修改代码做升级适配;更大的坏处是,每次GRADLE编译完整的项目,都会去maven上试图拉取最新的库,这样,拖慢了编译速度,尤其在网络非常差的时候,所以,为了构建速度,建议写死依赖库的版本号。

有一个很通俗的道理是,发展的东西会越来越好,最新版的GRADLE和JDK往往是性能最好,运行最流畅最快的,所以,升级吧,JDK的升级这里不说了,具体看Oracle的官方文档。这里说说GRADLE的版本升级,GRALDE采用了一种叫做wrapper的方式,可以做到每个项目独立使用其自己的GRADLE版本,这样做的好处不言而喻,每个项目的构建环境独立,互不影响。但为什么会出现这个东西,我的猜想是因为GRADLE发展太快,新旧版本之间很难兼容。如果你有多个项目都采用GRADLE构建,假设都用同一个全局的GRADLE,那么当这个GRADLE升级后,所有的项目可能都会编译失败,你得一个一个改配置,那么,下次再升级,同样的流程的再走一遍,是不是很烦。采用wrapper的方式很好的解决了这个问题,每个项目采用独立的GRADLE版本,互不影响,如果你只想升级其中一个,你改这一个项目的GRADLE wrapper就好了。在你的项目目录下找到这个文件gradle/wrapper/gradle-wrapper.properties并修改distributionUrl=https://services.gradle.org/distributions/gradle-2.11-all.zip到你想升级的版本就可以了。

将你的项目拆分成多个子项目并开启并行构建也是一个不错的主意,比如将相对独立的模块拆分成独立的库工程(Library projects),主工程(Application project)依赖这些库工程,这样的话,开启并行构建才会发挥作用。并行构建开启方式是修改文件gradle.properties,加入如下行:
org.gradle.parallel=true.

如果编程过程中采用了新版JDK(比如1.7)才支持的特性(比如new HashMap<>这样的写法),而编译的时候默认是旧版的JDK(比如1.6),这个时候编译会报错,采用如下方式可以指定用哪个版本的编译器编译,前提是JAVA_HOME指定的JDK是大于等于新版JDK的哦,其他和java编译器相关的也可以在这里配置
如果不想全局生效,可以将tasks.withType(JavaCompile)放入某个子项目中。
android {

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

762550.png

也可以在顶层build.gradle脚本中定义一些全局变量,提供给子脚本引用,其实在德邦快递的项目中我们使用的就是这个方式,但是其实在很多网上我也看到有的这些变量是配置在gradle.properties配置信息中。这样作为一个全局的域给整个项目使用。
624518.png
然后给子脚本引用,
578415.png

compileSdkVersion rootProject.ext.deppon_compileSdkVersion
buildToolsVersion rootProject.ext.deppon_buildToolsVersion
也可以写成:
compileSdkVersion deppon_compileSdkVersion
buildToolsVersion deppon_buildToolsVersion

有时候引用第三方的库会带有一些配置文件(.txt,license)的信息,打包的时候想要去掉这些信息于是我们要添加这些
packagingOptions {
exclude ‘META-INF/DEPENDENCIES.txt’
exclude ‘META-INF/LICENSE.txt’
exclude ‘META-INF/NOTICE.txt’
exclude ‘META-INF/NOTICE’
exclude ‘META-INF/LICENSE’
exclude ‘META-INF/DEPENDENCIES’
exclude ‘META-INF/notice.txt’
exclude ‘META-INF/license.txt’
exclude ‘META-INF/dependencies.txt’
exclude ‘META-INF/LGPL2.1’
exclude ‘META-INF/ASL2.0’
}

208834.png

在公司这个项目中还会有这个配置
lintOptions {
disable ‘InvalidPackage’,’TypographyFractions’,’TypographyQuotes’
checkReleaseBuilds false //设置在release版本的时候也关闭错误
abortOnError false //设置是否在lint发生错误时终止构建为false
}
149579.png

Lint默认选项会对项目中的代码进行严格的检查,假如出现包错误会终止构建过程,可以通过这个配置关闭这个选项,不过最好关注下Lint输出,有问题就及时处理,避免潜在问题。

配置签名信息,签名信息属于敏感的信息,尽量最好不要写在gradle中,而是写在一个单独的配置文件中,这样配置文件不用同步到版本控制工具中,而是又本地维护,为了防止版本控制平台泄漏信息,建议把签名信息写到gradle.properties或者local.properties文件中维护,这样grale中的脚本信息从本地这些配置信息中引用即可,如果放在一个自定义的文件中,gradle需要提供相应的代码来读取文件中的签名信息,文件内容无非:
RELEASE_KEY_PASSWORD=android
RELEASE_KEY_ALIAS=androidreleasekey
RELEASE_STORE_PASSWORD=android
RELEASE_STORE_FILE=../resources/release.keystore
DEBUG_KEY_PASSWORD=android
DEBUG_KEY_ALIAS=androiddebugkey
DEBUG_STORE_PASSWORD=android
DEBUG_STORE_FILE=../resources/debug.keystore
gradle脚本信息
gradle脚本引用代码参考
android {
signingConfigs {
debug {
storeFile file(DEBUG_STORE_FILE)
storePassword DEBUG_STORE_PASSWORD
keyAlias DEBUG_KEY_ALIAS
keyPassword DEBUG_KEY_PASSWORD
}

    release {
        storeFile file(RELEASE_STORE_FILE)
        storePassword RELEASE_STORE_PASSWORD
        keyAlias RELEASE_KEY_ALIAS
        keyPassword RELEASE_KEY_PASSWORD
    }
}

}
如果我们的签名信息没有放到到gradle.properties或者local.properties文件中维护
而是写在自定义的文件中,假设签名信息写到了signing.properties文件中,文件内容可以参考上面写的,读取文件代码放倒gradle脚本中既可以了,参考代码如下
def File propFile = new File(‘signing.properties’)
if (propFile.canRead()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))

if (props != null && props.containsKey('RELEASE_STORE_FILE') && props.containsKey('RELEASE_STORE_PASSWORD') &&
        props.containsKey('RELEASE_KEY_ALIAS') && props.containsKey('RELEASE_KEY_PASSWORD')) {

    android.signingConfigs.release.storeFile = file(props['RELEASE_STORE_FILE'])
    android.signingConfigs.release.storePassword = props['RELEASE_STORE_PASSWORD']
    android.signingConfigs.release.keyAlias = props['RELEASE_KEY_ALIAS']
    android.signingConfigs.release.keyPassword = props['RELEASE_KEY_PASSWORD']
    println 'all good to go'
} else {
    android.buildTypes.release.signingConfig = null
    println 'signing.properties found but some entries are missing'
}

} else {
println ‘signing.properties not found’
android.buildTypes.release.signingConfig = null
}
但是在我们德邦的项目中在隐私方面并没有做的那么全面直接写到gradle脚本中,
//配置签名信息
signingConfigs {
debug {
keyAlias ‘DEBUG’
keyPassword ‘123456’
storeFile file(‘../keystore/debug/debug.jks’)
storePassword ‘123456’
}
release {
storeFile file(‘../keystore/release/yuLocal.jks’)
storePassword “deppon”
keyAlias “ent”
keyPassword “www.deppon.com”
}
}

但是这里还有个得特别注意的是下面的构建类型和产品种类需要用到上面的签名信息,所有签名信息的定义得放到引用它的对象之前,否则会报找不到签名信息。gradle的语法都是先定义后引用的。

如何设置第三方的maven仓库地址
模版代码是这样:
allprojects {
repositories {
maven {
url ‘url’
name ‘maven name’
credentials {
username = ‘username’
password = ‘password’
}
}
}
}
但是这个name和credentials是可选项。视具体情况而定,譬如我们项目中的项目就没有定义后两个

gradle脚本的分拆与引用,
如果gradle脚本太大我们可以根据功能给它分拆成几个子脚本,然后引入到主脚本中
apply from:”../resource/config.gradle”
这个在我们公司项目中没有用到,你们可以以后用。

设置支持语言:
利用这个可以去掉,第三方库中的无用语言,
android {
defaultConfig {
resConfigs “zh”
}
}

删除无用的apk中间产物
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
if (output.zipAlign != null) {
output.zipAlign.doLast {
output.zipAlign.inputFile.delete()
}
}
}
}

AndroidManifest占位符,BuildConfig以及资源配置

根据版本类型和构建变种定义不同的变量值供程序引用
manifestPlaceholders = [APP_KEY:”release”]
buildConfigField “String”, “EMAIL”, “\”[email protected]\””
resValue “string”, “content_main”, “Hello world from release!”
buildConfigField支持Java中基本数据类型,如果是字符串,记得加转义后的双引号 resValue支持res/values下的资源定义,字符串无需加转义后的双引号

manifestPlaceholders = [
DB_MD5_VALUE : deppon_db_business_md5,
DATABASE_DB_MD5_VALUE : deppon_db_database_md5,
ROOT_DIR_VALUE: “deppon_ecs”,
APPLICATION_ID_VALUE : defaultConfig.applicationId,
SERVER_BUILD_VALUE : server_build,
APP_PROPERTIES_MD5_VALUE : deppon_app_properties_md5
]
跳转到这里:

发布了35 篇原创文章 · 获赞 14 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章