上一节,了解了project拓展属性的两种方式(gradle文件中ext结合闭包 / gradle.properties文件中定义),具体戳这里>>>linux
这节,咱们将学习projec下《更加方便的文件操做API》 和 《其余API》android
虽然咱们在groovy语言学习过程当中了解了有文件操做(具体戳这里>>>),可是此次文件的重点是学习更加方便的操做api
project中对文件的操做,分类大体以下:bash
(1)路径获取相关API,如:获取当前工程路径,根工程路径等markdown
(2)文件操做相关API闭包
(2.1)定位
(2.2)拷贝
(2.3)遍历
复制代码
(1)当前根工程的目录app
println "当前根工程的目录 : " + getRootDir().getAbsoluteFile()
复制代码
(2)当前工程,build目录ide
println "当前工程build : " + getBuildDir().getAbsoluteFile()
复制代码
(3)当前工程,路径目录post
println "当前工程的路径 : " + getProjectDir().getAbsoluteFile()
复制代码
这里讲的文件操做(定位/拷贝/遍历等),都是是相对于当前工程的定位,不是相对于操做系统的目录;学习
若是须要跨工程等,那么还须要用到上次讲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
}
}
复制代码
主要分两类:
(1)gradle自己对第三方的依赖
(2)应用程序(如:app/lib等)的依赖
(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'
}
}
复制代码
(1) 本地依赖:
implementation fileTree(dir: 'libs', include: ['*.jar'])
复制代码
(2) 远程依赖:
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
复制代码
(3) 依赖关键字
依赖关键字有:compileOnly,implementation等,细节见下表
能够看到AS不一样版本对应了不一样的gradle版本,对依赖关键字也作了调整,下面咱们大概讲 下平常比较经常使用关键字状况
(3.1)implementation 和 compile 区别
implementation 其特色是:不能够传递,能够加快编译速度(减小没必要要的重复编译过程)
implementation 和 compile 区别:
(3.2)compile 和 api 共性
依赖方式会传递所依赖的库,理解能够看下面:
(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
复制代码
哈哈,该篇就写到这里(一块儿体系化学习,一块儿成长)