前言
在iOS项目开发的过程中,如果版本迭代开发的时间比较长,那么在很多版本开发以后或者说有多人开发参与以后,工程中难免有一些垃圾资源,未被使用却占据着api包的大小!
这里我通过Python脚本来查找项目中未被使用的图片、音频、视频资源,然后删除掉;以达到减小APP包大小的目的!
代码
先查找项目中所以的资源文件存到你数组里面
def searchAllResName(file_dir): global _resNameMap fs = os.listdir(file_dir) for dir in fs: tmp_path = os.path.join(file_dir, dir) if not os.path.isdir(tmp_path): if isResource(tmp_path) == True and '/Pods/' not in tmp_path and '.appiconset' not in tmp_path and '.launchimage' not in tmp_path: imageName = tmp_path.split('/')[-1].split('.')[0] _resNameMap[imageName] = tmp_path conLog.info_delRes('[FindRes OK] ' + tmp_path) elif os.path.isdir(tmp_path) and tmp_path.endswith('.imageset') and '/Pods/' not in tmp_path: imageName = tmp_path.split('/')[-1].split('.')[0] _resNameMap[imageName] = tmp_path conLog.info_delRes('[FindRes OK] ' + tmp_path) else: searchAllResName(tmp_path)
遍历查询项目的所以代码,查找工程中所引用的资源文件
# 查询项目的所以代码 def searchProjectCode(file_dir): global _projectPbxprojPath fs = os.listdir(file_dir) for dir in fs: tmp_path = os.path.join(file_dir, dir) if tmp_path.endswith('project.pbxproj'): _projectPbxprojPath = tmp_path if not os.path.isdir(tmp_path): if '/Pods/' not in tmp_path: try: findResNameAtFileLine(tmp_path) conLog.info_delRes('[ReadFileForRes OK] ' + tmp_path) except Exception as e: pass # conLog.error_delRes('[ReadFileForRes Fail] [' + str(e) + ']' + tmp_path) else: searchProjectCode(tmp_path) # 查找工程中所引用的资源文件 def findResNameAtFileLine(tmp_path): global _resNameMap Ropen = open(tmp_path,'r') for line in Ropen: lineList = line.split('"') for item in lineList: # bar@2x barimg.png if item in _resNameMap or item.split('.')[0] in _resNameMap or item + '@1x' in _resNameMap or item + '@2x' in _resNameMap or item + '@3x' in _resNameMap: del _resNameMap[item] Ropen.close()
删除垃圾资源文件,这里垃圾资源文件删除分为两部分一部分是Assets.xcassets
里面的,一部分是直接导入工程目录中的资源,如果是Assets.xcassets
垃圾资源直接删除就行了,但是如果是直接导入到工程目录里面的资源,那就先删除project.pbxproj
中的引用,再删除本地资源文件;
# 删除无用的资源文件 def delAllRubRes(): global _resNameMap, _hadDelMap # .imageset类型的资源图片直接删除 for resName in list(_resNameMap.keys()): tmp_path = _resNameMap[resName] if tmp_path.endswith('.imageset'): if os.path.exists(tmp_path) and os.path.isdir(tmp_path): try: # 已删除的元素 _hadDelMap[resName] = tmp_path # 删除.imageset文件夹 delImagesetFolder(tmp_path) # 字典移除 del _resNameMap[resName] conLog.info_delRes('[DelRubRes OK] ' + tmp_path) except Exception as e: conLog.error_delRes('[DelRubRes Fail] [' + str(e) + ']' + tmp_path) else: conLog.error_delRes('[DelRubRes Fail] [not exists] ' + tmp_path) delResAtProjectPbxproj() def delImagesetFolder(rootdir): filelist = [] filelist = os.listdir(rootdir) for f in filelist: filepath = os.path.join( rootdir, f ) if os.path.isfile(filepath): os.remove(filepath) elif os.path.isdir(filepath): shutil.rmtree(filepath,True) shutil.rmtree(rootdir,True) # 直接导入到工程中的图片需要删除project.pbxproj中的引用,再移除本地文件 def delResAtProjectPbxproj(): global _projectPbxprojPath, _resNameMap, _hadDelMap if _projectPbxprojPath != None: # 先把需要删除的资源名先保存一份 _needDelResName = [] file_data = '' Ropen = open(_projectPbxprojPath,'r') for line in Ropen: idAdd = True for resName in _resNameMap: if resName in line: idAdd = False if resName not in _needDelResName: _needDelResName.append(resName) if idAdd == True: file_data += line Ropen.close() Wopen = open(_projectPbxprojPath,'w') Wopen.write(file_data) Wopen.close() # 已经清理过project.pbxproj中的引用的资源文件,开始从_resNameMap中移除已被处理过的资源文件 # 并删除本地的对应的资源文件 for item in _needDelResName: tmp_path = _resNameMap[item] if os.path.exists(tmp_path) and not os.path.isdir(tmp_path): # 已删除的元素 _hadDelMap[item] = tmp_path # 删除文件 os.remove(tmp_path) # 字典移除 del _resNameMap[item] conLog.info_delRes('[DelRubRes OK] ' + tmp_path) else: pass
总的调用函数
# 开始清理无用的垃圾资源文件 def startCleanRubRes(file_dir, ignoreList = []): global _resNameMap, _hadDelMap,_isCleaing if _isCleaing == True: return _isCleaing = True initData() conLog.info('-' * 30 + '开始清理资源文件' + '-' * 30) searchAllResName(file_dir) conLog.info_delRes('-' * 20 + '全部的资源文件列表' + '-' * 20) conLog.info_delRes(_resNameMap) for item in ignoreList: if item in list(_resNameMap.keys()): del _resNameMap[item] conLog.info_delRes('-' * 20 + '忽略删除的资源文件' + '-' * 20) conLog.info_delRes(ignoreList) searchProjectCode(file_dir) conLog.info_delRes('-' * 20 + '需要删除的资源文件' + '-' * 20) conLog.info_delRes(_resNameMap) delAllRubRes() conLog.info_delRes('-' * 20 + '删除成功的资源文件' + '-' * 20) conLog.info_delRes(_hadDelMap) conLog.info_delRes('-' * 20 + '删除失败的资源文件' + '-' * 20) conLog.info_delRes(_resNameMap) _isCleaing = False
软件
鉴于有些iOS开发程序员没有Python基础,这里做了一个图形化操作界面,欢迎大家下载使用!
下载地址:
https://gitee.com/zfj1128/ZFJ...
软件截图:
总结
以上所述是小编给大家介绍的Python一键查找iOS项目中未使用的图片、音频、视频资,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]