gradle如果在非AndroID环境需要额外配置。
如果配置了brew ,可以直接用命令行安装。十分简便
brew install gradle
完成后用gradle -v查看是否安装成功
gradle -v
如果没有配置的话可以看一下brew的配置https://zhuanlan.zhihu.com/p/111014448
或者按照网上教程进行gradle配置就不多说了。
2、初用gradle先来简单模仿写一段hello world
创建一个名叫build.gradle的文件,如下所示
task hello{ dolast{ println'Hello World!' }}
终端跳转到文件所在的目录,输入
gradle -q hello
可以看到输出,完成了我们的第一行代码hello world。
Hello World!
现在来分析上述的代码。
首先我们创建了一个build.gradle的文件。默认情况下gradle的文件都是build.gradle
第一行task hello定义了一个名叫“hello”的task。在这个task中打印了hello world。
命令行中输入 gradle -q hello 代表执行hello这个任务。-q代表控制gradle的日志级别,用于过滤日志。
假如直接输入
gradle hello
将会输出
> Task :helloHello World!BUILD SUCCESSFul in 820ms1 actionable task: 1 executed
任务和项目在gradle中,每个build.gradle都代表一个项目,如AndroID中每一个module都是一个项目。一个项目中有多个Task。而每个Task中又有多个action。这个action类似于java的方法。上面的hello是任务,dolast是action
生命周期一个gradle的构建通常有三个阶段
初始化:项目实例在这个阶段创建。
配置:构建脚本会在这个阶段创建,会为每个项目创建构建和配置任务。
执行:gradle在这个阶段将决定哪个任务会被执行。
3、Gradle Wrapper是对gradle的包装,用于团队开发过程中避免大家gradle版本不统一而导致的问题。可以通过gradle wrapper统一gradle的版本。我们在开发过程中,通常都是使用的gradle wrapper,而不是自己去官网下载对应gradle版本的zip,然后配置到本地。
当使用wrapper时,会检查对应gradle有没有被下载,如果没有回自动去下载并构建环节。因此不需要开发人员自己手动去配置。
(1)生成wrapper在项目的根目录输入gradle wrapper,会生成几个文件。
gradle/wrapper文件夹下面包含gradle-wrapper.jar gradle-wrapper.propertIEs两个文件。
gradle-wrapper.propertIEs是用来配置gradle的属性,使用的是哪个版本的gradle。jar包是用来具体 *** 作的。
gradlew和gradlew.bat分别是linux和window下的可执行脚本。
(2)wrapper配置当使用gradle wrapper生成相关文件的时候,可以指定一些参数来控制wrapper的属性,比如gradle的版本等。
如使用
gradle -wrapper --gradle-version 2.4
生成的gradle wrapper就使用的是2.4版本的gradle。它会影响gradle-wrapper.propertIEs中distributionUrl的值,这个值是用来下载gradle的url。
(3)gradle-wrapper.propertIEs这个是gradle wrapper的配置文件。打开文件可以看到,它里面包含了以下属性。
distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists
属性名 | 含义 | @H_403_239@
---|---|
distributionBase | 下载的gradle解压后存储的主目录 | @H_403_239@
distributionPath | 相对于distributionBase的相对路径 | @H_403_239@
zipStoreBase | 同distributionBase,只是存储的压缩包 | @H_403_239@
zipStorePath | 同distributionPath,只是存储的压缩包 | @H_403_239@
distributionUrl | 下载地址 | @H_403_239@
回忆一下之前我们是如何生成wrapper,在命令行输入以下命令
gradle wrapper
这个输入和我们之前gradle hello执行task一样。所以我们可以猜测wrapper也是一个task的名字,用来生成wrapper的文件。
在build.gradle增加如下的task
task wrapper(type:Wrapper){ gradLeversion = '2.4'}
除了gradLeversion以外,还可以配置上面的属性。
task wrapper(type:Wrapper){ gradLeversion = '2.4' distributionBase = 'GRADLE_USER_HOME' distributionPath = 'wrapper/dists' distributionUrl = 'https\://services.gradle.org/distributions/gradle-2.4-all.zip' zipStoreBase = 'GRADLE_USER_HOME' zipStorePath = 'wrapper/dists'}
4、gradle日志(1)gradle的日志和AndroID日志系统类似,也按照一定的等级分类,用于过滤自己想要的日志。
前面我们gradle -q就是用来过滤q以上的代码。
日志级别如表所示
级别 | 用于 | @H_403_239@
---|---|
ERROR | 错误消息 | @H_403_239@
QUIET | 重要消息 | @H_403_239@
WARNING | 警告消息 | @H_403_239@
liFECYCLE | 进度消息 | @H_403_239@
INFO | 信息消息 | @H_403_239@
DEBUG | 调试信息 | @H_403_239@
默认是输出liFECYCLE以上的消息
(2)输出错误堆栈信息gradle还支持类似编译器输出异常堆栈 默认情况下堆栈输出是关闭的。可以通过-s或者-S。
-s:输出关键性堆栈信息
-S:输出全部堆栈信息
(3)自定义日志输出通常情况下,我们可以print系列的方法输出,它的日志级别是QUIET
除了print系统方法以外,还可以使用logger做更灵活的日志输出。
logger.quIEt() logger.error() logger.warn()
5、gradle命令(1)获取帮助./gradlew -?./gradlew -h./gradlew -help
(2)查看所有可执行的Task./gradlew tasks
gradle会以分组的方式列出Task列表。
(3)强制刷新依赖刷新缓存
./gradlew --refresh-dependencIEs assemble
(4)多任务调用用空格隔开
(5)通过任务名字缩写执行如果名字过长,为此通过驼峰的缩写调用
connectCheck 使用时可以用 cc代替
./gradlew cc
6、groovy(1)字符串双引号和单引号都可以表示字符串,区别在与单引号代表纯粹的字符串常量,而双引号可以做运算。
task hello{ dolast{ def name = '张三' println '${name}' println "${name}" }}
输出
${name}张三
可见单引号内的表达式都是字符串常量,而双引号可以做计算。
此外双引号内的表达式格式为${表达式},只有一个变量时可以省略花括号
(2)集合groovy也提供了类似java中集合的功能
List
task hello { dolast{ def List = [1,2,3,4,5,6] println List[0]//访问第一个元素 println List[-1]//访问最后一个元素 println List[0..3]//访问第1到第4个元素 }}
此外还提供了each的遍历
List.each{ println it}
Map
task hello { dolast{ def map = ['wIDth':1024,'height':768] println map.wIDth//有两种打印的方式 println map['height'] map.each{ println "Key:$it.key,Value:$it.value" } }}
注意map的key只能是字符串
7、方法(1)括号可以省略groovy中方法的调用可以省去括号
比如fun(“1”,“2”)可以直接写成fun"1",“2”
(2)return可以不写如果没有return 默认将最后一行代码作为返回值。
(3)代码块是可以作为参数传递例如 刚刚的each方法实际上就是代码块作为参数传入
map.each{ println "Key:$it.key,Value:$it.value"}map.each{(println "Key:$it.key,Value:$it.value")}
(4)省略get、set方法在类中可以省略getset方法,而直接调用private属性
task hello { Person p = new Person() p.name='张三' println "name = $p.name" println "age = $p.age"}class Person{ private name public int getAge(){ 12 }}
此外还可以不定义一个成员变量,而直接通过设置getset方法而调用。如上面的age
8、闭包(1)闭包的定义闭包其实一段代码块
task hello { customEach{ println it }}def customEach(closure){ for(int i in 1..10){ closure(i) }}
这里我们定义了一个方法 参数是一个闭包代码块。使用这个闭包就是后面加括号。这里也就是相当于
def customEach(closure){ for(int i in 1..10){ println i }}
(2)闭包参数如果闭包只有一个参数,那么默认就是it,换句话说也就是i=it
当有多个参数时,需要把参数一一列出,如
task hello { customEach{k,v-> println "key=$k,value=$v" }}def customEach(closure){ def map=["name":"张三","age":18] map.each{ closure(it.key,it.value) }}
(3)闭包委托Closure有三个属性 thisObject、owner、delegate。
thisObject相当于java中的this,指向闭包定义所在的类。
owner 指向闭包定义所在的类或者闭包
delegate,默认情况下等于owner。可以修改指向。
总结以上是内存溢出为你收集整理的Android gradle学习(一)全部内容,希望文章能够帮你解决Android gradle学习(一)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)