class-dump でバイナリからヘッダーファイルを抽出する。
Xcode Plugin プログラミング
Xcode のプラグイン作りに手を出してみると、フレームワークの非公開ヘッダーを入手したくなったりします。
そんなとき、バイナリファイルの内容をヘッダーファイルに抽出してくれる class-dump が便利でした。
Xcode のプラグイン作りに手を出してみると、Xcode を制御するのに必要なIDEKit.framework
やDVTFoundation.framework
などといったフレームワークを使う必要が出てきたりします。
ただ、これらのフレームワークは搭載されている機能が公開されていなくて、ヘッダーファイルもありません。
そこでフレームワークに実装されているプライベートメソッドなどを抽出してヘッダーファイルを作成できるClass-dump
というコマンドラインツールを使ってみることにしました。
Class-dump のインストール
Class-dump
はclass-dump - Steve Nygard
からダウンロードできるようになっています。
現在は Version 3.5 が最新版のようなので、その DMG イメージ版をダウンロードします。
ダウンロードした DMG イメージをマウントすると、その中に "class-dump" という名前のファイルがあるので、これを Mac にインストールします。
インストールする場所はどこでも良いですが、今回は次のコマンドを実行して/usr/local/bin
ディレクトリにインストールすることにしました。
cp /Volumes/class-dump-3.5/class-dump /usr/local/bin
Class-dump で実装されている機能を抽出する
class-dump の使い方は簡単で、ターミナルでclass-dump
に続けてバイナリファイルのパスを指定すると、そのバイナリに実装されているプロパティやメソッドが画面に出力されます。
たとえばDVTFoundation.framework
の機能を抽出したい場合は次のようにします。
class-dump /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework
いわゆるプライベートメソッドなども出力されるので、ヘッダーが提供されているフレームワークであってもclass-dump
を通してみると、知らない便利機能が見つかるかもしれません。
ヘッダーファイルを抽出する
class-dump
に-H
オプションを指定すると、実装内容をヘッダーファイルとして出力してくれます。
そのままだとヘッダーファイルがclass-dump
を実行したディレクトリにたくさん生成されるので、他のファイルと混ざらないように-o
オプションを使って出力ディレクトリを指定すると良いでしょう。
存在しないディレクトリを指定した場合は、自動的に生成されます。
class-dump -H /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework -o DVTFoundation
このようにすることで、指定したバイナリが持つ機能がヘッダーファイルに出力されます。