.carファイルとは何か
.carファイルはiOSアプリのアセット格納形式です。画像、色、アイコンなどが含まれています。つまり、Xcodeのアセットカタログ(.xcassets)がコンパイルされた結果です。しかし、Appleはそのフォーマットを公開していません。
具体的には、iOSアプリではAssets.carとしてバンドルに含まれます。また、tvOS、watchOS、macOSでも使われています。さらにCoreUI.frameworkが実行時にアセットを検索する仕組みです。そのため、開発者が直接触ることはほとんどありません。
.carファイルの内部構造
リバースエンジニアリングで内部構造が判明しています。まず、BOM(Bill of Materials)形式がベースです。これはNeXTSTEPから継承された階層型キー値ストアです。
具体的には、CARHEADER(436バイト)にバージョン情報があります。またKEYFORMATがレンディションの属性構造を定義しています。さらにB+ツリー構造でFACETKEYS、RENDITIONS、APPEARANCEKEYSが管理されています。つまり、効率的に大量のアセットを格納できる設計です。特にAPPEARANCEKEYSはダークモード対応に使われています。
レンディションとアセット型
レンディションとは単一アセットの特定の変種です。たとえば、@1x、@2x、@3xの解像度別やダークモード版です。各レンディションは36バイトのキーで一意に識別されます。また最大18の属性で特性が記述されます。
サポートされるアセット型は多様です。具体的にはJPEG、HEIF、ARGBなどのピクセル画像です。さらにLZFSEやHEVCなどの圧縮形式にも対応しています。加えて、名前付きカラーやベクターアセットも格納できます。
.carファイルの検査ツール
検査にはいくつかのツールがあります。まずApple公式のassetutilコマンドです。またAssetCatalogTinkererというmacOSアプリでアセットを閲覧・抽出できます。さらにWebAssemblyベースのブラウザパーサーもあります。つまり、サーバーにアップロードせずに検査可能です。
まとめ
Apple .carファイルは非公開フォーマットですがリバースエンジニアリングで構造が解明されています。特にBOM形式とB+ツリーによる効率的な設計が特徴です。したがって、アセット管理の最適化に興味がある方はAssetCatalogTinkererで中身を確認してみてください。
