清理iOS项目中不用的图片资源方法

       项目经过需求的变更,产品本身的迭代,会经过多次的改版,有一些以前的图片不一定能及时的清理掉,这些图片一方面让项目图片资源的结构更加的复杂,另一方便会直接导致上线之后的ipa包的体积大,所以需要清理不用的图片资源,在Android项目中使用Lint可以轻松的完成这个任务,在iOS上没有找到比较好的工具,因此借助网上的例子,写了一个python清除Xcode不用的图片资源的脚本。

       先简单说下ios中使用图像资源的方式,iOS中使用 Images Assets管理图片,图片资源都是放在这里面,项目中的图片资源会放到*.xcassets目录中,里面对应1x,2x和3x的图,还有一个Contents.json的描述文件,清除图片资源的同时需要把这个目录也一起清除。 

       在代码中使用图片的方法一般是:

[UIImage imageNamed:@"图片"]

       在xib中调用图片的方法是用xml的方式描述,图片资源作为image的名称:

 
   <imageview image="image" id="rb9-sl-eqm"></imageview image="image" id="rb9-sl-eqm">

       所以需要搜索在项目中除了*.xcassets目录中的所有文件来跟该目录中的文件相匹配对应,如果找到对应的图片名称,说明该图片是被使用的,否则该图片没被使用,即可被清理掉。

       搜索文件的方式可以使用一些类似grep,ack的工具,我在中间也有借助一些工具,比如http://jeffhodnett.github.io/Unused/通过终端执行 shell 命令来执行,但是发现并不是很好用,不能完全达到想要的效果。过程中间发现有一种更快,更好的搜索文件内容的方式:The Silver Searcher,项目地址:https://github.com/ggreer/the_silver_searcher

      1.下载The Silver Searcher

      2.安装The Silver Searcher,输入命令: brew install the_silver_searcher便可以看到终端的运行过程,如果安装成功就有成功的提示。

        3.在终端切换到你所要测试的项目路径:cd 项目路径。(例子项目叫ww副本)

                                         

        4.使用ag搜索: ag"image"。可以搜索到该目录下以及其子目录下的所有包含image的文件。agrm -rf './'表示删除所有的文件。

5.下载python源码地址:https://github.com/jjz/script/blob/master/un_used.py。这是一段执行筛选在项目中是否有使用图片的代码,我在使用过程中,发现代码并不完整和正确,根据自己的需求进行部分修改添加后,代码如下:

以上的代码:

1-6表示一些python语句在使用时的一些引入。

8-16表示是*.xcassets目录文件在操作过程中的路径变换。原因是由于在实现过程中,发现使用它原来的代码是目录的图片去匹配了整个项目(包括xcassets目录)中的图片,这样就导致了看似所有的图片都被使用,而无法实现筛选删除的操作 所以在这个地方之所以写了几个路径就是对图片文件进行移动,好在匹配的时候是用它与项目中的其它(不包括图片文件*.xcassets)全部文件匹配,并不是随便写的,而是:

第二个路径表示当前xcassets文件的路径;

第三个是在实现筛选删除钱要将xcassets文件移到的位置所在的路径;

第五个是项目此时已经完成筛选删除后所在路径;

第四个完成删除后回归到最初的位置所在的路径。

18表示删除之前路径的移动。

21-60就是整个过程中调用的方法,其中find_un_used()方法查找所有满足正则表达式的图片,这段代码从当前文件夹里,找到所有的.imageset文件,并只使用没有后缀名的文件名,在文件夹中找到该名称的文件有没有被使用。如果没有被使用的就清除资源。执行这段之后发现有一些不应该清除图片资源也被清除了,因为有一种例外的没有考虑到。而is_ignore()则是考虑此情况的方法:

有的时候我们需要动态的给一些控制赋值会使用这样的方式:

                                     

比如上面的代码中查找 image1时,发现这个图片并没有使用,就会清除该图片,但是该图片并不应该被清除。

采用ignore的方式来解决这个问题,也就是我会提前准备好一个ignore的列表,内容采用正则表达式来定义,比如这样:

ignores = {r'image/d+'}

然后在定义一个检查ignore的方法:

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

如果一个文件名在ignore中就会忽略清除该文件。

47-48表示在它执行完成后,我们可以在文件处动态看到文件的转移。

6. 然后在终端输入执行命令: python un_used.py(python文件路径)。执行结果如下,显示了删除了哪些图片,还有哪些,我们也可进去项目图片文件目录里查看,这样就完成了清理iOS项目中不用的图片资源。

 

   在项目过程中,由于百度到说在python中输入执行命令,所以自己也有下载python软件进行命令的执行,但是由于对软件非常的陌生,可能在安装环境上未能搭配成功,导致执行未能成功,不能跟自己的测试项目联系起来,最后选择在终端执行python。

  题别注意的是,上面的python文件中筛选图片的正则我只是写了两种类型分别是image和group开头的的图片,所以根据自己需要来填写,当然能写一个便利所有图片的正则最好不过了。


     


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值