Gradle入门知识之Gradle api解析(下)

电子说

1.2w人已加入

描述

3.文件

Gradle中的文件操作和java中的文件操作是可以互相混用的。也就是说

在Gradle中可以直接使用java中的文件操作。

下面介绍几种Gradle中文件使用方式:

1.文件创建以及获取方式

方式1:file

def file1 = file('release.xml')
def file2 = file('release.xml',PathValidation.FILE)

file2使用的第二个参数是校验文件使用:

有以下几个校验方式:

public enum PathValidation {
    NONE(), EXISTS(), FILE(), DIRECTORY()
}

默认使用的是NONE

EXISTS(), FILE(), DIRECTORY():表示如果不满足当前条件会报对应的异常

  • EXISTS:文件是否存在
  • FILE:是否是文件
  • DIRECTORY:是否是文件夹

方式2:files

ConfigurableFileCollection files(Object... paths);
//获取一个文件集合,返回类型ConfigurableFileCollection
def _files = files('release.xml','release2.xml')

方式3:fileTree

获取一个文件夹下面的所有的文件

def files = fileTree(dir: 'libs',includes: ['*.jar']){
    excludes = ['a*.jar','b*.jar']
    builtBy = ['task1','task2']
}

也可以使用fileTree来对文件进行遍历

方式4:zipTree

FileTree zipTree(Object zipPath);

获取zip文件下面的所有文件

2.文件路径设置及获取

getRootDir:获取根路径

setBuildDir:设置编译路径

getBuildDir:获取编译路径

getProjectDir:获取当前Project的路径

3.文件拷贝

copy {
    from file('release.xml')
    into getRootProject().getBuildDir().path+'/test/'
}

4.文件遍历

普通文件夹遍历

fileTree('build/outputs/apk/'){ FileTree fileTree ->
    fileTree.visit { FileTreeElement element ->
        copy {
            from element.file
            into getRootProject().getBuildDir().path+'/test/'
        }
    }
}

zip/tar压缩文件遍历

FileTree ziptr = zipTree('release1.zip')
FileTree ziptr = tarTree('release1.zip')

然后用FileTreevisit方法进行遍历

5.文件写入和读出

使用java文件的InputStreamOutputStream就可以了,这个大家都很熟悉了

文件Api就讲到这里,下面来看下属性api这块

4.属性Api

属性分类:

  • 1.在gradle.properties中设置的全局属性
org.gradle.jvmargs =-Dfile.encoding=UTF-8
android.useAndroidX=true
android.enableJetifier=true
isLoadTest=true
GRADLE_USER_HOME = '../../user'

这里面包括系统属性和开发者自定义的属性,工程全局都可以访问

其他地方使用访问方式:

  • 2.在rootProject中设置的root项目属性:一般用于统一全局版本信息使用
ext {
    mCompileSdk = 31
    versionName = '1.0.2'
    versionCode = 2
    versionInfo = 'App的第2个版本,更新了一些基础核心功能'
}

注意: 其他地方需要使用:则最好加上rootProject.ext.xxProperty

  • 3.当前Project中的属性:

包括自定义的属性或者Project自带的属性:

如:

this.project.gradle:当前Gradle
this.project.tasks:当前工程的TaskContainer
this.project.task1:获取当前Project中的task1任务
  • 4.当前Project定义的ext属性

    一般用于当前Project使用的ext属性

  • 5.Extension 扩展属性

Extension 扩展是插件为外部构建脚本提供的配置项,用于支持外部自定义插件,我们项目中给的android{}

其实就是Android Gradle Plugin给我们提供的Extension 扩展,插件内部可以获取这个扩展属性,然后执行对应流程

ReleaseInfo {
    versionCode = 1
    versionName = '1.0.0'
    versionInfo = "12345566版本发布"
    fileName = "releaseinfo.xml"
}

这里的ReleaseInfo是笔者自定义插件中的一个Extension扩展,插件中的Task可以使用这个Extension获取到用户提供的属性。

属性访问方式:

hasProperty('key'):是否包含该属性

findProperty('key');找属性,没有找到返回null

property('key'):找属性,没有找到返回

MissingPropertyException异常

getProperties():获取当前Project的所有属性

setProperty('key','value');设置属性

一般我们访问属性:直接使用key访问

如:

定义:GRADLE_USER_HOME = '../../user' =>等价:project.setProperty('GRADLE_USER_HOME','../../user')
访问:GRADLE_USER_HOME  =>等价于:project.getProperty('GRADLE_USER_HOME')
定义:project.name = 'pp1' =>等价:project.setProperty('name','pp1')
访问:name =>等价于:project.getProperty('name')

关于自定义插件这块内容,后面会单独出一期文章

总结:

今天这篇文章主要是对Gradle中我们比较常用给的一些api进行了讲解。

主要包括Project相关apiTask相关api文件相关api属性相关api等,其实还有一些其他的比如外部命令的api,这些很少会用到,就不再讲解了.

可以结合这篇文章,自己再去看源码和相关官网文档,会让自己对api的认识更加深刻。

后面会持续推出Gradle的一些高级语法,如自定义插件优秀开源框架插件的解读以及AGP的解析

好了,本文就讲解到这里了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分