Apple Assets Car 文件

Apple .xcassets 文件结构

  • 2021年不知道发什么神经, 开始研究xcassets文件解析, 用PythonBOMcar的结构初步解析出来.
  • 2025年又开始发神经, 将2021年的Python代码用Rust重写. 写着写着发神经, 想把car的内容提取出来. 被Deepmap2解码卡住, 无奈中断.
  • 2026年碰上AI+Agent, 想起来这货, 于是拿来练手.

本文全部由Agent分析代码总结的文件结构、流程.

如有审核不足, 可在评论区指出错漏的地方.

代码有空整理再放出来吧🕊️🕊️🕊️

Apple Assets (.car) File Format

Apple 的 .car (Compiled Asset Catalog) 文件是 Xcode 在编译 Asset Catalog (.xcassets) 时生成的二进制文件。它采用三层嵌套结构:BOM 容器 包裹 CAR 元数据与索引,CAR 索引指向 CSI 渲染数据

整体架构


1. BOM 容器层

BOM (Bill of Materials) 是 Apple 通用的二进制容器格式,.car 文件以此为底层封装。所有 BOM 结构使用大端序 (Big-Endian)

1.1 文件布局

1.2 StoreHeader

偏移大小字段说明
0x008Bmagic"BOMStore"
0x084Bversion固定为 1
0x0C4Bblock_count非空 Block 数量
0x104Bindex_offsetIndexStore 的文件偏移
0x144Bindex_lenIndexStore 长度
0x184Bvar_offsetVariableStore 的文件偏移
0x1C4Bvar_lenVariableStore 长度
0x20480B(padding)保留填充

1.3 IndexStore (Block 索引表)

每个 Index 条目 (8 字节):

字段大小说明
offsetu32Block 数据的文件绝对偏移
lenu32Block 数据长度

1.4 VariableStore (命名变量表)

每个 Variable (变长):

字段大小说明
indexu32指向 IndexStore 的索引
lenu8名称长度
name[u8; len]变量名 (如 "CARHEADER")

1.5 B-Tree 结构

BOM 中的树用于存储键值对集合,CAR 的各命名树均采用此结构。

TreeHeader (位于命名 Block 中):

字段大小说明
magic4B"tree"
versionu32固定为 1
indexu32根节点在 IndexStore 中的索引
block_sizeu32固定为 4096
path_countu32叶节点中的 key/value 对总数
unknownu8未知

TreePaths (树节点):

字段大小说明
is_leafu160=内部节点, 非0=叶节点
countu16子项数量
forwardu32下一个兄弟节点的 Block 索引
backwardu32上一个兄弟节点的 Block 索引
indices[TreePathIndex; count]key/value 对

TreePathIndex (每条 8 字节):

字段大小说明
valu32value Block 在 IndexStore 中的索引
keyu32key Block 在 IndexStore 中的索引

1.6 寻址流程


2. CAR 层 (Asset Catalog)

CAR 层建立在 BOM 容器之上,通过 6 个命名 BOM Tree 组织资源数据。CAR 层结构使用小端序 (Little-Endian)(ExtendedMetadata 除外)。

2.1 命名树一览

树名类型说明
KEYFORMAT单值属性类型定义 (KeyFmt)
CARHEADER单值文件头元数据 (Header)
EXTENDED_METADATA单值构建工具信息 (大端序)
APPEARANCEKEYS键值树外观模式映射
FACETKEYS键值树资源名称 → 属性 Token
RENDITIONS键值树属性组合 → CSI 渲染数据

2.2 解析流程

2.3 CARHEADER (文件头)

Magic: "RATC" (小端序)

字段类型说明
coreui_versionu32CoreUI 版本
storage_versionu32存储格式版本
storage_timestampu32存储时间戳
rendition_countu32渲染项总数
main_version_stringString(128B)主版本字符串
version_stringString(256B)版本字符串
uuid[u8; 16]唯一标识符
associated_checksumu32关联校验和
schema_versionu32Schema 版本
color_spaceColorSpace默认色彩空间
key_semanticsu32键语义

2.4 KEYFORMAT (键格式)

Magic: "tmfk" (小端序)

KeyFmt 定义了 RENDITIONS 树中键的属性类型序列,决定了每个渲染项的键如何被解析。

AttributeType 枚举 (u16):

名称说明
0ThemeLook主题外观
1ElementUI 元素类型
2Part部件
3Size尺寸类别
4Direction布局方向
6Value
7ThemeAppearance主题外观模式
8-9Dimension1/2维度
10State状态
11Layer图层
12Scale缩放比例 (@1x/@2x/@3x)
13Localization本地化
15Idiom设备类型
16Subtype子类型
17Identifier资源标识符 (用于索引渲染数据库)
20-21H/V SizeClass水平/垂直尺寸类别
24DisplayGamut显示色域
25DeploymentTarget部署目标

2.5 FACETKEYS (资源名称索引)

FACETKEYS 是一个 HashMap<String, KeyToken> 的树,将资源名称映射到属性集合。

2.6 RENDITIONS 树键值结构

RENDITIONS 树是 .car 文件的核心数据存储。

键结构:按 KEYFORMAT 定义的属性类型序列,每个属性值为 u16 (小端序)。

Key: [ThemeLook:u16][Element:u16][Part:u16]...[Identifier:u16]...
     ← 按 KEYFORMAT 中的顺序排列 →

值结构:CSIHeader + TLV 元数据 + 可选渲染数据 (详见第 3 节)。

查找流程

2.7 EXTENDED_METADATA

Magic: "META" (大端序 - 唯一的大端序 CAR 结构)

字段大小说明
thinning_args256BThinning 参数
deployment_platform_version256B部署平台版本
deployment_platform256B部署平台
authoring_tool256B构建工具信息

3. CSI 层 (Core Structured Image)

CSI 是单个渲染项的完整数据结构,包含元数据、TLV 扩展信息和实际渲染数据。

3.1 CSIHeader 布局

Magic: "ISTC" (小端序)

固定部分

字段类型说明
magic[u8; 4]"ISTC"
versionu32CSI 版本
flagsFlags位域标志 (32位)
widthu32图像宽度
heightu32图像高度
scale_factoru32缩放因子 (100=@1x, 200=@2x, 300=@3x)
encodingEncoding像素编码格式
color_modelColorModel色彩模型

CSIMetadata

字段类型说明
modification_timeu32修改时间
layout_typeLayoutType布局类型
nameString(128B)渲染项名称

BitmapList (紧跟 CSIMetadata 之后):

字段类型说明
bitmap_countu32位图数量 (通常为 1)
zerou32保留 (通常为 0)
rendition_lengthu32Rendition 数据长度

3.2 Flags 位域

H=is_header_flagged_fpo, E=is_excluded_from_contrast_filter, V=is_vector_based, O=is_opaque, BmpEnc=bitmap_encoding(4bit), O=opt_out_of_thinning, F=is_flippable, T=is_tintable, P=preserved_vector_representation

标志说明
0is_header_flagged_fpoFPO 标记
1is_excluded_from_contrast_filter排除对比度滤镜
2is_vector_based矢量图
3is_opaque不透明
4-7bitmap_encoding位图编码子类型
8opt_out_of_thinning不参与 Thinning
9is_flippable可翻转
10is_tintable可着色
11preserved_vector_representation保留矢量表示
12-31reserved保留位

3.3 Encoding (像素编码)

Tag (4字节)枚举值说明
\0\0\0\0None无像素数据
BGRAARGBBGRA 字节序 → RGBA (交换 R/B)
ATADData原始数据
YARGGRAY灰度 8位
GEPJJPEGJPEG 压缩
_FDPPDFPDF 矢量
PBEWWEBPWebP 压缩
WBGRARGB1616位 BGRA
61AGGA16灰度+Alpha 16位
_8AGGA8灰度+Alpha 8位
5BGRRGB5XRGB1555 格式
_GVSSVGSVG 矢量
FIEHHEIFHEIF 压缩

3.4 ColorModel / ColorSpace

ColorModel (u32):

名称说明
0None
1RGBRGB
2Monochrome单色
3RGB0RGB (变体)
4RGBP3Display P3

ColorSpace (u32):

名称
1sRGB
2GrayGamma2.2
3Display P3
4Extended Range sRGB
5Extended Linear sRGB
6Extended Gray
257System sRGB

3.5 TLV 元数据 (RenditionType)

TLV (Tag-Length-Value) 格式存储附加元数据,紧跟在 BitmapList 之后。

以上为单个 TLV 条目,CSI 中连续存放 N 个 TLV。

Tag名称数据内容
1001Slices九宫格切片信息 (x, y, w, h) × N
1003Metrics上右内边距 + 下左内边距 + 图像尺寸
1004BlendModeAndOpacityblend_mode: u32 + opacity: f32
1005UTI统一类型标识符 (如 "public.png")
1006EXIFOrientationEXIF 旋转方向 (0-8)
1007BytesPerRow行字节步长 (stride)
1010Reference内部引用 (magic "INLK" + 坐标 + 键)

3.6 Rendition 数据类型

Rendition 是 CSI 中的实际载荷数据,按 magic 标识区分类型:

RenditionColor (RLOC):

字段类型说明
versionu32版本
color_spaceColorSpace色彩空间
componentsVec<f64>颜色分量

RenditionThemeCBCK (MLEC - 最常见):

字段类型说明
versionu32版本 (0-3)
compression_typeCompressionType压缩类型
raw_datasVec<Vec<u8>>压缩数据块

3.7 CompressionType

名称说明
0Uncompressed未压缩
1Rle行程编码
2ZipZip 压缩
3LzvnLZVN 压缩
4LzfseLZFSE 压缩
5JpegLzfseJPEG + LZFSE
6Blurred模糊处理
7AstcASTC 纹理压缩
8PaletteImg调色板图像
9HEVCHEVC 视频帧
10DeepmapLzfseDeepmap + LZFSE
11Deepmap2Deepmap2 格式 (见第 4 节)

3.8 LayoutType

布局类型决定了渲染项的用途和展示方式:

范围类别示例
6-9特效Gradient(6), Effect(7), Vector(9)
10-12单部件FixedSize(10), Tile(11), Scale(12)
20-25三段式H-Tile(20), H-Scale(21), V-Tile(23)
30-34九宫格Tile(30), Scale(31), EdgesOnly(34)
40六段式SixPart
50动画AnimationFilmstrip
1000-1014语义类型Data, ExternalLink, Color, Texture…

3.9 Idiom (设备类型)

名称
0Universal
1Phone (iPhone)
2Pad (iPad)
3TV (Apple TV)
4Car (CarPlay)
5Watch (Apple Watch)
6Marketing

4. Deepmap2 图像编码

Deepmap2 是 Apple 的专有图像编码格式,支持 4 种解码模式:原始像素、有损预测压缩 (YCoCg)、无损压缩和调色板索引。

4.1 Deepmap2Header

Magic: "dmp2" (小端序)

偏移大小字段说明
0x004Bmagic"dmp2"
0x041Bdecode_type解码类型 (1-4)
0x051Bversion色度缩放标志
0x061Bpredictor_type辅助标志
0x071Bpixel_format像素格式 (1-4)
0x082Bwidth图像宽度
0x0A2Bheight图像高度
0x0C2Bpalette_size调色板条目数 (仅 Palette 类型)
0x0E2Bpalette_type调色板类型 (仅 Palette 类型)
0x10N×4Bpalette调色板数据 BGRA (仅 Palette 类型)

DecodeType

名称说明
1None原始未压缩像素
2DefaultLZFSE + Zigzag + 预测 + YCoCg
3LosslessLZFSE 压缩 (无预测)
4Palette调色板索引

PixelFormat

名称每像素字节说明
1G81灰度
2GA882灰度 + Alpha
3Rgb8883RGB
4Rgba88884RGBA

4.2 解码流程总览

4.3 Default 解码 (Type 2) 详解

这是最复杂的解码路径,使用 LZFSE 压缩 + 多流分离 + Zigzag 编码 + 空间预测 + YCoCg 色彩模型。

4.3.1 LZFSE 解压后的内存布局

其中 components = 3 (彩色, YCoCg 三通道) 或 1 (灰度)。

4.3.2 Zigzag 解码

将分离的高低字节流合并为有符号 16 位值:

combined = (lo as u16) | ((hi as u16) << 8)
magnitude = combined >> 1
value = if (combined & 1) != 0 { -magnitude } else { magnitude }

4.3.3 预测器算法

每行可独立选择预测器,有 5 种类型:

所有预测器以 3 个分量为一组 (PREDICTOR_GROUP_SIZE=3) 进行处理,对应 YCoCg 的 Y、Co、Cg 三通道。

Paeth 预测器 (简化版):

对每组 3 个分量:
  dist_left = |up[0] - up_left[0]|
  dist_up   = |left[0] - up_left[0]|
  若 dist_left <= dist_up: 整组使用 left
  否则: 整组使用 up

4.3.4 YCoCg → RGB 转换

co_scaled = Co << chroma_scale
cg_scaled = Cg << chroma_scale
temp = Y - trunc_div2(cg_scaled)

R = clamp(temp + co_scaled - trunc_div2(co_scaled), 0, 255)
G = clamp(temp + cg_scaled, 0, 255)
B = clamp(temp - trunc_div2(co_scaled), 0, 255)

其中 chroma_scale = 1 (header.version ≠ 0) 或 0。

4.4 Palette 解码 (Type 4)

调色板模式使用索引查表,支持两种子类型:

palette_type说明Payload 布局
3Alpha + 索引[alpha × pixel_count][index × pixel_count]
4仅索引[index × pixel_count]

调色板条目格式:u32 LE BGRA → 转换为 RGBA 输出。

4.5 KCBC 分块容器

大图像可使用 KCBC 容器将图像分块存储,每块独立编码。

以上为单个 KCBC Block,文件中连续存放多个 Block。

解码后按 (row, col) 网格拼合为完整图像。


5. 端到端数据流


6. Magic 字节汇总

Magic字节序层级说明
BOMStore-BOM文件头标识
tree-BOMB-Tree 头标识
RATCLECARCARHEADER
ISTCLECARCSIHeader
tmfkLECARKeyFmt
METABECARExtendedMetadata
RLOCLERenditionColor 类型
DWARLERenditionRawData 类型
MLECLERenditionThemeCBCK 类型
SISMLERenditionMultisizeImageSet
INLKLETLVReference 引用
dmp2LEDeepmap2Deepmap2 图像头
KCBCLEDeepmap2分块容器头

7. 字节序规则

层级字节序例外
BOM 容器大端序
CAR 结构小端序ExtendedMetadata (META) 使用大端序
CSI / Rendition小端序
Deepmap2小端序

参考链接

Built with Hugo
Theme Stack designed by Jimmy