文章目录
  1. 1. 基本介绍
  2. 2. 使用方法
    1. 2.1. 从官网入手
    2. 2.2. compileOptions示例
  3. 3. 注意事项:

基本介绍

本文是针对android开发中的build.gradle文件中的常用配置总结,一些配置是在特定的场景下才使用,一些是为了解决一些问题才加上。所以默认还是使用在Android Studio工具中新建项目时生成的默认的build.gradle文件中的配置,等遇到了问题,再来加一些配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

// apply plugin: 'com.android.library' // 库配置
apply plugin: 'com.android.application' // 应用程序配置

repositories { // 引入AAR文件时,需要配置这个,AAR文件放在libs目录中
flatDir {
dirs 'libs'
}
}

android {
compileSdkVersion 25 // android编译SDK的版本,即4.0SDK、5.0SDK等的android.jar文件
buildToolsVersion "25.0.2" // 使用SDK中编译工具的版本
useLibrary "org.apache.http.legacy" // 在6.0上使用apache的httpClient包,原因是google在6.0上去掉了这个http请求库

defaultConfig {
applicationId "com.xxx" // 应用的包名可以在AndroidMainfest.xml中使用${applicationId}的方式引用这个包名
minSdkVersion 15 // 最小兼容版本
targetSdkVersion 25 // 目标版本
versionCode 1 // 应用的版本号
versionName SDK_VERSION // 应用的版本名称
multiDexEnabled true // 启用多dex,如果app中的代码方法数超过65535

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // android单元测试配置

}

sourceSets { // 指定代码及资源的路径,具体可以参考这里http://google.github.io/android-gradle-dsl/2.3/com.android.build.gradle.api.AndroidSourceSet.html
main {
manifest.srcFile 'AndroidManifest.xml' // 指定manifest.xml路径
java.srcDirs = ['src'] // java文件的路径,包名的上一层,多个目录使用逗号分隔,如['src', 'core']
resources.srcDirs = ['src'] // resource资源所有的目录,注意这里是指jar文件中包含的一些资源,如properties文件,而不是APK中的res资源
aidl.srcDirs = ['src'] // aidl文件的目录
renderscript.srcDirs = ['src'] // renderscript文件的路径
res.srcDirs = ['res'] // android APK中的资源路径
assets.srcDirs = ['assets'] // android app中的asset目录
jniLibs.srcDirs = ['libs'] // SO库的路径
}
}

lintOptions {
checkReleaseBuilds false // release编译时禁用lint检查
abortOnError false // 报错不会停止打包,除非很严重的很影响
disable 'MissingTranslation', 'ExtraTranslation' // 禁用lint检查中的一些选项
}

dexOptions {
javaMaxHeapSize "4g" // 设置编译项目代码时最在的堆内存大小,否则项目过大时,编译内存溢出
}

compileOptions { // 具体参考这里http://google.github.io/android-gradle-dsl/2.3/com.android.build.gradle.internal.CompileOptions.html
sourceCompatibility JavaVersion.VERSION_1_7 // 设置代码编译的版本,一般是在使用JDK1.8时,配置这个,使编译出来的jar包让别人使用时更通用
targetCompatibility JavaVersion.VERSION_1_7
}

packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt' // 排除这些第三方jar中的声明文件,否则编译时容易导致报错
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'
}

buildTypes {
debug {
storeFile file("debug.keystore") // 签名文件相对路径
storePassword "android" // 签名的密码
keyAlias "androiddebugkey" // 别名
keyPassword "android" // 别名密码

buildConfigField "boolean", "FLAG_DEBUG", "true" // 在BuildConfig.的类中自动生成public static final boolean FLAG_DEBUG = true;代码
buildConfigField "String", "API_VERSION", "\"1\""

ndk {
abiFilters "armeabi", "armeabi-v7a" // 只保留这几种CPU架构的SO库,需要高版本的gradle才支持
}

// jniDebuggable true // 启用JNI debug,一般很少使用,不建议开这个选项,会影响java代码的debug速度
}

release {
buildConfigField "boolean", "FLAG_DEBUG", "false"
buildConfigField "String", "API_VERSION", "\"1\""
minifyEnabled true // 在混淆时去除代码中无用的内容
shrinkResources true // 在混淆时去除无用的资源,针对res/目录中的内容,不会压缩图片的大小
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 配置混淆文件

ndk {
abiFilters "armeabi", "armeabi-v7a" // 只保留这几种CPU架构的SO库,需要高版本的gradle才支持
}
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs') // 导入libs目录中的所有jar包
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { // 排除group中的modle,注意group和module名称com.android.support:support-annotations
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.0' // 使用google的appcompat-v7包
testCompile 'junit:junit:4.12' // 引入junit单元测试

compile 'com.android.support:multidex:1.0.0' // 加入加载多dex库
compile files('libs/gson.jar') // 引用libs目录中的gson.jar包
compile(name: 'HMS-SDK-2.4.0.300', ext: 'aar') // 引入HMS-SDK-2.4.0.300.aar文件,同时还需要参考文件头部分的配置
compile('com.facebook.fresco:fresco:1.0.0') { exclude module: 'support-v4' } // 引入fresco库,但不使用其中引用的support-v4库,否则导致重复引入,编译报错duplicate
provided fileTree(dir: 'compilelibs', include: ['*.jar']) // 引入compilelibs目录下面的jar文件参与编译,但不将这些包的代码打入APK、jar或AAR中。
}

// 使用jar任务生成jar文件,依赖assembleRelease的task
task buildJar(type: Jar, dependsOn: ['assembleRelease']) {
destinationDir = file('build/outputs/jar/')
appendix = ""
baseName = ""
version = SDK_VERSION

// manifest信息
def map = ['Version': SDK_VERSION,
'Gradle': project.gradle.gradleVersion,
'Vendor': 'jacpy.com',
'Date': new Date().getDateTimeString()
]
manifest.attributes(map)

// from( 'build/intermediates/classes/release/')
from(project.zipTree( 'build/intermediates/transforms/proguard/release/jars/3/3/main.jar'))
exclude('**/BuildConfig.class')
exclude('**/BuildConfig\$*.class')
exclude('**/R.class')
exclude('**/R\$*.class')
include('**/*.class')
}

// 使用Copy任务复制内容
task copySDK(type: Copy, dependsOn: ['buildJar']) {
from('build/outputs/jar')
into('../app/libs/')
include("*.jar")
}

使用方法

本方会持续更新,随着android的gradle工具的升级,可能有些配置会发生变化。比如ndk.abiFilters需要在高版本的gradle工具中才能使用,如何升级gradle版本,也可能会带来编译不通过等问题,需要耗费较长时间去解决,所以请慎重。

关于一些配置的用法,下面举其中一个例子,其他雷同。

比如怎么知道有这个compileOptions配置?这个配置下面的又有哪些可以设置?这些设置怎么去使用?能给哪些值?

1
2
3
4
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7 // 设置代码编译的版本,一般是在使用JDK1.8时,配置这个,使编译出来的jar包让别人使用时更通用
targetCompatibility JavaVersion.VERSION_1_7
}

从官网入手

android官方定义的gradle工具的使用说明文档点这里,gradle官方的说明文档点这里

点开链接中有个DSL,这个DSL是啥?DSL就是Gradle Build Language的缩写。哈哈,开个玩笑,是Domain Specific Language的缩写,Domain可以理解为Project

跑题了,继续。

compileOptions示例

打开android gradle工具的官方说明文档页面会看到如下图所示的版本选择页面:

android gradle工具版本

这个版本是与android studio项目根目录下的build.gradle文件中的gradle版本是对应起来的。同时发现,这个版本会与android studio的版本对应。如下图所示:

android studio build.gradle文件中的版本

点击当前的2.2版本的链接,进入到如下界面,如下图所示,在左侧找到compileOptions,并点击这个链接(熟悉这个官方文档可以从左侧的Home项开始):

compileOptions的位置

再点击上图中红色框框标记的链接,就会跳转到如下图所示位置的配置说明,这种跳转的方式有点类似Java的API,只不过这个时候看到的应该是详细,结果却没有:

compileOptions详细说明

需要进一步查看详细,只能是点击上图红色框框标记的链接,进去之后就会发现熟悉的内容了,如下图所示:

compileOptions详细配置说明页面

有没有一种久违的感觉,终于快看到真相了吧?还差一步。compileOptions中可用的选项及含义已经在上面写的很清楚了。再点击sourceCompatibility会跳到如下图所示内容:

sourceCompatibility可配置的参数

可以从上面看到sourceCompatibility可以取哪些值,终于找到结果了。

OK,compileOptions示例就到这里,其它的配置使用也可以使用相同的方法,gradle官方使用文档也是类似,剩下的只是熟悉的问题了。

注意事项:

    1. 如果shrinkResources设置为true,在高版本的gradle中打release APK时会出现如下错误:
1
build\intermediates\res\resources-release-stripped.ap_' specified for property 'resourceFile' does not exist.

导致的原因不明,解决方法是将其设置为false。


更新日志:

  • 2017-03-07 增加注意事项中的1说明。
文章目录
  1. 1. 基本介绍
  2. 2. 使用方法
    1. 2.1. 从官网入手
    2. 2.2. compileOptions示例
  3. 3. 注意事项: