あなたの Mac アプリをシェイプアップしよう — Vacuous Virtuoso


更新頻度は高くないものの、かなりためになる 記事をアップしてくれる、Ankur Kothari 氏によるブログ Vacuous Virtuoso ですが、また面白い記事がアップされていました。

Mac developer? Clean up your appVacuous Virtuoso

Too many apps are shipped with debug symbols, uncompressed images, redundant files or generally useless rubbish that not only wastes users’ disk space, it ultimately ends up increasing the developer’s own bandwidth costs.

多くのサードパーティ製(…とこの記事では書いてあるけど、Apple 製のものは完璧なんだろうか)Mac アプリでは、そのパッケージングに問題があり、非圧縮の画像リソースや必要のないファイルで、ユーザーのディスクスペースを無駄にしていることが少なくないそうです。

それがどんなものかというと、記事で紹介されているものを挙げると、Finder 代替のファイルブラウザ Path Finder が、もとの 60MB から、簡単な処理で 30MB まで減らせる、といった具合。



How to

じゃあどうすればいいかというと、Ankur 氏が、4つにまとめてくれています。

  1. いらないものを消す
    • .DS_Store
    • Cocoa アプリなら、PkgInfo(Carbon アプリにしか関係ない)
    • nib ファイル内の:
      • classes.nib
      • info.nib
      • data.dependency
    • フレームワークを埋め込んでいるなら、その中のヘッダファイル
  2. ローカライズ用ファイル/フォルダを見直す
    • ローカライズに関係のないファイルは、各 .lproj フォルダに散在させず、Resources フォルダに置く(「関係ないファイル」というか、実際には同一なのに、手違いでローカライズ化してしまった Info.plist ファイルとか、僕はよくある 汗)
    • フレームワークを埋め込んでいるなら、自分のアプリがサポートしていない言語のローカライズ用ファイルまで入っていないか、ちゃんとチェックする。
  3. 画像リソースを圧縮する
    • TIFF 形式の場合には、特によく確認せよ、とのこと。
    • (簡単なグラフィックなら、NSBezierPath で描こうぜ!)
  4. バイナリをスリムにする
    • 「Debug」コンフィギュレーションでビルドしたアプリを公開しない(これは当然か)
    • デバッグシンボルを取り除く
    • できればユニバーサルバイナリだけでなく、各アーキテクチャ専用のバージョンも公開する。

今回ご紹介している記事は、ウェブサイト Rixtep記事 を Ankur 氏が簡潔にまとめられたものなのですが、その記事では、さらに多くの項目が挙げられています。

Rixtep の人は、どうもこの手のことに相当のこだわりがあるらしく、今回のようなパッケージングや、処理の効率性などに特に注目して(画面デザインや機能性についての話もありますが)、一部の Mac ソフトを完膚なきまでにこき下ろすレビューコーナー The Very Ugly は、作者さんの気持ちになるとちょっと涙が出ます。

自動化

いくらユーザーのディスクスペースを無駄にしないため、とは言っても、上記のような手順を、すべて手作業で行うのはとても面倒です。

そこで Ankur 氏が、これらの作業の一部を自動化する trim-app というシェルスクリプトを公開してくださっています。ダウンロードは、記事 中ほどの「 Download trim-app 」から。ダウンロードしたら、chmod 0700 trim-app しておきましょう。

trim-app の使い方

詳しい使い方は、trim-app -h で確認することができますが、基本的な使い方だけ書いておくと、(処理は取り消しできませんので、ご注意を)

% cd MyApp.app
% trim-app
Architecture to keep? (ppc/i386)

どのアーキテクチャ用のバイナリを残すか聞かれますが、ここでそのまま return すると、Universal Binary のまま。アーキテクチャを指定すると、もう片方のアーキテクチャ用のバイナリが削除されます。

trim-app を使うと何が起きる?

これを実行すると、

  • パッケージ内の .DS_Store を削除
  • nib ファイル(パッケージ)内の不要ファイルを削除
  • 不必要なアーキテクチャ用のバイナリを削除(指定した場合)
  • デバッグシンボルを削除

…が行われます。つまり、不必要なローカライズ用ファイル/フォルダ、フレームワークのヘッダファイルの削除などは、引き続き手作業で行う必要があります。

Kaku で試してみる

というわけで、さっそく Kaku(開発途上版)で試してみたのですが…

Before

After

これに加えて、一応 PkgInfo ファイルやフレームワークのヘッダファイルなども削除してみましたが、う〜ん…、そもそもちょっと前までフロッピーに入るサイズだったし、画像リソースは PNG 形式だし、一部で使っているカスタムデザインのコントロールも NSBezierPath で描いてるし(このためにじゃないけど)、Kaku に関しては、あまり絞れるところはないようです。

個人的な感想

冒頭で挙げた Path Finder の 60MB → 30MB が本当なら、日本より回線速度の遅い海外の事情も考えると、かなりひどい話ですが、ハードディスク容量も回線速度も上がった昨今、そこまでストイックに容量を節約しなきゃダメ…? と思うのも正直なところです(使わないローカライズ用ファイルを削除したり、使わないアーキテクチャ用ののバイナリを削るユーティリティーがあるけど、まったく使おうと思ったことがない。ただ Performa 630 時代は、常に涙目)。

ただ、そのアプリを使う側にとって、まったく関係のないファイルが大量に含まれている場合が(かなり)あるということを知り、驚きました。自分がアプリをリリースするときも(特にアプリの規模が大きくなってきたときには)注意しなければいけないな、と思いました。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です