效果图
背景
统计安卓项目中的所有图片资源数量.
使用方法
注! 只适用于本地使用,千万不要上传到git上,因为写在了build.gradle中会对编译时间有影响
- 将下边源码复制到跟路径下的build.gradle中
task calculateNum() {
def dir = rootDir.path
println "------start calculate 计算图片数量-----"
println "dir:" + dir
// Set<String> set = new HashSet();
List<String> set = new ArrayList<>();
fileTree(dir) {
include "**/**.png"
exclude "**/build/**"
}.each {
file ->
set.add(file.name)
}
println "nums:" + set.size()
println "------end calculate-----"
}
- 重新刷新gradle文件,即Sync Now即可
实现思路
本脚本实现思路较为简单,通过遍历项目中的所有png图片获取到所有图片,然后存储到集合中,统计集合的大小就可以统计出图片的数量,本脚本中通过list和set的切换实现对图片统计的不同诉求,如果只需要统计一共有多少种图片(即同名资源放在x,xx,xxx等文件下都算做是同一资源),使用set,如果需要统计全部的图片个数就直接使用list存储即可
// 解析1
task calculateNum() {
// 解析2
def dir = rootDir.path
println "------start calculate 计算图片数量-----"
println "dir:" + dir
// 解析3
// Set<String> set = new HashSet();
List<String> set = new ArrayList<>();
// 解析4
fileTree(dir) {
include "**/**.png"
exclude "**/build/**"
}.each {
// 解析6
file ->
set.add(file.name)
}
println "nums:" + set.size()
println "------end calculate-----"
}
解析1
这个大家应该都熟悉,我们Android中的gradle很多编译相关的都是通过task完成
解析2
dir就是我们要扫描文件的目录
- 此处通过rootDir.path获取到的是项目的根路径
- 其实我们这里还可以通过字符串传入固定路径或者获取制定的子模块路径也可以,说白了就是要扫描我们定义的路径下的所有文件然后通过比对找出符合条件的文件
解析3
- 通过使用set排除重复图片(即图片分别放在x,xx,xxx等目录下)
- 通过使用list统计所有项目中的图片,不排除同名在不同分辨率下的图片
解析4
- 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.name表示不包含父目录的全名
- 可以通过file.path获取到文件的全路径
- 可以通过file.size()获取到文件的大小,单位为B
如当前的file存储全路径为./a/b/c/d.png
file.name为 d.png
file.path为./a/b/c/d.png