class-dump でバイナリからヘッダーファイルを抽出する。

Xcode Plugin プログラミング

Xcode のプラグイン作りに手を出してみると、フレームワークの非公開ヘッダーを入手したくなったりします。

そんなとき、バイナリファイルの内容をヘッダーファイルに抽出してくれる class-dump が便利でした。


Xcode のプラグイン作りに手を出してみると、Xcode を制御するのに必要なIDEKit.frameworkDVTFoundation.framework などといったフレームワークを使う必要が出てきたりします。

ただ、これらのフレームワークは搭載されている機能が公開されていなくて、ヘッダーファイルもありません。

そこでフレームワークに実装されているプライベートメソッドなどを抽出してヘッダーファイルを作成できるClass-dump というコマンドラインツールを使ってみることにしました。

Class-dump のインストール

Class-dumpclass-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

このようにすることで、指定したバイナリが持つ機能がヘッダーファイルに出力されます。