アプリケーションはなぜ差異を計算して更新しないのでしょうか?

アプリケーションはなぜ差異を計算して更新しないのでしょうか?

私は Ubuntu コンピューターと Android スマートフォンを持っていますが、Ubuntu のデフォルトのアップデート マネージャーとスマートフォンの Google Play が、アプリケーションの既存バージョンと新しいバージョンとの差を計算して更新しないのはなぜなのか、いつも不思議に思っています。他のオペレーティング システムでも同じだと思います (この質問が Ask Ubuntu や Android 愛好家に載っていないのはそのためです)

例えば、最新のアップデート(マイナーリリース)を考えてみましょう。グーグルマップ(2012 年 4 月 18 日現在)。「新機能」セクションには、重大なバグ修正が含まれていると記載されています。多くのコードは変更されていないと想定しても問題ありませんが、アプリを更新すると、新規インストールの場合と同様に 6 MB を超えるサイズがダウンロードされます。

アップデート サーバーは、インストールされているバージョンとの差異を (git のように) 計算して、差異のみを送信できないのはなぜでしょうか。すべてのバージョンでそれを実行するのは本当に難しいことでしょうか。帯域幅の節約が大きな動機ではないでしょうか。

編集 2016年12月6日: GoogleはAndroid APKのアップデートにファイルごとのパッチ適用を採用すると発表しました。データの節約: アプリのアップデートのサイズを 65% 削減

答え1

差分のみを送信することでダウンロード サイズを最適化できるレベルが 3 つあります。

パッケージレベル更新されたパッケージのみを送信します。これはすでに実行されています。パッケージのダウンロード サイズを見ると、ほとんどのパッケージが非常に小さいことがわかります。したがって、これにより帯域幅が最大限に節約されます。

パッケージ内のファイルパッケージ内の変更されたファイルのみを送信します。パッケージ管理は、ファイルを固定の場所にコピーするだけではありません。システムに合わせて自動的に調整された構成ファイルもあります。手動で変更されている場合もあります。インストールされたファイルを最初にアップロードしないと、違いを確実に把握することは困難です。

内部ファイル差分特に大きなファイルはバイナリです。パッチを当てるファイルに、たとえばビルドタイムスタンプが異なるなどの小さな変更がある場合、バイナリファイル用の信頼性の高いパッチアルゴリズムを想像するのは困難です。一方、テキストファイルの場合、git によって適用される古い diff および patch アルゴリズムはおそらくうまく機能しますが、おそらく労力に見合う価値はありません。

もう 1 つの問題は、どの古いバージョンが更新されるかわからないことです。ユーザーは中間の更新をスキップしている可能性があります。もちろん、パッケージ マネージャーはサーバーに特定のバージョンとの diff を送信するように要求できますが、そうすると diff を生成するためにサーバーに大きな負荷がかかります。サーバーのメンテナーがそれを許可するとは思えません。

まとめ: 簡単に、そして確実に実行できることはすでに行われています。残りは、更新を小さく保つために小さなパッケージを作成するパッケージ マネージャー次第です。

答え2

基本的に、開発者にとっては技術的に難しいです。そして、帯域幅は安価です。というか、ユーザーが費用を負担します。

Google ChromeはChromeバイナリの増分アップデートの開発に多大な投資をしたhttp://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html

Fedora は、増分パッケージ更新を配布するために「デルタ RPM」を開発しました。面白いことに、私のコンピュータはネットワーク接続が高速ですがプロセッサが遅いため、実際にはインストールが遅くなります。

関連情報