背景
进行包体积优化手动对比图片工作量大,切耗时长,可以通过资源的md5值进行区分,统计处冗余资源.
使用方法
注! 只适用于本地使用,千万不要上传到git上,因为写在了build.gradle中会对编译时间有影响
- 将下边源码复制到跟路径下的build.gradle中
task calculateMd5() {
def dirPath = rootDir.path
def HEX_DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' ] as char[];
println "------start calculate 根据md5检测冗余图片-----"
println "dir:" + dirPath
// 解析1
Map<String, String> map = new HashMap<>();
fileTree(dirPath) {
include "**/**.png"
exclude "**/build/**"
}.each {
file ->
// 解析2
InputStream is = new FileInputStream(file)
MessageDigest md = MessageDigest.getInstance("MD5")
byte[] buffer = new byte[1024]
int numRead = -1
while((numRead=is.read(buffer)) > 0) {
md.update(buffer,0,numRead);
}
is.close()
// 解析3
StringBuilder sb = new StringBuilder(md.digest().length * 2);
for (int i = 0; i < buffer.length; i++) {
sb.append(HEX_DIGITS[(buffer[i] & 0xf0) >>> 4]);
sb.append(HEX_DIGITS[buffer[i] & 0x0f]);
}
def key = sb.toString()
if(map.get(key) == null) {
map.put(key, "")
}
// 解析4
map.put(key, map.get(key) + file.name+ "\n ")
}
// println "nums:" + set.size()
// 解析5
new File("./md5.txt").withWriter("UTF-8") { writer ->
def iterator = map.entrySet().iterator()
while (iterator.hasNext()) {
def cur = iterator.next()
writer.write(cur.key.substring(0, 32) + ": " + cur.value+ "\n ")
}
}
println "------end calculate-----"
}
- 重新刷新gradle文件,即Sync Now即可
实现思路
实现思路就是首先获取资源的md5值,然后通过hashmap进行分类,找出md5一样(即冗余)的资源记录,最后将按照md5分类的数据输出到文档中
解析1
该HashMap,key为md5值,value为当前资源的名字,用于分类相同资源
解析2
逐个资源转换成输入流,通过MessageDigest转换成Md5 buffer流
解析3
buffer 逐个字节转换成16进制字符串
解析4
将解析3中转换的16进制字符串和当前资源名称一起存储到map中,借助hashmap特性,将所有md5值相同的资源存储到同一个字符串中
解析5
遍历map,并截取32位md5值,将md5和资源名称写入到文件中
总结
当前文件会输出所有资源,对于非荣誉资源并没有删除,所以看着不是很直观,后续可以只输出冗余资源,方便直接处理