给Android初学者的Gradle知识普及
gradle build android 历史
android tools 主页 ,大概是2016年2月份发布 adt21.1 的时候,忽然在主页发现了new build system 原来是可以用gradle 来构建android项目,至于gradle是什么(既然点击进来看了应该都知道了吧。)。然后,又看了一下roadmap 那时候,还并不支持proguard 打包,于是就没看了。
android studio 发布,终于gradle 0.4 也跟着出来了,于是,先把gradle 学了一遍,然后把gradle plugin user guide也认真阅读了一下,根据我的个人体验,如果你对gradle 毫无了解就去看gradle plugin user guide 可能很多地方都一头雾水,但是并不妨碍你用gradle 打包android 应用,只是,出现问题,你就可能很头疼。不过,本文就是让不会gradle 也能用上 gradle 打包android 程序
顺便贴上官方为什么使用gradle 的理由
domain specific language (dsl) to describe and manipulate the build logic
build files are groovy based and allow mixing of declarative elements through the dsl and using code to manipulate the dsl elements to provide custom logic.
built-in dependency management through maven and/or ivy.
very flexible. allows using best practices but doesn't force its own way of doing things.
plugins can expose their own dsl and their own api for build files to use.
good tooling api allowing ide integration
1. 前言
刚学 android 不久,对 gradle 不懂,看了很多资料依然一知半解,我觉得这个主题可能对很多读者也都很有帮助,所以我在整理的笔记的基础上做了点补充与改进,希望这篇文章对你们有帮助!
2. 什么是构建工具?
我们大家都知道 gradle 是一种构建工具,那么什么是构建工具呢?
网上一大堆的文字解释我觉得很难理解,这里我以咱们 android 开发来举个例子吧。
我们以前开发都是用 eclipse ,而 eclipse 大家都知道是一种 ide (集成开发环境),最初是用来做 java 开发的,而 android 是基于 java 语言的,所以最初 google 还是希望 android 能在 eclipse 上进行开发,为了满足这个需求,google 开发了一个叫 adt (android developer tools)的东西,相信以前从 eclipse 时代过来的对 adt 应该都不陌生,正是因为有了 adt ,从此我们只需要码好代码,然后直接在 eclipse 上进行编译、运行、签名、打包等一系列流程,而这背后的工作都是 adt 的功劳。某种意义上 adt 就是我们的构建工具。
而自 google 推出 android studio 以来,就宣布默认使用 gradle 来作为构建工具,并且之后放弃更新 adt ,从此 gradle 走入 android 开发者的视野,而我也是在 as 的 beta 版开始接触并学习 gradle。
一般来说,构建工具除了以上提到的编译、运行、签名、打包等,还具备依赖管理的功能,什么是依赖管理呢?还是拿 eclipse 来说,我们以前在 eclipse 上开发 android ,如果需要用到第三方库的时候一般都是先下载 jar 文件,然后把 jar 文件添加到 libs 目录,然后项目中就可以引用了。但是你不觉得这种管理方式很麻烦么?假设第三方库有更新,需要下载最新的 jar 文件,然后替换掉原来的,引用的库少还好,一旦引用的第三方库多,那简直麻烦死,可以说这种方式只有依赖,而没有管理。
现在大家不陌生的 gradle 引用第三方库方式是这样的:compile 'com.android.support:support-v4:24.0.1'
类似这样的依赖方式,是不是很方便?而且很直观,直接可以看到源地址,升级的话直接改下版本号就可以了,这就是所谓的依赖管理。
所以构建工具就是对你的项目进行编译、运行、签名、打包、依赖管理等一系列功能的合集,传统的构建工具有 make、ant、maven、ivy等,而 gradle 是新一代的自动化构建工具。
3. 什么是 gradle ?
上面说了,gradle 是新一代的自动化构建工具,它是一个独立的项目,跟 as、android 无关,官方网站: , 类似 ant、maven这类构建工具都是基于 xml 来进行描述的,很臃肿,而 gradle 采用的是一种叫做 groovy 的语言,语法跟 java 语法很像,但是是一种动态语言,而且在 java 基础上做了不少改进,用起来更加简洁、灵活,而且 gradle 完全兼容 maven、ivy,这点基本上宣布了 maven、ivy 可以被抛弃了,gradle 的推出主要以 java 应用为主,当然目前还支持 android、c、c++。
4. gradle 与 android studio 的关系
上面也提到,gradle 跟 android studio 其实没有关系,但是 gradle 官方还是很看重 android 开发的,google 在推出 as 的时候选中了 gradle 作为构建工具,为了支持 gradle 能在 as 上使用,google 做了个 as 的插件叫 android gradle plugin ,所以我们能在 as 上使用 gradle 完全是因为这个插件的原因。在项目的根目录有个 build.gradle 文件,里面有这么一句代码:classpath 'com.android.tools.build:gradle:2.1.2'
这个就是依赖 gradle 插件的代码,后面的版本号代表的是 android gradle plugin 的版本,而不是 gradle 的版本,这个是 google 定的,跟 gradle 官方没关系。关于 android gradle plugin 的更多信息可以到这里查看,这里列举了 android gradle plugin 每个版本的具体变化与具体功能:
友情提示,需要*!
5. gradle wrapper
现在默认新建一个项目,然后点击 as 上的运行,默认就会直接帮你安装 gradle ,我们不需要额外的安装 gradle 了,但是其实这个 gradle 不是真正的 gradle ,他叫 gradle wrapper ,意为 gradle 的包装,什么意思呢?假设我们本地有多个项目,一个是比较老的项目,还用着 gradle 1.0 的版本,一个是比较新的项目用了 gradle 2.0 的版本,但是你两个项目肯定都想要同时运行的,如果你只装了 gradle 1.0 的话那肯定不行,所以为了解决这个问题,google 推出了 gradle wrapper 的概念,就是他在你每个项目都配置了一个指定版本的 gradle ,你可以理解为每个 android 项目本地都有一个小型的 gradle ,通过这个每个项目你可以支持用不同的 gradle 版本来构建项目。
理解了 gradle wrapper 的概念就好办了,以下的所有操作都是基于 gradle wrapper 的。
默认我们在 as 上第一次创建项目会自动下载 gradle 的,这个过程很漫长,出奇的慢,但是第一次之后就ok了,接下来就是教大家用命令行测试下,请大家在终端或者 as 带的终端上切换到所在项目的目录,然后输入 ./gradlew -v (win用户直接输入 gradlew -v) ,即可以查看当前项目所用的 gradle 的版本,gradlew 即为 gradle wrapper 的缩写,如果你是第一次执行命令行,那么会出现一个下载的提示,紧接着会打印一个个的点,这个过程很漫长,依赖你的网速,时间几分钟到几十分钟不等。
有人有疑问,我 as 上明明已经可以正常运行该项目的,说明 gradle 已经下载过了,为什么命令行还要再下载一次?我也一直有这个疑问,理论上是不该再下载的,但是事实他就是要重新下载一次,我猜测可能是bug吧。
如果下载完成输入 ./gradlew -v 出现如下结果,证明你的项目是ok的,否则就是你的项目配置有问题了。
6. android 项目包含的 gradle 配置文件
这里姑且以我很早在 github 开源的 9gag 项目为例,来稍微介绍下一个完整的 android 项目包含的基本 gradle 相关的配置文件:
咱们来一步步分析:
9gag/app/build.gradle
这个文件是 app 文件夹下这个 module 的 gradle 配置文件,也可以算是整个项目最主要的 gradle 配置文件,具体里面的配置以后再介绍。
9gag/extras/shimmerandroid/build.gradle
每一个 module 都需要有一个 gradle 配置文件,语法都是一样,唯一不同的是开头声明的是apply plugin: ‘com.android.library'
9gag/gradle
这个目录下有个 wrapper 文件夹,里面可以看到有两个文件,我们主要看下 gradle-wrapper.properties 这个文件的内容:
可以看到里面声明了 gradle 的目录与下载路径以及当前项目使用的 gradle 版本,这些默认的路径我们一般不会更改的,这个文件里指明的 gradle 版本不对也是很多导包不成功的原因之一。
9gag/build.gradle
这个文件是整个项目的 gradle 基础配置文件,默认的内容就是声明了 android gradle plugin 的版本。
9gag/settings.gradle
这个文件是全局的项目配置文件,里面主要声明一些需要加入 gradle 的 module,我们来看看 9gag 该文件的内容:
7. 如何正确导入下载的开源项目?
我们经常会在 github 发现一些优秀的开源项目,然后想要下载学习,然而第一步一般都是把源码导入到 as 里,然后运行起来看下效果,但是经常会运行失败,这里我来给大家说下导入开源项目的正确姿势:
下载一个demo,先打开每个 module下的 gradle 文件,即 app 目录下的 build.gradle 以及各个 library 下的 build.gradle ,首先查看 compilesdkversion 和 buildtoolsversion,因为有些时候你本地的版本和下载的版本不一致,那么就会导致失败。
然后就是检查 gradle-wrapper ,google 有些时候要求不同的 as 支持不同的 gradle 版本。比如 as 1.0 的时候要求必须使用 gradle 1.x 的版本,等到 as 2.0 的时候,google 不支持 gradle1.x 的版本,这个时候你必须手动更新下 android gradle plugin 的版本,然后重新同步下。
检查以上两个地方基本就可以导入并运行了,如果还有其他问题,那可能就是环境或者项目本身的问题了。
8. 认识下几个命令
上面提到了,假设我们没有 ide ,只有类似 sublime、atom、vim这种轻量编辑器怎么办?那我们就没法开发 android 了么?然而只要有构建工具,不需要 ide 我们一样有办法开发,这个时候我们就需要用到几个有用的 gradle 命令了:
./gradlew -v 版本号
./gradlew clean 清除9gag/app目录下的build文件夹
./gradlew build 检查依赖并编译打包
这里注意的是 ./gradlew build 命令把 debug、release 环境的包都打出来,如果正式发布只需要打 release 的包,该怎么办呢,下面介绍一个很有用的命令 assemble , 如
./gradlew assembledebug 编译并打debug包
./gradlew assemblerelease 编译并打release的包
值得注意的是,以上所有命令都是在终端里执行,并且必须要切换到所在项目的根目录下执行,win系统直接执行 gradlew 。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接