抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

一个iOS工程经过多次改版之后,往往有很多废弃的图片没有清理掉,如果清理掉这些图片就可以让ipa包的体积大大减小。
我做的项目里有700多张图片,其中没用到的就有200多张,所以清理图片还是很有必要的。

一般iOS项目的目录结构大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/Users/Jobs/Documents/Poboke      //项目文件夹

├── Poboke.xcodeproj //工程启动文件

└── Poboke //资源文件夹
├── main.m
├── AppDelegate.h
├── AppDelegate.m
├── ViewController.h //代码文件
├── ViewController.m
├── Poboke-Info.plist
├── Poboke-Prefix.pch

├── Icon.png
├── Icon@2x.png
├── Icon-60@2x.png
├── button.png
├── button@2x.png //图片文件
├── dialog.png
├── dialog@2x.png
├── line@2x.png
└── ......

一、安装Silver Searcher

在linux系统里可以使用ack-grep命令来搜索内容,但是MacOS系统里没有ack-grep
不过MacOS系统可以安装Silver Searcher来搜索字符串,使用方法和ack-grep相似,而且搜索速度比ack-grep快。

打开终端,输入以下命令安装:

1
2
3
4
5
#先安装homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#再安装Silver Searcher
brew install the_silver_searcher

安装完后就可以通过ag命令(ack-grep的缩写)来搜索字符串了。

二、搜索iOS工程里没用到的图片

iOS的图片分为标清和高清两种,高清图片的名字是以"@2x"结尾的。一般代码里不会写上"@2x",所以搜索时要先把"@2x"去掉。如果搜索到的结果为空字符串,说明代码里没有引用该图片。

获取到所有未使用的图片名,排序后保存到pics.txt文件里,Python代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#coding:utf-8

import os
import glob

#资源路径
path = '/Users/Jobs/Documents/Poboke/Poboke'

#获取资源路径下所有的png图片名
pics = glob.glob1(path, '*.png')
pics = [pic[:-4].replace('@2x', '') for pic in pics]

#找出未使用的图片
unused_pics = []
for pic in set(pics):
command = 'ag "%s" %s'%(pic, path)
result = os.popen(command).read()
if result == '':
unused_pics.append(pic)

#将未使用的图片文件名保存到文本
txt_path = 'pics.txt'
txt = '\n'.join(sorted(unused_pics))
os.system('echo "%s" > %s'%(txt, txt_path))
print('Done!')

三、手动检查图片名

把图片名保存到文本里是为了先确认一下是否有误搜到的图片。

比如搜到了这么几张未使用的图片:

1
2
3
4
star_01.png
star_02.png
star_03.png
star_04.png

而代码是这么写的:

1
2
3
4
5
for (int i = 1; i <= 4; ++i) {
NSString *imageName = [NSString stringWithFormat:@"star_%02i", i];
UIImage *image = [UIImage imageNamed:imageName];
#......
}

那么在代码里肯定搜索不到"star_01",而实际上用到了这张图片。
所以需要看文本里的图片名有没有含有连续数字,有的话在工程里手动搜索一下关键代码。
如果发现用到图片的话,就手动将图片名从文本里删掉。

四、批量删除图片

用Python代码读取pics.txt的内容,将里面的图片删掉,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#coding:utf-8

import os

#资源路径
path = '/Users/Jobs/Documents/Poboke/Poboke'

#读取要删除的图片名
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('Done!')

评论