plutilの-convert/-create/-extractなどのサブコマンドでは、plist(property list)のフォーマットとしてxml1とbinary1を指定する場面が多い。両フォーマットの違いをまとめる。
xml1はテキストのXML形式
xml1はテキストで読み書きできるXML形式のplistである。
$ plutil -create xml1 sample.plist
$ plutil -insert Name -string Sample sample.plist
$ cat sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Name</key>
<string>Sample</string>
</dict>
</plist>
人間がそのまま読み書きでき、git diffやgrepとも相性がよい。
binary1はAppleのバイナリ形式
binary1はAppleが定義したバイナリ形式のplistである。-convertで相互変換できる。
$ plutil -convert binary1 sample.plist
$ file sample.plist
sample.plist: Apple binary property list
先頭バイトを見ると、binary1で作成したファイルでも実際のマジックナンバーはbplist00である。plutil側の引数名(binary1)とファイル内部のシグネチャ(bplist00)は一致しない。
$ hexdump -C sample.plist | head -1
00000000 62 70 6c 69 73 74 30 30 d1 01 02 54 4e 61 6d 65 |bplist00...TName|
フォーマット名末尾の1はバージョン番号
xml1/binary1の末尾の1はフォーマットのバージョン番号である。現状はどちらもバージョン1のみが存在し、xml2のような表記は使えない。
ファイルサイズを比較する
同じ内容のplistをxml1とbinary1で比較すると、binary1の方が小さくなる。
$ plutil -create xml1 sample-xml.plist
$ plutil -insert Name -string Sample sample-xml.plist
$ plutil -insert Count -integer 3 sample-xml.plist
$ cp sample-xml.plist sample-binary.plist
$ plutil -convert binary1 sample-binary.plist
$ wc -c sample-xml.plist sample-binary.plist
270 sample-xml.plist
70 sample-binary.plist
340 total
XMLのタグや属性が不要な分、binary1はファイルサイズが小さく、パースも高速である。アプリに同梱されるInfo.plistなどは、ビルド時にxml1からbinary1へ変換されていることが多い。
参考
【plutil】-convertでplistのフォーマットを変換する\第一線のプログラマーの行動原理を学べる!/
