背景
今天工作中遇到了一个问题,我想统计一下项目中的所有相同文件名的图片的总大小,本想着手动计算,但是看了看庞大的图片数量,我放弃了,于是开始了人生中的第一个实用脚本的编写.
使用方法
- 将下边源码复制到根路径下的build.gradle中
task calculateSize() {
// 替换成要统计大小的图片名称
def name = "图片名字"
def fileSize = 0
def dir = rootDir.path
println "------start calculate-----"
println "dir:" + dir
fileTree(dir) {
include "**/" + name + ".*"
exclude "**/build/**"
}.each {
file ->
println file.path + " size is " + file.size()
fileSize += file.size()
}
if (fileSize > 1024) {
println fileSize / 1024 + "KB"
} else {
println fileSize + "B"
}
println "------end calculate-----"
}
- 重新刷新gradle文件,即Sync Now即可
怎么样 是不是很简单,既然是工具,当然要越简单越好
实现思路
此脚本看成品还是比较简单,但是对于不熟悉gradle脚本的同学从无到有实现还是需要不少的功课的(比如我)
闲言少叙,我们直接看源码,将所有不懂的地方全部讲解出来就可以了
// 解析1
task calculateSize() {
// 替换成要统计大小的图片名称
def name = "icon_name"
def fileSize = 0
// 解析2
def dir = rootDir.path
println "------start calculate-----"
println "dir:" + dir
// 解析3
fileTree(dir) {
// 解析4
include "**/" + name + ".*"
exclude "**/build/**"
}.each {
// 解析5
file ->
println file.path + " size is " + file.size()
fileSize += file.size()
}
if (fileSize > 1024) {
println fileSize / 1024 + "KB"
} else {
println fileSize + "B"
}
println "------end calculate-----"
}
解析1
这个大家应该都熟悉,我们Android中的gradle很多编译相关的都是通过task完成
解析2
dir就是我们要扫描文件的目录
- 此处通过rootDir.path获取到的是项目的根路径
- 其实我们这里还可以通过字符串传入固定路径或者获取制定的子模块路径也可以,说白了就是要扫描我们定义的路径下的所有文件然后通过比对找出符合条件的文件
解析3
- fileTree是gradle中的一个语法,表示文件的树状结构
- 后边的参数是我们要构成fileTree的根路径,后面可以写一个闭包(即{}中的内容)
- 我们可以调用fileTree.each{}来遍历我们fileTree中的所有文件,如果我们在each之前添加了筛选闭包,此处会通过筛选条件过滤掉不符合的file,即此处是所有符合我们预期的文件
解析4
此处为fileTree的筛选闭包
- 源码中的筛选条件是找出除了build目录下的所有 */icon_name.*的文件
- 如drawable/icon_name.png,mipmap/icon_name.webp都是符合筛选条件的文件
- 我们可以通过 include 筛选符合条件的文件
- 我们也可以通过 exclude 剔除不符合条件的文件
当然,上方的筛选条件都是非必选的,我们根据需要实现即可
- 筛选条件支持正则表达式
解析5
此处为fileTree中所有符合筛选条件的文件的遍历
- file表示当前文件
- 可以通过file.path获取到文件的全路径
- 可以通过file.size()获取到文件的大小,单位为B
总结
当前脚本还是雏形,我们还可以通过此脚本来排查项目中的所有重复资源,不仅仅是名字相同,可以通过MD5来检测两个完全不同名字的图片到底是不是相同的图片;