-
Notifications
You must be signed in to change notification settings - Fork 0
/
buildsample.gradle
329 lines (287 loc) · 14 KB
/
buildsample.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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
apply plugin: 'com.android.application'//应用的插件名
android {//android项目的DSL
compileSdkVersion 23//required,编译sdk版本
buildToolsVersion "23.0.2"//required,编译工具版本
defaultConfig {//默认设置,类似于全局变量,所有的flavors都会共享
applicationId "com.gyz.androidsamples"//应用ID,用以代替packageName,与java区分开来,尽管清单 package 和 Gradle applicationId 可以具有不同的名称,但构建工具会在构建结束时将应用 ID 复制到 APK 的最终清单文件中。所以,如果您在构建后检查 AndroidManifest.xml 文件,package 属性发生更改就不足为奇。
minSdkVersion 17 //指明APP能够安装的系统API的最低版本
targetSdkVersion 23 //指明APP最适合运行的系统API版本
versionCode 1
versionName "1.0"
resConfigs "en", "fr", "xxhdpi"//限定语言仅支持英语和法语并且只使用xxhdpi资源
/**
* 必须加,否则64位手机无法加载so文件
*/
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86"
}
//for android < 5.0
vectorDrawables{
generatedDensities = ["mdpi","hdpi"]
}
vectorDrawables.useSupportLibrary = true;//for android < 5.0 use Appcompat
}
buildTypes {//build的种类,在assemble时会表现出来,例如assembleDebug,assembleRelease等,可与productFlavors配合使用
release {
applicationIdSuffix ".release"//相当于替换applicationId的作用,在最后添加后缀.release
minifyEnabled false //是否压缩资源,会拖慢构建速度,尽量在调试过程中使用
useProguard false //for instant run
//getDefaultProguardFile(‘proguard-android.txt') 方法可从 Android SDK tools/proguard/ 文件夹获取默认 ProGuard 设置。
//提示:要想做进一步的代码压缩,可尝试使用位于同一位置的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。
//proguard-rules.pro 文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 每次构建时 ProGuard 都会输出下列文件:
// dump.txt
// 说明 APK 中所有类文件的内部结构。
// mapping.txt 可以使用retrace脚本将mapping.txt文件和堆叠追踪生成新的可读堆叠追踪,位于tools/proguard/目录下,retrace -verbose mapping.txt obfuscated_trace.txt
// 提供原始与混淆过的类、方法和字段名称之间的转换。
// seeds.txt
// 列出未进行混淆的类和成员。
// usage.txt
// 列出从 APK 移除的代码。
debuggable false
jniDebuggable false
manifestPlaceholders = [activityLabel: "android例子"]//修改manifest文件文件内容
minifyEnabled false//是否混淆
multiDexEnabled false
renderscriptDebuggable false
shrinkResources true
//资源压缩只与代码压缩协同工作。代码压缩器移除所有未使用的代码后,资源压缩器便可确定应用仍然使用的资源,但不会移除values文件夹中的资源
//自定义需要保存的资源,在目录下建keep.xml,构建时不会将该文件打包到apk中
// <?xml version="1.0" encoding="utf-8"?>
// <resources xmlns:tools="http://schemas.android.com/tools"
// tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
// tools:discard="@layout/unused2" />
//在mapping/release/目录下有一个resources.txt的诊断文件,里面包含了那些资源引用了其他资源以及使用或者移除了哪些资源
zipAlignEnabled true
versionNameSuffix ".xx"
}
debug {
applicationIdSuffix ".debug"
ext.enableCrashlytics = false
}
jniDebug {
initWith debug //从debug构建模式下copy配置
applicationIdSuffix ".jnidebug"
jniDebuggable true
}
}
// flavorDimensions "brand","environment" //会生成flavor1-flavor2包
productFlavors {//构建出的产品,多渠道包等等
//在src文件夹下分别创建flavor1、flavor2子目录
//将flavor1的图片放入flavor1/res/drawble中,flavor2的图片放入flavor2/res/drawable中,文件名相同,其他资源文件相同,在build时会自动合并
//代码中的区别通过自动生成的BuildConfig.FLAVOR来判断
normal {
applicationId "com.gyz.androidsamples"
consumerProguardFiles //打包aar文件时的混淆文件
jackOptions {//google新的java编译系统jack
enabled false
jackInProcess true//jack是否和gradle相同的jvm进程中
}
manifestPlaceholders = [activityLabel: "android例子"]//修改manifest文件文件内容
multiDexEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// signingConfig {
//// storeFile file("/Users/guoyizhe/svn/FHloveSVN/xingqu.jks")
//// storePassword '123456'
//// keyAlias 'xingqu'
//// keyPassword '123456'
// signingConfig signingConfigs.release//从配置文件中读取密码
// storePassword System.getenv("KSTOREPWD")
// keyPassword System.getenv("KEYPWD")
//
// storePassword System.console().readLine("\nKeystore password: ")//用户输入密码
// keyPassword System.console().readLine("\nKey password: ")
// }
testApplicationId "com.gyz.androidsample.test"
versionCode 10
versionName "10"
}
flavor1 {
// dimension "brand"
applicationId "com.gyz.androidsamplesbranchone"
manifestPlaceholders = [activityLabel: "android例子flavor1"]
}
flavor2 {
// dimension "environment"
applicationId "com.gyz.androidsamplesbranchtwo"
manifestPlaceholders = [activityLabel: "android例子flavor2"]
}
}
aaptOptions {//aapt设置,会影响所有使用aapt的项目
// additionalParameters //传到aapt中的额外元素,方法数过多时调用
cruncherEnabled true //是否检测png合法性,停用可加快构建速度
failOnMissingConfigEntry false //当aapt检测配置中实体缺失时强制返回error
ignoreAssets false //忽略对assets文件的描述
noCompress 'foo', 'bar'
ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"
}
adbOptions {//adb设置,会影响所有使用adb的项目
installOptions
timeOutInMs 3000 //超时时间
}
applicationVariants {//会返回applicationVariant的DomainObjectCollection对象,可以对所有对象直接访问,也可以通过过滤器过滤
}
android.applicationVariants.each {//过滤器访问applicationVariants对象
}
compileOptions {//编译设置
encoding "utf-8"//java文件编码格式
sourceCompatibility JavaVersion.Version_1_8//java源文件版本
targetCompatibility JavaVersion.Version_1_8//生成的java字节码版本
}
dataBinding {//数据绑定
addDefaultAdapters
enabled false
version "1.0"
}
defaultPublishConfig "xxx"//构建默认artifact的配置名
dexOptions {//dex设置
dexInProcess true //是否dex与gradle在同一个jvm进程中
javaMaxHeapSize "2048m"//-xmx
jumboMode true //可解决AGPBI 警告
maxProcessCount 4 //当前dex可用最大进程数 默认为4
preDexLibraries true //是否预加载dex包,开启的话会提高build速度,但clean速度会减慢
threadCount 4 //dx可用线程 默认为4,但是源码中注释掉了..com.android.builder.core.AndroidBuilder.java
}
generatePureSplits false//是否分割或者生成多包
jacoco {//jacoco设置,一款覆盖率工具
}
lintOptions {//lint设置
abortOnError false //当lint发现errors时是否退出
absolutePaths false //lint输出错误时是否显示绝对路径
checkAllWarnings false//是否检测所有警告
checkReleaseBuilds false //lint在打release包过程中是否检测致命错误,默认为true
ignoreWarnings true
htmlOutput
htmlReport true //html报告 与 htmlOutput一块使用
lintConfig //自定义lint文件
noLines true //是否显示错误源码Line,默认为true
quiet false //是否不输出信息
// <?xml version="1.0" encoding="UTF-8" ?>
// <lint>
// <issue id="MissingTranslation" severity="warning" />
// </lint>
severityOverrides {
["MissingTranslation": "warning"]
}
showAll false
warningsAsErrors false
}
packagingOptions {//包设置
exclude 'LICENSE.txt'//不引入的路径,常用于解决包冲突
exclude 'META-INF/LICENSE.txt'
merges ''
pickFirsts ''
}
resourcePrefix "as"//创建新资源时的前缀,通过studio使用
signingConfigs {//签名设置
}
splits {//根据屏幕密度或者区域语言生成多个apk
abi {
enable true
reset()//重置为none
include 'armeabi', 'armeabi-v7a', 'x86'
universalApk true
}
density {
enable true
exclude "ldpi", "tvdpi", "xxxhdpi"
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
language {
enable true
}
}
testOptions {//test设置
unitTests {
//默认状态下,单元测试遇到代码试图访问android api时会抛出异常,设置为true后,会返回null或者0
returnDefaultValues true
all {
jvmArgs '-XX:MaxPermSize=256m'
if (it.name == 'testDebug') {
systemProperty 'debug', 'true'
}
if (it.name == 'connectedDebugAndroidTest') {
}
}
}
}
useLibrary 'org.apache.http.legacy'//运行需要的Library
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
test {
java.srcDirs = ['test']
}
androidTest {
java.srcDirs = ['androidTest']
}
// Move the tests to tests/java, tests/res, etc...
// instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
configurations {
// all {
// //全局的依赖传递是否开启,默认为true,也就是这个包内的依赖会递归的传递过来,设置为false后,只添加本依赖包,依赖包内所依赖项不会添加进来
// transitive = true
// resolutionStrategy {
// // 如果想插件和snaphost版本实时生效,请打开注释
// cacheChangingModulesFor(0, 'SECONDS')
// //TODO 设置所有依赖库的依赖,防止间接依赖导致版本号不对
// force ("com.google.android:android:4.4.2")
// }
// }
//TODO 全局排除单个依赖
all*.exclude group: 'com.taobao.android', module: 'alisdk-hotfix'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
// provided compile 'xxx.jar'//指定 Gradle 不与应用的 APK 一起打包的编译时依赖项。如果运行时无需此依赖项,这将有助于缩减 APK 的大小。您可以将此配置与 JAR 二进制依赖项一起使用,而不能与其他库模块依赖项或 AAR 二进制依赖项一起使用。
//implementation相对于compile优秀之处在于在编译时,这个依赖只对当前module可见,避免了构建系统的recompile
implementation project(":lib")
implementation fileTree(dir:'libs',include:['*.jar'])
implementation files('libs/foo.jar',"libs/bar.jar")
implementation 'com.example.xxx'
implementation group:'com.example.xxx',name:'magic',version:'12.3'
//与implementation相反,api会穿透传递当前lib,所以在编译期所有依赖此lib的module都会进行recompile
api project(":libs")
}
task updateIcon << {
println "Generating Release Icon"
def scriptDir = "/scripts";
exec {
executable "bash"
args "$rootProject.rootDir$scriptDir/icon_gen.sh", "v1.0", rootProject.rootDir, scriptDir
}
}
preBuild.dependsOn updateIcon
afterEvaluate()
//map for abi version code
ext.abiCodes = ['armeabi-v7a': 1, mips: 2]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (baseAbiVersionCode != null) {
output.versionCodeOverride = baseAbiVersionCode * 1000 + variant.versionCode
}
}
}