接到需求是,复制一个apk到build文件夹的assets文件夹下,我们都知道当我们点击clean的时候,build文件夹就会被清理,而且build文件夹下的assets文件夹并不存在,这个里面会根据application和library不同assets文件夹也会不同,具体看如下分析
application下,build文件夹的assets文件夹名称叫做 merged_assets
library下,build文件夹的assets文件夹名称叫做library_assets
全路径是在build/intermediates下的merged_assets或library_assets
好了,接下来我们需要想,怎么样才能在创建build文件夹之后再执行任务来做复制呢?
根据这篇文章即可
这里我贴出两种写法,第一种是在application下
// application,注意,要放到你的app下的build.gradle文件里面的android{}下
android.applicationVariants.all { variant ->
variant.outputs.each { variantOutput ->
println("applicationVariants.name=----------------${variant.name}")
println("applicationVariants.description=----------------${variant.description}")
println("applicationVariants.mergeAssets=----------------${variant.mergeAssets}")
println("applicationVariants.name----------------${variant.mergeAssets.name}")
variant.mergeAssets.doLast {
println("applicationVariants doLast")
def fromFile = rootProject.file("plugindemo1").path + "\\src\\main\\assets\\plugindemo1-debug.apk"
println("applicationVariants fromFile = " + fromFile)
def intoFile = rootProject.file("app").path + "\\build\\intermediates\\merged_assets\\debug\\out\\"
println("applicationVariants targetFile = " + intoFile)
def targetFile = new File(intoFile)
if(!targetFile.exists()) {
targetFile.mkdirs()
}
copy {
from fromFile
into intoFile
rename("plugindemo1-debug.apk","plugin.apk")
println("applicationVariants copy success")
}
}
}
}
第二种写到library下就是
// 也是放到你的library下的build.gradle下的android{}里面
android.libraryVariants.all { variant ->
variant.outputs.each { variantOutput ->
def tag = "DL applicationVariants"
println("${tag}.name=----------------${variant.name}")
println("${tag}.description=----------------${variant.description}")
println("${tag}.mergeAssets=----------------${variant.mergeAssets}")
println("${tag}.name----------------${variant.mergeAssets.name}")
variant.mergeAssets.doLast {
println("applicationVariants doLast ${rootProject.path}")
def fromFile = rootProject.file("plugindemo1").path + "\\src\\main\\assets\\plugindemo1-debug.apk"
println("${tag} fromFile = " + fromFile)
def intoFile = rootProject.file("DL").path + "\\build\\intermediates\\library_assets\\debug\\out\\"
println("${tag} targetFile = " + intoFile)
def targetFile = new File(intoFile)
if(!targetFile.exists()) {
targetFile.mkdirs()
}
copy {
from fromFile
into intoFile
rename("plugindemo1-debug.apk","plugin.apk")
println("${tag} copy success")
}
}
}
}
// gradle执行linux命令
task('deletejustDir') {
doLast {
def path = this.rootProject.projectDir.path + '/justDir'
def command = "rm -r ${path}"
println("command:" + command)
exec {
try {
executable 'bash'
args '-c', command
println("the command is execute success")
} catch (GradleException e) {
println("the command is execute failed")
}
}
}
}
参考文档
复制文件
task调用另外一个task
使用tasks.xxxxxxxx.execute()即可
gradle复制图片
gradle基础