欢迎和大家交流技术相关问题:
邮箱: jiangxinnju@163.com
博客园地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju

首先用一段通俗易懂但是不是非常专业的话描述一下三者的概念、区别和联系。

  • Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。
  • Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。
  • Android Plugin for Gradle是一堆适合Android开发的Gradle插件的集合,主要由Google的Android团队开发,Gradle不是Android的专属构建系统,但是有了Android Plugin for Gradle的话,你会发现使用Gradle构建Android项目尤其的简单。

另外需要说明的一点是Gradle、Gradle Wrapper与Android Plugin for Gradle不一定要和Android Studio一起使用,你可以完全脱离Android Studio,使用三者独立进行Android项目的构建。下面是三者官方的指导文档(从地址可以看出Gradle Wrapper是Gradle项目的一部分):

  • Gradle: https://docs.gradle.org/current/userguide/userguide_single.html
  • Gradle Wrapper: https://docs.gradle.org/current/userguide/gradle_wrapper.html
  • Android Plugin for Gradle: https://developer.android.com/studio/build/index.html

为了加深大家对于三者的理解,我们聊一聊在实际的项目构建中,这三者的关系,之前已经说过三者可以脱离Android Studio独立使用,但是这种情况在实际开发场景中并不多见,所以本文还是使用Android Studio作为开发工具进行介绍。当我们新建一个Android项目时,会出现类似于下图所示的目录结构:

可以看到一个gradle/wrapper目录,其中有两个文件:gradle-wrapper.jar/gradle-wrapper.properties,gradle-wrapper.jar是Gradle Wrapper的主体功能包。在Android Studio安装过程中产生gradle-wrapper.jar(如果默认安装的话会在C:\Program Files\Android\Android Studio\plugins\android\lib\templates\gradle\wrapper\gradle\wrapper\gradle-wrapper.jar)。然后每次新建项目,会将gradle-wrapper.jar拷贝到你的项目的gradle/wrapper目录中。gradle-wrapper.properties文件主要指定了该项目需要什么版本的Gradle,从哪里下载该版本的Gradle,下载下来放到哪里,如下图所示:

其中GRADLE_USER_HOME一般指~/.gradle,从图示项目中可以知道我要使用gradle-4.1版本,从https://services.gradle.org/distributions/gradle-4.1-all.zip下载,下载到本地的~/.gradle/wrapper/dists目录。那是不是各个项目的Gradle都要通过Gradle Wrapper下载,能不能所有的项目共用一个Gradle?这样理论上是可以的,但是由于Gradle本身不一定保持完全的兼容性,所以新老项目共用一个Gradle有时可能会遇到意想不到的问题。指定对应版本的Gradle,而不通过Gradle Wrapper下载的设置方式是勾选如下图中的Use local gradle distribution,同时指定Gradle home:

Gradle对应版本下载完成之后,Gradle Wrapper的使命基本完成了,Gradle会读取build.gradle文件,该文件中指定了该项目需要的Android Plugin for Gradle版本是什么,从哪里下载该版本的Android Plugin for Gradle。如下图所示:

从图示项目中可以知道我们要使用3.0.1版本,从google和jcenter处下载,那么下载到我们本地的哪里呢?它会下载到~\.gradle\caches\modules-2\files-2.1\com.android.tools.build中。有时候大家网络装填不好,选择下图中的Offline work时可能出现"No cached version of com.android.tools.build:gradle:xxx available for offline mode"问题,此时你只要将对应版本的Android Plugin for Gradle下载到本地的C:\Program Files\Android\Android Studio\gradle\m2repository\com\android\tools\build中即可。

好了,三者的关系从样例项目中理清楚了。如果大家有什么疑问可以给我留言。

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

转载于:https://www.cnblogs.com/jiangxinnju/p/8229129.html

彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系相关推荐

  1. C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

    C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别 C++构造函数用=与()不完全一样,注意使用=时c++中临时变量不能作为非const的引用参数,不论是=运算符重载还是构造函数,否则可能出现以下错 ...

  2. 十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)

    好记性不如烂笔头,相信我,看了之后你会彻底搞懂JSON 前言:前天被JSON对象,JSON字符串,JAVA对象搞混了,不知道各自代表的意思,我就查了资料,总结为一篇博文. 另外我想List<Us ...

  3. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码

    提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...

  4. 40 张图带你搞懂 TCP 和 UDP,android软件开发教程

    速度快,采用 UDP 协议时,只要应用进程将数据传给 UDP,UDP 就会将此数据打包进 UDP 报文段并立刻传递给网络层,然后 TCP 有拥塞控制的功能,它会在发送前判断互联网的拥堵情况,如果互联网 ...

  5. 五分钟搞懂Xen、KVM、Qemu间的关系和区别

    Aha,忽然发现我也是个标题党,十分钟搞定某某技能这种标题最吸引人了.当然我也不是华而不实,是不是干货,你读了才知道.话说,接触Xen这么久了,现在才花时间搞清楚这个问题,要不是需要给别人解释,还不知 ...

  6. 一文搞懂:UART、RS-232、RS-422、RS-485的区别

    通讯问题,和交通问题一样,也有高速.低速.拥堵.中断等等各种情况.如果把串口通讯比做交通,UART比作车站,那么一帧的数据就好比汽车.汽车跑在路上,要遵守交通规则.如果是市内,一般限速30.40,而高 ...

  7. 推荐: 五分钟搞懂Xen、KVM、Qemu间的关系和区别[转载]

    https://blog.csdn.net/ysbj123/article/details/51166343 转载于:https://www.cnblogs.com/wspblog/p/9203061 ...

  8. 一文彻底搞懂MySQL基础:B树和B+树的区别

    写在前面 大家在面试的时候,肯定都会被问到MySql的知识,以下是面试场景: 面试官:对于MySQL,你对他索引原理了解吗? 我:了解 面试官:MySQL的索引是用什么数据机构的? 我:B+树 面试官 ...

  9. 一文搞懂 Docker、Containerd、RunC 间的联系和区别

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 什么是RunC Docker.Google.CoreOS 和其他供应商创建了开放容器计划 (OCI),目前主要有两 ...

最新文章

  1. 给一个ul列表中点击到的li赋予样式
  2. SAP HUM 嵌套HU初探
  3. php多浏览器支持,测试网站在多个浏览器中的兼容性:MultiBrowser ┆V1.3.1 多国语言版...
  4. Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
  5. openpyxl删除添加excel列_Python | 如何使用Python操作Excel(二)
  6. Python print 函数- Python零基础入门教程
  7. Spring Cloud 学习笔记(一) 之服务治理模块Spring Cloud Eureka 搭建注册中心
  8. CSS3 响应式布局实例
  9. 卖一头猪亏500元,“猪茅”也扛不住了?
  10. 用于物联网数据收集和传输的边缘网络密钥
  11. spring揭秘_理解透彻!Spring中BeanFactory与FactoryBean分析
  12. C语言情人节浪漫烟花表白代码
  13. 机械电子计算机哪个更适合创业,二本 电气工程及其自动化,和机械电子工程 哪个专业技术性很强,更好就业,更适合考研。...
  14. SOLIDWORKS教程:solidworks设计绘图的七大实用技巧
  15. java课题研究方法和技术途径_开题报告中的拟采取的研究方法技术路线和技术关键...
  16. 阿里云实时数仓搭建与组件选型
  17. Linux Socket 两个客户端通信,服务端作为中转
  18. 微信开发之微信公众号
  19. 多模态学习(一) 初识
  20. 非正式的沟通往往比正式的沟通更有效,更重要

热门文章

  1. 1043 幸运号码 数位DP
  2. 13.无名管道通讯编程
  3. AngularJs angular.element
  4. RT-thread内核之对象管理系统
  5. [转载]:C# 中结构与类的区别
  6. 解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……
  7. Error:Comments are not permitted in JSON
  8. DeprecationWarning:current URL string parser is deprecated, and will be removed in a future version.
  9. 科比退役时间什么时候
  10. 己所不欲,勿施于人的意思,这句话出自哪里?