強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Macアプリをバイナリ差分でアップデートする

Windowsの場合には実行ファイルの差分データだけで実行ファイルの新しいバージョンにバージョンアップしてくれるパッチツールが有ったりしますがMacではその様なアプリを見かけません。

しかし、以前から頭の中では「Macだとああやれば出来るんじゃない?」考えていたものが有りました。

今日、ふとしたきっかけでそれを思い出しました。検証してみた結果上手く行ったのでやり方をご紹介。

サンプル

今回例としてバージョン1のアプリ「Example1.app」をバージョン1.1のアプリ「Example1_1.app」に差分データだけでアップデートしてみます。サンプルファイルをこちらに準備しました。

こちらを解凍し、2つのアプリを実行してみて下さい。それぞれ、Windowsにバージョン番号を表示するだけのシンプルなアプリだという事が確認出来ます。

example.bpatch はこれら2つをzipで固めたもののバイナリ差分情報が格納されています。このファイルを使ってバージョン1のアプリ(Example1.app)をバージョン1.1にしてみましょう。

手順

1. Example1.app をzipで圧縮して Example.app.zip を作成する。
2. 新規にフォルダを作成し、そこに作成した Example.app.zip とサンプルに同梱されている example.bpatch を移動させる。
3. ターミナルを開き、 そのフォルダに移動し、以下のコマンドを実行。

bspatch Example1.app.zip Example1_1.zip example.bpatch

4. 生成された Example1_1.zip を解凍し、実行ファイルを実行。
5. ウィンドウにバージョン1.1と表示されるのを確認。

自分で作成する場合

次にこのパッチ(差分)ファイルの作り方を説明します。

Macのアプリは見た目はファイルの様に振る舞っていますが実態はフォルダの中にバイナリやテキストファイルが混在しており、この部分が結構厄介だったりします。

その為、この厄介な部分を解消する為に一度zipにアプリファイル(.appファイル)を固めて差分を取ることにします。先程手順 1. で圧縮したのもその為です。

Example1.app 、 Example1_1.app をそれぞれ圧縮し、 Example1.app.zip 、 Example1_1.app.zip にします。

次に bsdiff を使ってバイナリの差分ファイル(パッチファイル)を作成します。 bsdiff をインストールしていない場合はMacPortsの場合は sudo port install bsdiff でインストール出来ます。

差分ファイルを実行するコマンドは以下の様になります。

bsdiff Example1.app.zip Example1_1.app.zip example.bpatch

※bsdiffコマンドの引数は 古いファイル 新しいファイル 差分ファイル となります。

これで差分ファイル example.bpatch が出来ます。

差分ファイルのパッチを適用する場合には先程の手順で紹介した以下のコマンドで実行します。ここで使っている bspatch についてはMacに標準で入ったいるみたいです(Snow LeopardとLionで確認)。

bspatch Example1.app.zip Example1_1.zip example.bpatch

一般ユーザに配布する場合には差分ファイルの(example.bpatch)を配布して実行して貰う事になりますが想定しているユーザがその様な操作が難しいと思われる場合にはAutomaterなどで同様の処理を「アプリを実行するだけ」か「アプリに現在のバージョンのアプリをドラッグ」するだけで動作するアプリを作成しておくのが良いでしょう。

注意点

(1) 今回、Macにインストール済みのzipを使う前提で解説しましたが将来、生成されるzipの仕様が変わり、出力されるバイナリに変更される可能性も考えられます。慎重に作るならzipコマンドを同梱するなどし、差分を取得した時とユーザ環境で既存バージョンのアプリを圧縮する時で差分が発生しない様にした方がより安全です。

(2) md5sum などハッシュチェックをし、確実にアプリが新しいバージョンに更新されたか確認しましょう。そして、ハッシュ値が異なってる場合には「バージョンアップに失敗しました」と表示させましょう。