Python一键查找iOS项目中未使用的图片、音频、视频资源


Posted in Python onAugust 12, 2019

前言

在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项目中未使用的图片、音频、视频资源

总结

以上所述是小编给大家介绍的Python一键查找iOS项目中未使用的图片、音频、视频资,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python tempfile模块学习笔记(临时文件)
May 25 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
Python断言assert的用法代码解析
Feb 03 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
解析python的局部变量和全局变量
Aug 15 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
Python 内置函数速查表一览
Jun 02 Python
Python中super().__init__()测试以及理解
Dec 06 Python
django+echart数据动态显示的例子
Aug 12 #Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 #Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 #Python
python内存管理机制原理详解
Aug 12 #Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 #Python
python实现图片压缩代码实例
Aug 12 #Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 #Python
You might like
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python快速排序算法实例分析
2017/11/29 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
生日礼品店创业计划书范文
2014/03/21 职场文书
合作意向书范本
2014/03/31 职场文书
关于保护环境的标语
2014/06/09 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
前台岗位职责范本
2015/04/16 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
Java无向树分析 实现最小高度树
2022/04/09 Javascript