上一篇结合Android 项目大致的介绍了一下Gradle在Android中的应用。其中也多次提到了build.gradle。但是没有详细的介绍其的基本结构和其作用。那么本文就将围绕这些展开。在这之前先看看Android中的Gradle脚本也哪些
Android项目中的Gradle脚本
一般情况下,使用Android Studio创建的Android项目会默认产生3个Gradle脚本:
1.root目录下build.gradle
2.root目录下setting.gradle
3.app目录下build.gradle
如下图
BaseProject
├── build.gradle
├── settings.gradle
└── app
└── build.gradle
root目录下的build.gradle文件,主要是定义整个项目的所有模块的公共属性,主要内容如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这就是Android项目实际构建就是从这里开始的,我们使用了JCenter作为我们的仓库,JCenter类似maven库,不需要任何额外的配置,grade还支持其他几个仓库,不论是远程还是本地仓库。仓库包含了一系列的依赖,配置了某个仓库,那么我们就可以使用这个仓库包含的依赖了。allprojects方法给我们提供了一种可以用来定义各个模块的默认属性的途径,这样我们可以自己在allprojects中定义一些tasks,在所有的模块中都能使用。最后一个task clean(也可以定义为别的名字),任务类型是Delete(也可以是Copy),就是每当修改settings.gradle文件后点击同步,就会删除rootProject.buildDir下的文件。
setting.gradle文件在项目只有一个模块的时候是这个样子:
include ':app'
如果是多模块的话,会相应的include对应的模块,改文件定义了哪一个模块将会被构建(setting.gradle是针对多模块操作的,所以单独的模块工程完全可以删除掉该文件)。在这之后,Gradle会为我们创建一个Setting对象,并为其包含必要的方法,我们不必知道Settings类的详细细节,但是最好能够知道这个概念。
app目录下的build.gradle文件,只对app模块起作用,而且其可以重写任何在root文件目录build.gradle文件中定义的参数。该文件类似于:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.chuck.moblie.baseproject"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
可以看到该文件的结构很清晰:
1.apply plugin: ‘com.android.application’该语句中的apply是一个方法,给它传递了一个参数plugin,plugin 的值是’com.android.application’。如果有多个参数,则以逗号隔开。
2.android:主要配置Android相关的参数属性
3.dependencies:可以添加需要的依赖包。
下面来详细的分析一下android这个方法中的内容:
compileSdkVersion
buildToolsVersion
defaultConfig
buildTypes
compileSdkVersion和buildToolsVersion 是必须的,前者指定编译项目的sdk后者指定构建工具(build tools)的版本。这里的build tools(在sdk/build-tools/目录下)包含了我们在构建项目时的很多实用工具,像aapt,dx等。
defaultConfig指定的是Android应用的核心属性,在defaultConfig指定之后,会覆盖在AndroidManifest.xml指定的相对应的属性。
defaultConfig {
applicationId "com.chuck.moblie.baseproject"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
applicationId: 指定项目的包名,该属性会覆盖AndroidManifest.xml指定的package name属性,但是它又package name不完全一样,applicationId可以被用作app在各应用商店或者设备上的唯一标示,package name可以用作资源代码和R文件的包名。
minSdkVersion:应用最低支持的Android版本。这里我指定是API10应用的Android系统版本就是Gingerbread(Android2.3)了。
targetSdkVersion:指定最高能支持的Android系统版本。API23对应的是Android M(Android6.0)
versionCode :改app的版本一般在升级系统时需要用到
versionName :改app版本名称。
有了这些属性,并且会覆盖AndroidManifest.xml的相应属性,所以可以不用在AndroidManifest.xml文件中定义。
dependencies是Gradle的默认属性,所以不用定义在android方法中,它主要指定对应的模块所需要的依赖。只需要通过compile一句话就可以搞定:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
下面介绍一下常用的依赖引用方式:
1.compile fileTree(dir, ‘libs’ ,include : ‘*.jar’) 依赖本地libs目录下的所有jar文件
2.compile file(‘libs/xxx’) 依赖当个libs目录(可以自己指定路径,不一定要是libs)下的单个jar文件。
3. compile project(:xx:xx) 依赖某个工程。
4. compile ‘group:name:version’ 依赖仓库中的库,当然这里的仓库根据前文介绍是在root目录下的build.gradle中指定的,可以是JCenter也可以是本地的仓库。
build.gradle的配置基本内容,基本介绍完了,接下来就是根据自己的项目定义一些task来处理。下一篇文章将继续介绍task。