【Gradle系列】Gradle之 Project详解(三)

·  阅读 675
【Gradle系列】Gradle之 Project详解(三)

引言

上一节,了解了project拓展属性的两种方式(gradle文件中ext结合闭包 / gradle.properties文件中定义),具体戳这里>>>

这节,我们将学习projec下《更加方便的文件操作API》 和 《其他API》

虽然我们在groovy语言学习过程中了解了有文件操作(具体戳这里>>>),但是这次文件的重点是学习更加方便的操作

更加方便的文件操作API

简要分类

project中对文件的操作,分类大致如下:

(1)路径获取相关API,如:获取当前工程路径,根工程路径等

(2)文件操作相关API

(2.1)定位
(2.2)拷贝
(2.3)遍历
复制代码

路径获取相关API

(1)当前根工程的目录

println "当前根工程的目录 : " + getRootDir().getAbsoluteFile()
复制代码

(2)当前工程,build目录

println "当前工程build : " + getBuildDir().getAbsoluteFile()
复制代码

(3)当前工程,路径目录

println "当前工程的路径 : " + getProjectDir().getAbsoluteFile()
复制代码

文件操作相关API

这里讲的文件操作(定位/拷贝/遍历等),都是是相对于当前工程的定位,不是相对于操作系统的目录;

如果需要跨工程等,那么还需要用到上次讲groovy的时候的file操作(具体戳这里>>

(1)定位

实现打印当前工程的gradle:

//文件位置定位
def fileTxt(String p) {
    try {
        def file = file(p)
        return file.text
    } catch (GradleException e) {
        println "fileTxt : file is not exit..."
    }
    return null
}

println "文件定位,使用当前工程的目录的build.gradle内容 : " + fileTxt('build.gradle')
复制代码

(2)拷贝

当下工程的文件,拷贝到根工程

copy {
    //文件夹拷贝
    from file('build/outputs/apk')
    into getRootProject().getBuildDir()
}
复制代码

(3)遍历

打印apk目录文件名称

fileTree('build/outputs/apk') { FileTree fileTree ->
    fileTree.visit { FileVisitDetails details ->
        println "fileTree 遍历文件名:" + details.name
    }
}
复制代码

其他API

工程依赖

主要分两类:

(1)gradle本身对第三方的依赖

(2)应用程序(如:app/lib等)的依赖

gradle本身对第三方的依赖

(1) 写法1

buildscript { ScriptHandler scriptHandler ->
    scriptHandler.dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}
复制代码

(2)写法2

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}
复制代码

应用程序(如:app/lib等)的依赖

(1) 本地依赖:

 implementation fileTree(dir: 'libs', include: ['*.jar'])
复制代码

(2) 远程依赖:

implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
复制代码

(3) 依赖关键字

依赖关键字有:compileOnly,implementation等,细节见下表

1.png

可以看到AS不同版本对应了不同的gradle版本,对依赖关键字也做了调整,下面我们大概讲 下日常比较常用关键字情况

(3.1)implementation 和 compile 区别

implementation 其特点是:不可以传递,可以加快编译速度(减少不必要的重复编译过程)

implementation 和 compile 区别:

2.png

(3.2)compile 和 api 共性

依赖方式会传递所依赖的库,理解可以看下面:

3.png

(3.3)provided 和 compileOnly 共性

只在编译时有效,不会参与打包(可以减少输出文件的大小)

使用场景1:

某个库只是编译的时候生产aar等,不需要打入到app里面
复制代码

使用场景2:

aap模块已经依赖了okhttp,然后app依赖的库也用到了okhttp,可以用占位方式编译;
复制代码

外部命令

如果需要操作系统级的命令(如跨工程/和本地系统目录交互等),就需要 project为我们提供的外部命令

定义:

task(name: 'daviCopy') {
    println "daviCopy"

    doLast {
        println "==doLast=="
        //doLast 为 Gradle 的执行阶段

        def sourceF = this.buildDir.path + '/outputs/apk'
        def desF = '/Users/yabber/Desktop/1111'//自己本地的目录
        def cmd = "mv -f ${sourceF} ${desF}"
        //命令基础模版
        exec { ExecSpec execSpec ->
            try {
                //脚本类型
                execSpec.setExecutable('bash')
                //命令执行
                execSpec.args('-c', cmd)
            } catch (Exception e) {
                e.printStackTrace()
            }
        }
    }
}
复制代码

调用(linux/mac环境):

./gradlew daviCopy
复制代码

结尾

哈哈,该篇就写到这里(一起体系化学习,一起成长)

Tips

更多精彩内容,请关注 ”Android热修技术“ 微信公众号

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改