Google Chrome Blog - The latest news from the Google Chrome team

GoogleはChromium Blog: Smaller is Faster (and Safer Too)およびSoftware Updates: Courgette ‎(Chromium Developer Documentation)において、Google Chromeのアップデート機能を改善し、従来よりもさらに小さいサイズでのパッチ配信が可能になったと伝えている。この新しい手順はCourgetteと呼ばれている。

Googleはブラウザのセキュリティを向上させる目的でChromeに自動更新機能を実装している。ほかのブラウザと異なり、基本的にユーザはこの機能を無効にできない仕組み。この機能を通じて安定版ではセキュリティアップデートが定期的に実行され、開発版では頻繁にアップデートが実行される。

アップデートで重要になるのは、どれだけ配信するパッチを小さく収められるかにある。サイズが小さければ、それだけ迅速に多くのユーザにパッチが配信できるため脆弱性への対処が迅速になり、通信帯域が細いユーザにとっても都合がいい。これまでChromeではこのバイナリパッチにbsdiff(1)/bspatch(1)を使ってきた。ほかのバイナリパッチよりもサイズが小さく、よく機能すると説明されている。bsdiff(1)/bspatch(1)はもともとはColin Percival氏によって開発されたFreeBSDのバイナリアップデートシステム「FreeBSD Update」で活用されているもの。

今回Googleは、bsdiff(1)/bspatch(1)を適用する前に、一旦プロダクトを逆センブラしてバイナリからコードに近い状態へ変更してからbsdiff(1)/bspatch(1)を適用するように、パッチ作成時に改善を加えたという。さらに差分が小さくなるように逆センブラした結果にさらに調整を加えることで、バイナリそのものにbsdiff(1)/bspatch(1)を適用した場合よりもパッチサイズの縮小化に成功したと説明している。

開発版の190.1から190.4へアップデートした場合のサイズの違いは次のとおり。bsdiff(1)のみを適用した場合よりもさらに縮小化されていることがわかる。

  • フルサイズ: 10,385,920バイト
  • bsdiff(1)のみ: 704,512バイト
  • Courgette: 78,848バイト

ソースコードでは数行程度の違いしかないものでも、コンパイルするとバイナリでは大きな違いが発生する。Courgetteの手法はバイナリパッチのサイズをさらに引き下げる方法として興味深い。