美文网首页
iOS减包实践-大图是否用Assets管理?

iOS减包实践-大图是否用Assets管理?

作者: Billlin | 来源:发表于2024-04-06 21:52 被阅读0次

Asset Catalog优势

  • 使用方面
    • 对图片资源方便统一管理;
    • 方便图片拉升;
    • 方便适配暗黑模式;
  • 性能方面
    • xcassets目录下的所有图片最终被打包到Assets.car文件中,多张图片被整合为一张大图。App运行时根据索引从大图中获取单张小图片,可以减少文件IO次数,Performance会更好;
    • Apple为了优化iPhone读取图片的速度,Xcode编译时,Asset Catalog中的png图片转换成CgBI格式(非标准的png格式),jpg格式图片会转为png.其他非Asset Catalog管理的图片资源,在编译时不会被优化;
    • 使用Asset Catalog管理的图片能被App Store工具app thinning处理,处理后用户只会下载匹配其设备分辨率的图片资源,用户下载的包更小;

是否所有图片都适合用Assets管理?

先说结论

  • Assets适合用来管理icon类会重复使用的小图;
  • 背景图这类的大图不适合用Assets管理;

例子

image.png

图片大小:39524字节
未添加图片时Assets.car的大小:5,026,528字节
添加图片后Assets.car的大小: 5,083,664字节

添加图片后Assets.car大小增大了57136字节,比原图多了17612字节;

通过 assetutil 工具对Assets.car进行解析,查看图片在Assets.car中的大小:

image.png

图片放到Assets中,Xcode做了什么事情?

Xcode会执行iphoneos-optimize脚本对Assets中的图片进行优化

脚本路径:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/iphoneos-optimize

通过查阅相关资料发现,Compress PNG Files做的并不是单纯的压缩数据,而是把文件格式也做了修改,Apple是将png图片转换成了一种CgBI格式:

These modifications cause the generated images to be invalid as per the current version of the PNG standard.

extra critical chunk (CgBI)
byteswapped (RGBA -> BGRA) pixel data, presumably for high-speed direct blitting to the framebuffer
zlib header, footer, and CRC removed from the IDAT chunk
premultiplied alpha (color' = color * alpha / 255)

明显的改动就是在IHDR块之前插入了CgBI块来表示这种格式,同时修改了IDAT块中的数据,原因就是在iPhone中,图像是以BGRA格式在内存中处理的,到这里就可以发现,其实这个所谓的Compress PNG Files,最主要的目的并不是压缩图片的大小,而是将图片转换成iPhone能更方便处理的格式,加快处理速度。

因为CgBI的IDAT是BGRA格式的,所以不管之前的IDAT是否有Alpha通道,在处理的时候,都会增加alpha通道,其次就是因为每一行数据的filter不同,apple处理的时候,默认每一行都使用相同的filter,而原始文件则可以通过更好的算法,对不同的数据行使用不同的filter,为后面的数据压缩提供更容易压缩的数据。

工具

  • assetutil
    将Assets.car中一些信息资源解析成json格式;

    sudo xcrun — sdk iphoneos assetutil — info ./Assets.car > ./Assets.json

  • AssetCatalogTinkerer
    查看Assets.car中所有图片的可视化工具,还可以导出图片;

    https://github.com/insidegui/AssetCatalogTinkerer

    image.png

参考

iOS减包实战:Compress PNG Files作用分析
Assets.car解剖作弊条
iOS获取ipa及解压Assets.car,兼容M1
抖音品质建设 - iOS 安装包大小优化实践篇
iOS 优化 - 瘦身

相关文章

  • Flutter 图片管理和加载

    资源管理 Flutter APP安装包中会包含代码和 assets(资源)两部分。Assets是会打包到程序安装包...

  • UML模型图

    官方文档UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图 用例图 用例图 Use case...

  • Flutter 项目创建

    第2步: 使用外部包(package)查找可用包 pubspec文件管理Flutter应用程序的assets(资源...

  • iOS13 设置启动图

    iOS13之后,启动图只能用LaunchScreen.storyboard设置,并且图片直接拖到assets中,不...

  • iOS 在线app素材获取

    我们紧跟上面的文章iOS 获取在线的app包,我们都知道现在ipa文件中,ios系统打包的时候将Assets.xc...

  • iOS 9 Xcode7 设置Launch Image 启动图片

    Step1 1.点击Assets.xcassets进入图片管理,然后点击“+”号如图,选择"New iOS Lau...

  • Flutter开发- flutter的pub包管理

    1、使用YAML管理第三方依赖包 在原生开发中,Android使用Gradle来管理依赖,iOS用Cocoapod...

  • Flutter开发--Pub包管理

    一、使用YAML管理第三方依赖包 在原生开发中,Android使用Gradle来管理依赖,iOS用Cocoapod...

  • Assets.car: Xcode 10 生成的 ipa 比

    经过 分别拿到两个ipa, 按大小排列显示,发现Assets.car 文件大了许多 解压ipa包中的Assets....

  • ipa文件瘦身,重点

    不能所有图片都放Assets.xcassets里面.大图,反而打包出来内存剧增. 例子:说明书(大图750*113...

网友评论

      本文标题:iOS减包实践-大图是否用Assets管理?

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