http://www.bkjia.com/Androidjc/981624.html

随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse。但是新的IDE与以往的Eclipse有很大区别,这导致部分开发者望而却步,其中一个大家觉得比较麻烦的是Android Studio采用的新的构建系统,gradle。那么这篇文章我将对gradle进行一个简单介绍(主要讲gradle配合Android Studio的使用),希望帮助大家熟悉gradle。

一. gradle是什么? gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www.gradle.org/

二.为什么使用gradle?

更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;

三.gradle入门需知
  1.基本配置:首先明确gradle跟maven一样,也有一个配置文件,maven里面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android项目通常至少包含两个build.gradle文件,一个是project范围的,另一个是module范围的,由于一个project可以有多个module,所以每个module下都会对应一个build.gradle。这么说有点抽象,看下面这个图:

这是一个android工程的project视图,上面那个是module下的build.gradle文件。下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。下面看下这两个build.gradle里面的内容:
project#build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {
//构建过程依赖的仓库repositories {jcenter()}
//构建过程需要依赖的库dependencies {//下面声明的是gradle插件的版本classpath 'com.android.tools.build:gradle:1.1.0'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}
//这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了
allprojects {repositories {jcenter()}
}

注: 大家可能很奇怪,为什么仓库repositories需要声明两次,这其实是由于它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。
module#build.gradle:

//声明插件,这是一个android程序,如果是android库,应该是com.android.library
apply plugin: 'com.android.application'
android {//安卓构建过程需要配置的参数compileSdkVersion 21//编译版本buildToolsVersion "21.1.2"//buildtool版本defaultConfig {//默认配置,会同时应用到debug和release版本上applicationId "com.taobao.startupanim"//包名minSdkVersion 15targetSdkVersion 21versionCode 1versionName "1.0"}buildTypes {//这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等release {//release版本minifyEnabled false//是否开启混淆proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置}}
}
dependencies {//模块依赖compile fileTree(dir: 'libs', include: ['*.jar'])//依赖libs目录下所有jar包compile 'com.android.support:appcompat-v7:21.0.3'//依赖appcompat库
}

defaultConfig中是一些基本配置,它会同时应用到debug/release版本上,下面列举了所有可配项及对应的值:

buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。buildTypes里还有很多可配置项,下面列举了所有可配项以及debug/release版本的默认值:
现在大家对build.gradle已经初步了解了,我们再看下其他一些与gradle相关的文件:1.gradle.properties:从名字上就知道它是一个配置文件,没错,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias等。2.settings.gradle:这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:

include ':module-a',':module-b'

3.gradle文件夹: 这里面有两个文件,gradle-wrapper.jar和gradle-wrapper.properties,它们就是gradle wrapper。gradle项目都会有,你可以通过命令gradle init来创建它们(前提是本地安装了gradle并且配置到了环境变量中)。
4.gradlew和gradlew.bat: 这分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。 gradlew的用法跟gradle一模一样,比如执行构建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的缩写。
2.gradle仓库: gradle有三种仓库,maven仓库,ivy仓库以及flat本地仓库。声明方式如下:

maven{url  "..."
}
ivy{url  "..."
}
flatDir{dirs 'xxx'
}

有一些仓库提供了别名,可直接使用:

repositories{mavenCentral()jcenter()mavenLocal()
}

3.gradle任务: gradle中有一个核心概念叫任务,跟maven中的插件目标类似。gradle的android插件提供了四个顶级任务

assemble  构建项目输出
check  运行检测和测试任务
build 运行assemble和check
clean 清理输出任务

执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行

gradlew assemble

它通常会执行:

gradlew assembleDebug
gradlew assembleRelease

这时会在你项目的build/outputs/apk或者build/outputs/aar目录生成输出文件
注:linux下执行构建任务需要首先更改gradlew脚本的权限,然后才能执行该脚本:

chmod +x gradlew
./gradlew assemble

可以通过:

gradlew tasks

列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。
四.常见问题

1.导入本地jar包: 跟eclipse不太一样,android studio导入本地jar除了将jar包放到模块的libs目录中以外,还得在该模块的build.gradle中进行配置,配置方式是在dependencies结点下进行如下声明:

compile files('libs/xxx.jar')

如果libs下有多个jar文件,可以这样声明:

compile fileTree(dir: 'libs', include: ['*.jar'])

2.导入maven库:

compile 'com.android.support:appcompat-v7:21.0.3'

可见,格式为

compile 'groupId:artifactId:version'

3.导入某个project: 你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:

compile project(':module-A')

并且你需要在settings.gradle中把module-A模块包含进来:

include ':module-A',':app'

此外,这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:

apply plugin: 'com.android.library'

而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的,这点需要注意。

4.声明三方maven仓库: 可能你项目需要的一些库文件是在你们公司的私服上,这时候repositories中仅有jcenter就不行了,你还需要把私服地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。配置方式:

repositories{maven{url="http://mvnrepo.xxx.com" }
}

5.依赖三方aar文件:

compile 'com.aaa.xxx:core:1.0.1@aar'

6.将库项目导出为aar:
首先你的项目必须是一个库项目,build.gradle中进行配置:

apply plugin : 'com.android.library'

然后你可以在命令行中进到项目目录,执行如下gradle任务:

gradlew assembleRelease//确保该目录下有gradlew文件

生成的aar在/build/output/aar文件夹中
7.引用本地aar:
 首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:

repositories{flatDir{dirs 'libs'}
}

最后在dependencies结点下依赖该aar模块:

dependencies{compile (name:'xxx',ext:'aar')
}

8.排除依赖: 当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:

compile (group:'xxx',name:'xxx',version:'xxx'){exclude group:'xxx',module:'xxx'//module对应的就是artifactId
}

9.多dex支持(打包65k方法数限制)  首先在build.gradle的buildConfig中增加如下配置:

multiDexEnabled true

接着,在dependencies结点下增加如下依赖:

dependencies{compile 'com.android.support:multidex:1.0.0'
}

最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。详细内容参见官方文档。
10.自动移除不用资源  可以在buildTypes结点中增加如下配置:

buildTypes{release{minifyEnabled trueshrinkResources true}
}

11.忽略lint错误: 可以在build.gradle文件中的android结点下增加如下配置:

android{lintOptions{abortOnError false }
}

12.声明编译的java版本 可以在build.gradle文件中的android结点下增加如下配置:

compileOptions {sourceCompatibility JavaVersion.VERSION_1_7targetCompatibility JavaVersion.VERSION_1_7}

13.应用签名配置 首先在module的build.gradle中增加这些字段:

storeFiles:keystore文件存储位置,通常是.jks文件
storePassword 密码
keyAlias keystore别名
keyPassword 密码

具体配置方式为:首先在build.gradle的android结点下增加如下配置:

 signingConfigs {//debug版本的签名配置,通常不用配,因为有默认的debug签名debug {}release {storeFile file("key.jks")storePassword "123456"keyAlias "mykey"keyPassword "123456"}}

注:debug的默认签名为:

signingConfig android.signingCongfigs.debug

位置为

${home}\.android\debug.keystore

然后在buildTypes结点下的对应版本中添加上面的配置:

buildTypes{release{signingConfig signingConfigs.release}
}

当然,release不是固定的名称,你可以随便取,比如这样:

android {signingConfigs {debug {storeFile file("debug.keystore")}myConfig {      storeFile file("other.keystore")storePassword "android"keyAlias "androiddebugkey"keyPassword "android"}}buildTypes {foo {debuggable truejniDebuggable truesigningConfig signingConfigs.myConfig}}
}

真实开发中,把密码配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:

RELEASE_STOREFILE=xxx.jks
RELEASE_STORE_PASSWORD=123456
RELEASE_KEY_ALIAS=mykey
RELEASE_KEY_PASSWORD=123456

然后直接引用即可:

 storeFile file(RELEASE_STOREFILE)storePassword RELEASE_STORE_PASSWORDkeyAlias RELEASE_KEY_ALIASkeyPassword RELEASE_KEY_PASSWORD

14.定制buildConfig: 在build.gradle中配置:

buildTypes{release{buildConfigField "string","type","\"release\""}debug{buildConfigField "string","type","\"debug\""}
}

这样就会在BuildConfig类中生成type字段:

//build/generate/source/buildConfig/release/包名/   路径下的BuildConfig.java
public static final String type = "release"
//build/generate/source/buildConfig/debug/包名/    路径下的BuildConfig.java
public static final String type = "debug"

gradle入门,安卓gradle入门相关推荐

  1. gradle引入依赖:_Gradle入门:依赖管理

    gradle引入依赖: 即使不是没有可能,创建没有任何外部依赖关系的现实应用程序也是一项挑战. 这就是为什么依赖性管理是每个软件项目中至关重要的部分的原因. 这篇博客文章描述了我们如何使用Gradle ...

  2. 安卓从入门到进阶第九章(自动亮屏)

    安卓从入门到进阶第六章(dumpsys初探) 我希望文章是给出一个思路,让你能够跟着这个,找到框架,然后自行分析,总结,得到知识. 阅读代码,是需要长时间的训练,从问题出发,就跟从项目出发一样,在实战 ...

  3. android安卓开发入门视频教程资料百度网盘下载

    android安卓开发入门视频教程资料讲解安卓核心基础,包含视频+笔记,适合新手入门学习. 百度网盘:https://pan.baidu.com/s/1uciMAAa97nm5RSLILtdPdg&a ...

  4. 安卓从入门到进阶第六章(dumpsys初探)

    后续还是会写一写关于安卓的知识,只是写的就按照轻快,实战为主,不做过多原理的剖析了.今天就来处理一个问题, 如何快速定位当前手机屏幕上某个区域上是哪个应用绘制的? 如下为解决方案: 使用 adb sh ...

  5. 安卓动画入门_网络动画入门

    安卓动画入门 无论您是刚刚开始使用基础知识还是想探索更高级的技术,我们已经构建了完整的指南来帮助您学习CSS和为CSS 设置动画 . 网络动画入门 近年来,Motion已成为Web设计领域中非常重要的 ...

  6. 安卓开发入门教程-UI控件_EditText

    什么是EditText EditText是用于进行文本输入的UI控件. 基础样例 1.普通输入 效果图 代码 <EditTextandroid:layout_width="wrap_c ...

  7. 安卓开发入门篇(一):Android Studio导入ApiDemos

    引言 本人程序员,之前做网站比较多,nodejs/express+html/css+mysql,再之前也做过Java开发,编程上还是有丰富的经验. 在持续的实战中,发现想做产品的话,前端似乎更重要,因 ...

  8. 鸿蒙APP开发入门到进阶 | 入门完整篇。

    大家好,我是 码工,一个有十年工作经验的码农,一心追求技术. 先说说我的开发经历,10年毕业,到目前已经十多年开发经验,大学学习了多种语言,Java,Android,c,c++,到毕业时真正掌握了几乎 ...

  9. 多个 gradle 文件夹 \.gradle\wrapper\dists\ 设置gradle不是每次都下载

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 设置gradle不是每次都下载 \.gradle\wrapper\dists\ ==== ...

最新文章

  1. socket编程:I/O模型
  2. Windows Server 2012
  3. Junit 3 与 Junit 4写法
  4. Android入门(九)文件存储与SharedPreferences存储
  5. ABAP实现本地化的资产负债表和损益表
  6. 对于初学者学习Java语言的建议(转载)
  7. 细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4
  8. Quartz以及代码实现--可以实现定时器效果
  9. 大话数据结构 : 二叉排序树
  10. 从大学生到职场人,一段深刻的思维认知升级补丁
  11. 谷歌地图将很快显示电动汽车充电站
  12. 《深入浅出DPDK》读书笔记(九):流分类与多队列、流过滤、虚拟化流分类方式、流分类技术的使用
  13. python 自定义词典_cawdrey-Python的几个有用的自定义词典 -Dominic Davis-Foster
  14. css未生效,css不生效是什么原因
  15. 应网友邀请参加了2011年度51CTO的IT博客大赛
  16. linux下repair filesystem模式修复方法
  17. wpf DoEvents
  18. PowerPoint-漂亮表格三招
  19. mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...
  20. 笔记本电脑怎么给别人开热点

热门文章

  1. java数字转字符串及字符串转数字
  2. SpringMVC中@RequestMapping 6个基本用法小结
  3. SQLYog快捷键大全
  4. 漫画说算法--动态规划算法二(绝对通俗易懂,非常棒)
  5. 全面剖析【二叉树】的各类遍历方法
  6. Python学习--最完整的基础知识大全
  7. Java 里的HashMap(HashTable) 简介.
  8. node2vec文献出处_社交网络分析(五)-Node2Vec
  9. mysql中文时好时坏_mysql索引的问题,时好时坏
  10. 百度云android隐藏空间,一招教你使手机端百度网盘中的隐藏空间在文件列表中显示出来...