- 1.Introduction
- 1.1.gradle构建系统的目标
1)让重用代码和资源变得更加容易
2)让创建同一应用程序的不同版本变得更加容易,无论是多个apk发布版本还是同一个应用的不同定制版本。让构建过程变得更加容易配置,扩展和定制 - 1.2.为什么使用gradle
1)它允许通过插件创建自定义的构建逻辑
2)采用了Domain Specific Language(DSL语言)来描述和控制构建逻辑。
3)构建文件基于Groovy,并且允许通过混合声明DSL元素和使用代码来控制DSL元素以控制自定义的构建逻辑。
4)支持Maven或者Ivy的依赖管理。
5)插件可以提供自己的DSL和API以供构建文件使用。
- 1.1.gradle构建系统的目标
- 2.Basic Project(基本项目)
- 2.1.简单的构建文件
//项目本身需要声明自己的仓库和依赖关系
//这里的配置只影响控制构建过程的代码,不影响项目源代码
buildscript {//配置了驱动构建过程的代码
repositories {//仓库
mavenCentral()//声明了使用Maven仓库
}
dependencies {
classpath 'com.android.tools.build:gradle:0.11.1'//并且声明了一个maven文件的依赖路径,包含了1.3.1版本android gradle插件的库。
}
}
//
apply plugin: 'android'
//配置了所有android构建过程需要的参数。这里也是Android DSL的入口点
android {
compileSdkVersion 19//要配置目标编译SDK版本
buildToolsVersion "19.0.0"//编译工具版本
}
//设置脚本的运行环境
buildscript {
//支持java 依赖库管理(maven/ivy),用于项目的依赖。
repositories {
mavenCentral()
}
//依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
//声明构建的项目类型,这里当然是android了
apply plugin: 'android'
//设置编译android项目的参数
android {
compileSdkVersion 17
buildToolsVersion "17"
defaultConfig {
minSdkVersion 8
targetSdkVersion 17
}
//Android默认配置
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
//测试所在的路径,这里假设是tests文件夹,没有可以不写这一行
instrumentTest.setRoot('tests')
}
//这个是解决lint报错的代码
lintOptions {
abortOnError false
}
/**
* 签名设置
*/
signingConfigs {
myConfigs {
storeFile file("签名文件地址")
keyAlias "..."
keyPassword "..."
storePassword "..."
}
}
/**
* 混淆设置
*/
buildTypes {
release {
signingConfig signingConfigs.myConfigs
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* 渠道打包(不同包名)
*/
productFlavors {
qqqq {
applicationId = '包名'
}
hhhhh {
applicationId='包名'
}
}
}
/**
* .so文件的导入
*/
task copyNativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn copyNativeLibs
}
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = [new File(buildDir, 'lib')]
}
//依赖库
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
-dependencies {
//单文件依赖
compile files(‘libs/android-support-v4.jar’)
//某个文件夹下面全部依赖
compile fileTree(dir: ‘libs’, include: ‘*.jar’)
}
android {
}
- 2.3远程依赖
repositories {
//从中央库里面获取依赖
mavenCentral()
//或者使用指定的本地maven 库
maven{
url "file://F:/githubrepo/releases"
}
//或者使用指定的远程maven库
maven{
url "远程库地址"
}
}
dependencies {
//应用格式: packageName:artifactId:version
compile 'com.google.android:support-v4:r13'}
android {
}
- 3.android library 依赖
- 3.1.gradle mulit project .aar
- 3.2.你就会在 build/libs 目录下看到两个*.aar文件,一个debug包用的,一个是release 下用的,看个人需求使用,这里我们用的是release 版本的 .aar 文件
dependencies {
compile(name: 'pulltorefresh', ext: 'aar')
}
- 4.
- 4.1.一个项目可以包括多个工程,gradle可以构建多个工程,每个工程子目录都可以有build.gradle文件
- 4.2.build.gradle (Module: app)用来描述如何构建app工程
- 4.3.settings.gradle:include ‘:app’, ‘:model’, ‘:api’, ‘:core’ 表示当前有4个模块
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
//为Android的gradle插件指定位置和版本
classpath 'com.android.tools.build:gradle:1.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
//事先对整个构建可能包含的所有工程进行统一的配置
allprojects {
repositories {
jcenter()
}
}
build.
apply plugin: 'com.android.library'
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
//defaultConfig元素里的配置对应AndroidManifest.xml文件,优先级比AndroidManifest.xml文件里的配置高
defaultConfig {
minSdkVersion 15
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
versionCode 1
versionName "1.0"
}
//buildTypes元素默认定义了debug和release两种构建
buildTypes {
//debug构建出来的APK将包含调试符号,并且以debug key进行签名
release {//release类型的默认是没有签名的
minifyEnabled false//minifyEnabled为true表示启用自动清除无用代码
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//proguardFiles指定了代码混淆使用的相关文件
}
}
}
//指定此工程依赖什么
dependencies {
//compile这个方法指定要添加什么来编译主程序,这些东西将最终被打包进APK中。
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.code.gson:gson:2.3'
compile project(':model')
}
- 5.Android app/build.gradle。
- 5.1.buildscript{}:Configures the build script classpath for this project. 说白了就是设置脚本的运行环境
- 5.2.repositories{}:支持java 依赖库管理(maven/ivy),用于项目的依赖。这也是gradle 强力的地方.Returns a handler to create repositories which are used for retrieving dependencies and uploading artifacts produced by the project.
- 5.3.dependencies{}:依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件,如果前面定义了repositories{}maven 库,使用maven的依赖(我没接触过ivy。。)的时候只需要按照用类似于com.android.tools.build:gradle:0.4,gradle 就会自动的往远程库下载相应的依赖,The dependency handler of this project. The returned dependency handler instance can be used for adding new dependencies. For accessing already declared dependencies, the configurations can be used.。
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
说白了就是数据库和表的关系
5.4.apply plugin: ‘android’:声明构建的项目类型,这里当然是android了。。。
5.5.android{}:设置编译android项目的参数,接下来,我们的构建android项目的所有配置都在这里完成。
6.补充简介:
- 1)Gradle构建脚本(build.gradle)指定了一个项目和它的任务。
- 2)Gradle属性文件(gradle.properties)用来配置构建属性。
- 3)Gradle设置文件(gradle.settings)对于只有一个项目的构建而言是可选的,如果我们的构建中包含多于一个项目,那么它就是必须的,因为它描述了哪一个项目参与构建。每一个多项目的构建都必须在项目结构的根目录中加入一个设置文件。
7.依赖管理:
- 7.1.仓库是一种存放依赖的容器
- 7.2.Gradle支持的仓库格式:Ivy仓库/ Maven仓库/ Flat directory仓库,更多参考http://blog.jobbole.com/72992/
- 7.3.目前只考虑在构建中加入Maven仓库:
1)我们可以通过URL地址或本地文件系统地址,将Maven仓库加入到我们的构建中。
2)如果想通过URL地址添加一个Maven仓库,我们可以将以下代码片段加入到build.gradle文件中:
repositories {
maven {
url "http://maven.petrikainulainen.net/repo"
}
}
3)如果想通过本地文件系统地址添加一个Maven仓库,我们可以将以下代码片段加入到build.gradle文件中:
repositories {
maven {
url "../maven-repo"
}
}
7.4.在加入Maven仓库时,Gradle提供了三种“别名”供我们使用
**1)**mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。
**2)**jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。
3)mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。
- 8.声明外部依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'//用来编写单元测试
compile 'com.android.support:appcompat-v7:23.2.1'
}
官方建议这里指定的构建工具的版本最好大于等于目标SDK版本(targetSdkVersion)
http://www.codesec.net/view/196113.html
http://www.jcodecraeer.com/a/anzhuokaifa/Android_Studio/2015/0126/2361.html
http://www.devtf.cn/?p=760
https://docs.gradle.org/current/release-notes
http://blog.jobbole.com/71999/