Gradle 详细讲解 一看就懂
序
既然是浅析,自然也就没有深入的地方,我也写不出深入的地方,自己没有用过,也不会写出来坑人的;仅仅就是在 Android Studio 中的 Gradle 使用配置而已。
Gradle
Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。
依赖管理
支持多方式依赖管理:包括从 maven 远程仓库、 nexus 私服、 ivy 仓库以及本地文件系统的 jars 或者 dirs 。这也是我最喜欢的地方,操作简单。
新项目
一个新的项目中就包含这些文件,build 是两个,一个项目一个是 APP Model 的。另外在 APP 中可以看见有一个 manifest 文件夹,这意味着着可以有多 AndroidManifest 文件。
另外值得一说的是 gradle.properties 文件也是含有两个,但是却是一个是全局,一个是项目的;这与上面的 Build 文件有何区别?区别在于全局文件存在于 C:Users用户名.gradle文件夹中,该文件有可能没有,需要自己创建,创建后所有项目都将具有访问权限,在该文件中一般保存的是项目的一些变量等,如果是无关紧要的变量可以保存在项目文件中,如果是用户名密码等变量则需要保存在全局文件中。
至于项目的配置文件一般是空的。
local.properties
1
2
3
4
5
6
7
8
9
10
|
##
This file is automatically generated by Android Studio.
#
Do not modify this
file -- YOUR CHANGES WILL BE ERASED!
#
#
This file should *NOT* be checked into Version Control Systems,
#
as it contains information specific to your local configuration.
#
#
Location of the SDK. This is only used by Gradle.
#
For customization when using a Version Control System, please read the
#
header note.
sdk.dir=D:ToolKitsAndroidsdk
|
settings.gradle
1
|
include
':app'
|
build.gradle
项目:
两个大的包围一看就明了,一个是为编译准备的,一个是为所有项目准备的。
其中,Repositories 配置的是上面所说的依赖管理的东西,也就是依赖管理的服务器。默认是 jcenter() 你可以添加其他,多个之间不干扰。
dependencies 这个也是依赖管理的东西,上面是指定依赖管理的服务器,这个就是具体依赖什么库。
联合起来也就是,依赖 jcenter() 服务中的 gradle 库,其包名是:“com.android.tools.build” ,版本是:1.0.0 版本。
APP Model
在这个中基本可以按照名称来知晓其作用。
第一行:
1
|
apply
plugin: 'com.android.application'
|
1
|
apply
plugin: 'com.android.library'
|
dependencies :
这个也就是所谓的依赖了,在这里不光可以进行远程依赖(上面所说的方法),也可以本地依赖:
1
|
compile
fileTree(include: [ '*.jar' ],
dir: 'libs' )
|
1
|
compile
project( ':library' )
|
1
|
compile
'com.android.support:appcompat-v7:21.0.3'
|
其他一些介绍我以前发过文章可以看看,包括依赖 JNI 本地 aar 等等:
[Android][Android Studio] Gradle项目中添加JNI生成文件(.so文件)[Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
详细说说 android 部分:
先来看看基本完整的一个:
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
|
android
{
compileSdkVersion
ANDROID_BUILD_TARGET_SDK_VERSION as int
buildToolsVersion
ANDROID_BUILD_TOOLS_VERSION
defaultConfig
{
}
buildTypes
{
}
compileOptions
{
}
sourceSets
{
}
lintOptions
{
}
productFlavors
{
flavor1
{
}
flavor2
{
}
}
signingConfigs
{
release
{
storeFile
file(×.keystore)
storePassword
×××
keyAlias
××××
keyPassword
×××
}
}
}
|
1
2
|
compileSdkVersion
21
buildToolsVersion
21.1 . 2
|
defaultConfig
这个自然就是默认配置了,既然是默认配置那么久相当于全局配置,也就是说这里边配置的下面的 buildTypes 中也将自动继承了。
在这个中可以放入很多的控制,如下面 buildTypes/release 中的配置你也可以放到其中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
defaultConfig
{
applicationId
com.example.qiujuer.application
minSdkVersion
15
targetSdkVersion
21
versionCode
1
versionName
1.0
ndk
{
moduleName
genius
cFlags
-DANDROID_NDK -D_RELEASE
ldLibs
m, log, jnigraphics
abiFilters
all
}
}
|
下面自然也就是 最小的SDK版本为 15,目标版本为:21 也就是说其中的代码你使用的全是API21中的 Android。再有就是当前的版本代码,版本名称,在Eclipse 中这两个属性是在 AndroidManifest.xml 文件中,在这里把其提出来单独配置就是为了下面你可以在不同发布版本中配置不同的值。
至于这里的 ndk 部分,这个就是我额外加入的,其作用是可以直接编译 NDK 代码,不需要自己执行,具体详见:[Android] 环境配置之Android Studio开发NDK
buildTypes
在这里进行配置的是你的编译配置,可以看见这里有一个 release ,当然也就是有 debug 部分,两个部分配置都是一样。
在这里主要进行的配置是是否进行代码混淆,所以有一个代码混淆的开关,以及代码混淆的具体文件,文件有两种,无论哪种都行。
compileOptions
很多人或许不知道这个部分是干什么的,其是看看下面就明了了:
1
2
3
4
|
compileOptions
{
sourceCompatibility
JavaVersion.VERSION_1_7
targetCompatibility
JavaVersion.VERSION_1_7
}
|
sourceSets
这个部分,看名字应该有个大概意思就是说源码设置,其是很多从 Eclipse 中迁移过来的代码,大部分中都将带有这个设置,因为 Eclipse的文件夹与 AS 不尽相同,所以需要手动指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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' ]
}
}
|
lintOptions
这个其实应该写到最后的,因为这个是设置 编译的 lint 开关。
程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
1
2
3
|
lintOptions
{
abortOnError
false
}
|
productFlavors
在这里你可以设置你的产品发布的一些东西,比如你现在一共软件需要发布到不同渠道,且不同渠道中的包名不同,那么可以在此进行配置;甚至可以设置不同的 AndroidManifest.xml 文件。
1
2
3
4
5
6
7
8
9
10
11
|
productFlavors
{
flavor1
{
packageName= 'com.example.qiujuer.application1'
manifest.srcFile
'exampleapk/AndroidManifest1.xml'
}
flavor2
{
packageName= 'com.example.qiujuer.application2'
manifest.srcFile
'exampleapk/AndroidManifest2.xml'
}
}
|
signingConfigs
这个相信大伙都知道吧,就是为包签名的配置,你可以设置具体的签名文件,签名密码等等:
1
2
3
4
5
6
7
8
|
signingConfigs
{
release
{
storeFile
file(×.keystore)
storePassword
×××
keyAlias
××××
keyPassword
×××
}
}
|
Case
一些常用的操作配置说完了,来说说,一个简单的小Case 。
在 APP Model build.gradle 文件根部我们加上:
1
2
3
4
5
6
7
8
9
10
11
|
task
clearApk(type: Delete) {
delete
'../release/'
+ POM_ARTIFACT_ID + '_'
+ VERSION_NAME + '.apk'
}
task
makeApk(type: Copy) {
from( 'build/outputs/apk/' )
into( '../release/' )
include( 'app-debug.apk' )
rename( 'app-debug.apk' ,
POM_ARTIFACT_ID + '_'
+ VERSION_NAME + '.apk' )
}
makeApk.dependsOn(clearApk,
build)
|
代码分为3个部分,分别是删除,拷贝,以及将其连接起来的一个设置。
先说说这个 Case 的目的,其目的是拷贝 build/outputs/apk下面的debug apk文件到项目根目录的 release 文件夹下,并且更名。
但是细心的朋友应该会看见其中有两个参数:POM_ARTIFACT_ID VERSION_NAME 这两个从哪里来?
前面最开始讲过:gradle.properties 文件,这两个就是写在项目根部的 gradle.properties 文件中:
写好了,怎么运行呢?两种方式,第一种,代码 task 上右击,run():
第二张,命令行方式:
输入后回车,等待执行完成,成功后会出现:
现在看看项目中:
的确是成功了!