项目经过需求的变更,产品迭代,会经过多次的改版,有些以前不再使用的图片不一定能够及时的清理掉,这些无用的图片一方面让项目图片资源的结构更加的复杂,另一方面会导致ipa包的体积变大。

因此我们需要清理不再使用的图片资源,在Android项目中使用Lint可以轻松的完成这个任务,iOS中没有太好的工具,借助网上的资源编写了个Python脚本。

安装Silver Searcher来搜索字符串,使用方法和ack,grep相似,而且搜索速度比ack,grep快。使用命令行安装:

//先安装homebrew
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" //再安装Silver Searcher
brew install the_silver_searcher

可以使用ag、base命令等

ag "image" './'

os.popen('echo $PATH')

//执行bash命令,可以通过os.popen('echo $PATH').read()读取执行的结果。

需要用到的bash命令是ag "image" './'rm -rf './',后者用来删除文件夹。

ignores

可能使用下面的方式来访问图片

for (int i = ; i <= ; ++i) {
NSString *imageName = [NSString stringWithFormat:@"image_%d", i];
UIImage *image = [UIImage imageNamed:imageName];
......
}

因此image_1这样的图片会被脚本给检查为未使用,因此添加了ignores过滤器,包含到此内容中的图片会被忽略掉。

ignores = {r'image_\d+', r'RLineTravelType\d+', r'address_\d+'}

def is_ignore(str):
for ignore in ignores:
#print ignore, re.match(ignore, str)
if re.match(ignore, str):
return True print "False"
return False

完整代码如下unUserImg.py

# -*- coding : utf- -*-

import os
import glob
import re ignores = {r'image_\d+', r'RLineTravelType\d+', r'address_\d+'} pathI = '/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images' def find_un_used():
pics = glob.glob1(pathI, '*.png')
pics = [pic[:-].replace('@2x', '') for pic in pics]
print "pnames: ====================>>>>>>>>>>>>>>>"
print pics
print "pnames: <<<<<<<<<<<<<<<====================" path = '/adu/WorkSpaceN/QunarRN/car_rn/Car'
unused_pics = []
for pic_name in set(pics):
if is_ignore(pic_name) == False:
command = 'ag "%s" %s'%(pic_name, path)
result = os.popen(command).read()
if result == '':
unused_pics.append(pic_name)
#os.system('rm -rf %s' % (pic_name)) txt_path = 'pics.txt'
txt = '\n'.join(sorted(unused_pics))
os.system('echo "%s" > %s'%(txt, txt_path)) print 'Done!!!!!' def is_ignore(str):
for ignore in ignores:
#print ignore, re.match(ignore, str)
if re.match(ignore, str):
return True print "False"
return False def doRm():
path = '/adu/WorkSpaceN/QunarRN/car_rn/Car' txt_path = 'pics.txt'
pics = open(txt_path).readlines() for pic in pics:
pic = pic.strip('\n')
sd_pic = path + pic + '.png'
hd_pic = path + pic + '@2x.png' os.system('rm "%s"'%sd_pic)
os.system('rm "%s"'%hd_pic) print 'rn Done!' if __name__ == '__main__':
find_un_used()
#is_ignore('image3')
def read_file(path):
print "read file path:", path
path = os.path.normpath(path)
if not os.path.exists(path):
print("文件路径不存在")
sys.exit(1) img_names = []
for line in open(path):
# print line
# print (line.strip())
img_names.append((line.strip()))
# print img_names
return img_names #查找hybrid项目中是否有使用未使用的图片
def find_hy_un_used():
#read file name
img_names = read_file('/adu/WorkSpaceN/QunarRN/car_rn/Car/pics.txt')
# print img_names path = '/adu/QunarGitlab/yexuxianGit/FECar/hybrid_fe/h5/src'
unused_pics = []
for pic_name in set(img_names):
print pic_name
command = 'ag "%s" %s'%(pic_name, path)
result = os.popen(command).read()
if result == '':
unused_pics.append(pic_name) txt_path = 'hypics.txt'
txt = '\n'.join(sorted(unused_pics))
print txt
os.system('echo "%s" > %s'%(txt, txt_path))
print "Done ..." # copy指定文件夹下的文件到新的文件夹中
def sourcecpy():
srcFilePath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/all_unused_pics.txt'
img_names = read_file(srcFilePath)
# print img_names srcFolderPath = '/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images/'
desFolderPath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/unusedFiles/'
for name in img_names:
source = srcFolderPath+name
# print source
# shutil.copy2(source, desFolderPath) #第一个参数是文件,第二个参数目录
targetFile = os.path.join(desFolderPath, name)
print targetFile
open(targetFile, "wb").write(open(source, "rb").read())
print "Done ..." #筛选出真正的文件名,@2x等
def findAll():
srcFilePath = '/adu/WorkSpaceN/QunarRN/car_rn/Car/hypics.txt'
img_names = read_file(srcFilePath) unused_pics = []
for file in img_names:
pics = glob.glob1('/adu/WorkSpaceN/QunarRN/car_rn/CarBundle/Images', file+'*')
unused_pics.extend(pics) txt_path = 'all_unused_pics.txt'
txt = '\n'.join(sorted(unused_pics))
os.system('echo "%s" > %s'%(txt, txt_path)) print 'Done!!!!!'

直接在命令行执行: #python unUserImg.py 即可

清理IOS项目未使用图片脚本的更多相关文章

  1. iOS项目冗余资源扫描脚本

    iOS项目冗余资源扫描脚本 随着iOS项目的版本不断迭代,app中冗余文件会越来越多,app size也持续增加,是时候需要对app冗余资源进行检测,对app进行瘦身. 使用方法: 1. 运行环境为m ...

  2. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  3. 织梦cms/dedecms清理冗余废弃未引用图片方法

    原理描述: 在原有织梦后台菜单中增加"清理冗余图片按钮",实现清理冗余图片的功能. 操作步骤: 1. 打开后台dede\sys_sql_query.php代码 在该文件中搜索如下代 ...

  4. 使用脚本删除ios工程中未使用图片

    使用脚本删除ios工程中未使用图片 最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除i ...

  5. 清理iOS工程里无用的图片,可瘦身ipa

    工程在经过多人后,往往会出现较多的垃圾,导致打包出来的ipa文件偏大,有时候我们会通过清理代码来给程序瘦身,而瘦身ipa效果明显的,主要通过清理程序里的无用图片. 推荐一个清理图片的应用 https: ...

  6. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  7. iOS 项目中用到的一些开源库和第三方组件

    iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...

  8. iOS项目中常用的第三方开源库

    1.项目使用的第三方开源库 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的 ...

  9. iOS项目的目录结构和开发流程

    转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法.   目录结构 AppDelegate Models Ma ...

随机推荐

  1. 理解Windows中的路由表和默认网关

    每一个Windows系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息.路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制. 理 ...

  2. codeforces 468B 2-sat

    今天明确了2-SAT; 表示对一对整数之间的关系是否存在 #include<cstdio> #include<algorithm> #include<iostream&g ...

  3. 一个不错的JavaScript解析浏览器路径方法(转)

    JavaScript中有时需要用到当前的请求路径等涉及到url的情况,正常情况下我们可以使用location对象来获取我们需要的信息,本文从另外一个途径来解决这个问题,而且更加巧妙 方法如下: fun ...

  4. spring mvc 框架核心文档

    http://docs.spring.io/spring-data/ Parent Directory - cassandra/ 01-Apr-2014 01:50 - commons/ 29-Jan ...

  5. springMVC2 1入门程序

    1入门程序 .1需求 实现商品列表查询 .2需要的jar包 使用spring3.2.0(带springwebmvc模块) .1前端控制器 在web.xml中配置: <?xml version=& ...

  6. [原 -> 砖] C# IEnumerable<T>泛型取值

    为什么要写这个?因为发现,很多人在读取泛型集合中Item的值时,使用的方法是 item.GetType().GetField("xxxxx").GetValue() 或类似的写法. ...

  7. c#线程问题(3)

    //执行回调函数 static void Main(string[] args) { UPPER = ; Thread thread1=new Thread(sops); thread1.Name = ...

  8. TortoiseGit安装教程

    TortoiseGit 是Windows下的可视化Git界面. 下载Git 网站地址: http://code.google.com/p/tortoisegit/ 安装前必须装上msysgit才能在W ...

  9. Javascript 数组与字典

    Javascript 的数组Array,既是一个数组,也是一个字典(Dictionary). 先举例看看数组的用法. var a = new Array(); a[0] = "Acer&qu ...

  10. Code the Tree

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2292   Accepted: 878 Description A tree ...