美文网首页iOS Developer
iOS端安装包瘦身

iOS端安装包瘦身

作者: 无神 | 来源:发表于2017-06-22 08:31 被阅读218次

    一、删除不再使用的资源

    这里的资源文件主要指图片资源。获取的实现步骤如下:

    1. 获取资源文件(find命令)
    2. 设置资源类型(jpg,gif,png,webp)
    3. 正则匹配图片名
    4. 集合取差集
    5. 匹配编号规则
    6. 删除无用图片

    工具名:LSUnusedResources
    从github上下载源码运行,即可生成工具。
    FengNiao也可以删除不再使用的图片资源。

    二、图片压缩(Webp)

    目前常用的图片格式:jpgpnggif
    几种图片格式的区别如下:

    JPEG—照片的标准格式,不支持透明。
    GIF—被限制在256色因此对于大块纯色和简单图像非常好。它支持透明但是会产生锯齿边缘。
    PNG—.jpg和.gif的漂亮结合,具有.jpg图片的质量和.gif的透明度,而且没有锯齿。

    文件大小和系统支持方面的对比

    1. 同个分辨率的图片,保存为png要比jpg大;
    1. png图片有alpha通道,因此它支持图片透明,这点在ios开发中尤为重要;而jpg不支持透明.
    2. xcode会对png格式进行特殊的优化处理,而对于其他图片不做处理.

    对于本地化的图片资源,我们一般都使用 .png格式的,对于从网络远程加载的图片资源,之前使用的是.jpg格式的。但是在实际的使用中发现,效果不是很理想,但遇到加载高清大图时候,还是会出现由于图片占用内存过高导致的carsh。于是把图片格式转向了网上兴起的流行的webp格式。

    为什么使用webp

    1.webp格式的优点

    1. webp 压缩率高支持有损与无损压缩
    2. webp 体积大幅减小,肉眼看不出差异
    3. webp 支付alpha透明 和 24-bit颜色数,不像PNG8色彩不够出现毛边,GIf转Animated webp有损可减少64%,无损减少19%。
    4. 小于256色适合无损压缩,压缩率高,参数使用lossles -q 100
    5. 大于256色使用75%有损压缩,参数 -q 75
    6. 远大于256色使用75%以下压缩率,-q 50 -m6

    2.webp格式的缺点

    1. 较png消耗2倍左右CPU和解码时间
    2. 全平台支持不够。不过在iOS上可以通过对应的iOS的webp解析库解析。

    对于iOS开发者来说,webp的支持库还是蛮多的。

    • webp项目主页
    • iOS webp解析库
    • SDWebImage
    • 使用pod管理第三方库的同学,可以在pod文件中添加 pod 'SDWebImage/WebP'语句,更新pod库安装webp的支持库。(注:使用pod安装此库需要VPN的支持)

    新版的SDWebImagewebp格式判断的核心代码如下:

    #import "NSData+ImageContentType.h"
    
    
    @implementation NSData (ImageContentType)
    
    + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
        if (!data) {
            return SDImageFormatUndefined;
        }
        
        uint8_t c;
        [data getBytes:&c length:1];
        switch (c) {
            case 0xFF:
                return SDImageFormatJPEG;
            case 0x89:
                return SDImageFormatPNG;
            case 0x47:
                return SDImageFormatGIF;
            case 0x49:
            case 0x4D:
                return SDImageFormatTIFF;
            case 0x52:
                // R as RIFF for WEBP
                if (data.length < 12) {
                    return SDImageFormatUndefined;
                }
                
                NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
                if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                    return SDImageFormatWebP;
                }
        }
        return SDImageFormatUndefined;
    }
    
    

    三、删除工程中不再使用的代码

    现在的App都是经过多次的版本迭代开发出来的。我们在版本迭代的过程中,因为需求的变化,或多或少的有一些或者方法在后续的版本中我们不在使用,而我们又没有来得及及时删除,而这些代码对于我们生成的包的大小还是有一些影响的。

    因为虽然那些类和方法不在使用,但是在编译打包的时候,它们还是会生成对应的符号表。所以为了我们的包大小,我们应该检查,删除那些不再使用的类和方法。另一方面删除那些不在使用的类和方法,也有利于我们后续的代码维护和升级。
    对于删除不再使用的代码,第三方开发工具AppCode本身自带这个功能。但是有一些小缺陷,使用的同学,自己去查询。

    四、代码结构重构

    代码重构与上面的删除不再使用的代码是类似的,但是代码重构对于开发者的要求更高一些。代码重构是对一个或者或者几个类的重复代码的抽象封装,使我们的代码看上去更清晰,复用性更好。代码重构还能很好的锻炼我们的逻辑思维和代码提炼能力。代码重构对于项目瘦身也能起到一定的帮助。
    对于代码重构 SameCodeFinder能帮助我们快速分析出那些文件中的代码相似度,可以着重考虑重构。
    SameCodeFinder链接里有详细的使用说明。

    引用

    戴铭 | GMTC 上分享滴滴出行 iOS 端瘦身实践的 Slides

    相关文章

      网友评论

        本文标题:iOS端安装包瘦身

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