美文网首页iOS-Objective-C项目管理
找出 iOS 中未使用的图片资源

找出 iOS 中未使用的图片资源

作者: 追沐 | 来源:发表于2017-11-08 14:12 被阅读0次

    项目越来越大,一些没用了的图片资源没有及时删除,占用项目空间,一个个检查太耗时间代价。gitHub上有个人写了一个python脚本,可以帮助解决这个问题。

    一、脚本

    原文地址:http://www.cocoachina.com/ios/20171030/20975.html

    脚本代码如下:

    # coding=utf-8
    
    import os
    import re
    import shutil
    
    # 是否开启自动删除,开启后当检查到未用到的图,
    # 将自动被删除。建议确认所有的图没用后开启
    IS_OPEN_AUTO_DEL = False
    
    # 将要解析的项目名称
    DESPATH = "/Users/xx/Documents/xxxx/xxxx"
    
    # 可能检查出错的图片,需要特别留意下
    ERROR_DESPATH = "/Users/xx/Desktop/unUseImage/error.log"
    
    # 解析结果存放的路径
    WDESPATH = "/Users/xx/Desktop/unUseImage/image.log"
    
    # 项目中没有用到的图片
    IMAGE_WDESPATH = "/Users/xx/Desktop/unUseImage/images/"
    
    # 目录黑名单,这个目录下所有的图片将被忽略
    BLACK_DIR_LIST = [
                      DESPATH + '/ThirdPart', # Utils 下所有的文件将被忽略
                      ]
    
    # 已知某些图片确实存在,比如像下面的图,脚本不会自动检查出,需要手动加入这个数组中
    # NSString *name = [NSString stringWithFormat:@"loading_%d",i];
    # UIImage *image = [UIImage imageNamed:name];
    EXCEPT_IMAGES = [
                     'loading_',
                     'launch-guide'
                     ]
    
    # 项目中所有的图
    source_images = dict()
    # 项目中所有使用到的图
    use_images = set()
    # 异常图片
    err_images = set()
    
    # 目录是否在黑名单中 BLACK_DIR_LIST
    def isInBlackList(filePath):
        if os.path.isfile(filePath):
            return filename(filePath) in BLACK_DIR_LIST
        if filePath:
            return filePath in BLACK_DIR_LIST
        return False
    
    # 是否为图片
    def isimage(filePath):
        ext = os.path.splitext(filePath)[1]
        return ext == '.png' or ext == '.jpg' or ext == '.jpeg' or ext == '.gif'
    
    # 是否为 APPIcon
    def isappicon(filePath):
        return 'appiconset' in filePath
    
    def filename(filePath):
        return os.path.split(filePath)[1]
    
    def is_except_image(filePath):
        name = filename(filePath)
        for item in EXCEPT_IMAGES:
            if item in name:
                return True
        return False
    
    def auto_remove_images():
        with open(WDESPATH, 'r') as f:
            for line in f.readlines():
                path = DESPATH + line.strip('\n')
                if not os.path.isdir(path):
                    if 'Assets.xcassets' in line:
                        path = os.path.split(path)[0]
                        if os.path.exists(path):
                            shutil.rmtree(path)
                    else:
                        os.remove(path)
    
    
    def un_use_image(filePath):
        if re.search(r'\w@3x.(png|jpg|jpeg|gif)', filePath):
            return
        
        if re.search(r'\w(@2x){0,1}.(png|jpg|jpeg|gif)', filePath):
            exts = os.path.splitext(filePath)
            result = (filename(filePath).replace('@2x', '')).replace(exts[1],'')
            source_images[result] = filePath
    
    def find_image_name(filePath):
        f = open(filePath)
        for index, line in enumerate(f):
            line = line.strip()
            regx = r'\[\s*UIImage\s+imageNamed\s*:\s*@"(.+?)"'
            matchs = re.findall(regx, line)
            if matchs:
                for item in matchs:
                    use_images.add(item)
            else:
                err_matchs = re.findall(r'\[UIImage imageNamed:', line)
                if err_matchs:
                    name = filename(filePath)
                    for item in err_matchs:
                        err_images.add(str(index + 1) + ':' + name + '\n' + line + '\n')
    
    def find_from_file(path):
        paths = os.listdir(path)
        for aCompent in paths:
            aPath = os.path.join(path, aCompent)
            if isInBlackList(aPath):
                print('在黑名单中,被自动忽略' + aPath)
                continue
            if os.path.isdir(aPath):
                find_from_file(aPath)
            elif os.path.isfile(aPath) and isimage(aPath) and not isappicon(aPath) and not is_except_image(aPath):
                un_use_image(aPath)
            elif os.path.isfile(aPath) and os.path.splitext(aPath)[1]=='.m':
                find_image_name(aPath)
    
    if __name__ == '__main__':
        if os.path.exists(IMAGE_WDESPATH):
            shutil.rmtree(IMAGE_WDESPATH)
    
        os.makedirs(IMAGE_WDESPATH)
    
    with open(WDESPATH, 'w') as wf:
        find_from_file(DESPATH)
        for item in set(source_images.keys()) - use_images:
            value = source_images[item]
            wf.write(value.replace(DESPATH, '') + '\n')
            ext = os.path.splitext(value)[1]
            shutil.copyfile(value, IMAGE_WDESPATH + item + ext)
            
            with open(ERROR_DESPATH, 'w') as ef:
                for item in err_images:
                    ef.write(item)
    
    if IS_OPEN_AUTO_DEL:
        auto_remove_images()
    

    二、使用

    如果没学过python也没关系,直接执行这个脚本就可以了。

    0xx1

    Sublime里,然后修改“DESPATH”为你项目的路径,其他几个路径需要设置用户名的设置一下用户名:

    # 将要解析的项目名称
    DESPATH = "修改为你的项目路径"
    
    # 可能检查出错的图片,需要特别留意下
    ERROR_DESPATH = "/Users/修改为你的用户名/Desktop/unUseImage/error.log"
    
    # 解析结果存放的路径
    WDESPATH = "/Users/修改为你的用户名/Desktop/unUseImage/image.log"
    
    # 项目中没有用到的图片
    IMAGE_WDESPATH = "/Users/修改为你的用户名/Desktop/unUseImage/images/"
    
    0xx2

    保存文件至桌面,起名:unUseImage.py

    0xx3

    文件保存到桌面后,cd到桌面下;

    打开终端执行命令执行脚本:python unUseImage.py。

    桌面会生成一个文件件:文件夹里images里面是你项目中可能没有用到的图片。

    三、注意

    执行此脚本生成的文件夹中,images里面的图片是项目里有可能没有用到的图片,但是这里面有些图片项目里面是用到了的,但是还是捡出来了,所以删除项目中这些图片资源的时候需要再比对确认一下,以防错删。

    相关文章

      网友评论

        本文标题:找出 iOS 中未使用的图片资源

        本文链接:https://www.haomeiwen.com/subject/meoemxtx.html