项目经过需求的变更,产品迭代,会经过多次的改版,有些以前不再使用的图片不一定能够及时的清理掉,这些无用的图片一方面让项目图片资源的结构更加的复杂,另一方面会导致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. C#实现汉诺塔问题

    汉诺塔的由来:汉诺塔是源自印度神话里的玩具.上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且 ...

  2. delphi CoolBar这个怎么弄没了

    CoolBar这个怎么弄没了 像Windows这样的     procedure TForm1.Button1Click(Sender: TObject); begin    CoolBar1.Fix ...

  3. Thread+Handler 线程 消息循环(转载)

    近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...

  4. php中数组自定义排序

    php中数组自定义排序方法有很多,现在只提usort();不会保留原有键名. unsort调用方法就是unsrot($arr,func); 注意: 如果func是写在当前类中的话,那么调用的方式是 u ...

  5. SAP BW 重新初始化

  6. C++标准转换运算符const_cast

    前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述.C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymor ...

  7. Windows 10正式版官方原版ISO镜像下载

    [微软官方]下载地址1:官方下载工具(32-位系统版本)官方下载工具(64-位系统版本) [MSDN]下载地址2:cn_windows_10_multiple_editions_x64_dvd_684 ...

  8. 谈KVC、KVO(重点观察者模式)机制编程

    一不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文化外,还是镜头少普通话跟小明一样烂的Lau ...

  9. Javascript 数组与字典

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

  10. html笔记01:顺序和无序列表

    <!DOCTYPE html> <html> <body> <li>Yellow <ul><li>Wet soil</li ...