iOS大佬们喜大普奔,终于有人解决了“残忍”图片资源删除方法
2023-10-19 04:01:41
图片资源杂乱无章怎么办?
随着一款项目的不断迭代,工程中的图片资源也在不断的更新换代,每次上传提交时,无论你有无更新图片,都会把项目中所有的图片一起上传一遍,长此以往,项目中的图片就会变得非常多,很多时候,我们根本不知道这些图片是谁上传的、这些图片具体用在哪里、图片是否真的需要继续保留在工程中。
最开始,我们可能还可以通过查询资源,一个一个的找到图片,如果图片对应的文件名与你在代码中调用的图片名一致的话,就能够轻松找到图片使用的地方。
但是随着项目不断更新迭代,很多时候,我们根本记不住自己把图片改成了什么名字,有时候,为了方便快捷,可能会将图片的名字修改为有意义的中文名,这就给寻找图片的具体使用位置增加了很大的难度。
而且,有时候,我们还需要删除很多使用不到的图片资源,这些资源可能被之前的开发者不小心上传了,或者这些资源属于某一个功能迭代失败后的遗留物,又或者是之前在测试的时候,随手添加的临时占位图。
难道只能手动查找吗?
目前为止,市面上还没有一款能够帮助开发者轻松找出项目中图片使用位置的工具。想要找到某张图片的使用位置,目前就只能通过手工查找的方式。
如果是使用Objective-C开发的项目,那么还可以通过搜索-(UIImage *)imageNamed:(NSString *)name
来查找图片使用的位置。
如果是使用Swift开发的项目,那么可以使用以下代码来搜索图片的使用位置:
import Foundation
func findImageUsage(inDirectoryPath: String, imageName: String) {
let fileManager = FileManager.default
let enumerator = fileManager.enumerator(atPath: inDirectoryPath)
while let file = enumerator?.nextObject() as? String {
let filePath = "\(inDirectoryPath)/\(file)"
if filePath.hasSuffix(".swift") || filePath.hasSuffix(".m") || filePath.hasSuffix(".h") {
let fileContents = try! String(contentsOfFile: filePath, encoding: .utf8)
if fileContents.contains("UIImage(named: \"\(imageName)\")") {
print(filePath)
}
}
}
}
这样我们就能很容易的找出所有图片使用的位置了。
有没有人知道解决办法?
实际上,还是有办法解决这个问题的,因为所有的图片资源都会被编译到工程的app包中,我们可以直接通过app包来查找图片的使用位置。
我们可以使用otool
命令来查看app包中的所有图片资源,命令如下:
otool -l /path/to/app.app/Contents/MacOS/app | grep LC_SEGMENT | grep -E '\[__TEXT,\ __DATA,\ __const\]'
输出结果如下:
Load command 2
cmd LC_SEGMENT
segname __TEXT
vmaddr 0x100000000
vmsize 0x1000
fileoff 0x2000
filesize 0x1000
Load command 3
cmd LC_SEGMENT
segname __DATA
vmaddr 0x100200000
vmsize 0x3000
fileoff 0x3000
filesize 0x3000
Load command 4
cmd LC_SEGMENT
segname __const
vmaddr 0x100230000
vmsize 0x30000
fileoff 0x6000
filesize 0x30000
我们可以看到,在输出结果中,图片资源位于__TEXT
段中,我们可以使用grep
命令来过滤出所有图片资源,命令如下:
otool -l /path/to/app.app/Contents/MacOS/app | grep LC_SEGMENT | grep -E '\[__TEXT,\ __DATA,\ __const\]' | grep -E '(\.png|\.jpg|\.jpeg|\.gif)'
输出结果如下:
[20:34:38][test.app] (__TEXT,__text) section (__TEXT,__const) referenced from:
_OBJC_CLASS_$_TtC27Pygmentize_Render_NSAttributedStringRenderer
[20:34:38][test.app] (__TEXT,__text) section (__TEXT,__const) referenced from:
_OBJC_CLASS_$_TtC27Pygmentize_Render_PlainRenderer
[20:34:38][test.app] (__TEXT,__text) section (__TEXT,__const) referenced from:
_OBJC_CLASS_$_TtC27Pygmentize_Render_RichRenderer
我们可以看到,在输出结果中,图片资源都被列出来了,而且,图片资源的名称和在代码中调用的名称是一致的,这就方便我们查找图片的使用位置了。
接下来,只需要将图片资源的名称和在代码中调用的名称一一对应起来,然后就可以轻松找到图片的使用位置了。
有没有更方便的方法?
当然有,有人通过脚本对齐图片名称和使用位置,十分的方便,还避免了误删。
使用这个脚本,只需要将图片资源拖拽到脚本窗口中,脚本就会自动对齐图片名称和使用位置,然后,你就可以轻松找到图片的使用位置了。
脚本下载地址:https://github.com/joelparkerhenderson/remove-unused-images
总结
图片资源的随意更改和添加让工程的图片资源数量越来越庞大,给开发者带来了很多困扰,通过上面的方法,我们可以轻松找到图片的使用位置,从而避免误删图片,保持工程的整洁。