节省数据流量:将应用程序更新的大小减少 65%

发布于 2024-12-13 12:47:10 字数 4356 浏览 5 评论 0

Android 用户正在 Google Play 上下载数以百亿计的应用和游戏。我们也看到开发者经常更新他们的应用程序,以便为用户提供出色的内容,提高安全性并增强整体用户体验。需要大量的流量才能下载这些更新,而且我们知道用户关心他们的设备使用了多少数据流量。今年早些时候,我们宣布开始使用 bsdiff 算法 (Colin Percival 发明) 。使用 bsdiff,与完整的 APK 大小相比,我们可以将应用程序更新的大小平均减少 47%。

今天,我们很高兴能够分享一种更进一步的新方法 - 逐个文件修补 。 使用逐个文件修补的应用程序更新 平均比完整应用程序小 65% ,在某些情况下,小于 90%。

与我们以前的方法相比,节省的成本每天可以节约 6PB 的用户数据流量!

为了获取应用的新版本,Google Play 会向你的设备发送一个修补程序,用于描述应用程序的旧版本和新版本之间的差异。

想象一下,你是一本即将出版的书的作者,并希望改变一个句子 - 告诉编辑更改哪个句子和改变什么,而不是发送一本全新的书更容易。以同样的方式,补丁比整个 APK 下载要小得多,速度也快得多。

文件修补程序中使用的技术

Android 应用程序被封装为 APK,这是具有特殊约定的 ZIP 文件。ZIP 文件(和 APK)中的大部分内容使用名为 Deflate 的技术进行压缩。Deflate 非常擅长压缩数据,但它有一个缺点:它使原始(未压缩)内容中的变化非常困难。即使是对原始内容的微小改变(如改变书中的一个词)也可以使压缩的压缩输出看起来完全不同。描述原始内容之间的差异很容易,但是描述压缩内容之间的差异是非常困难的,从而导致效率低下的补丁。

观察右侧的压缩文本从左侧未压缩文本中的单字母改变多少变化:

img

因此逐个文件基于检测未压缩数据中的变化。要生成一个补丁,我们首先在计算 delta 之前解压缩新旧文件(我们在这里仍然使用 bsdiff)。然后要应用补丁,我们解压缩旧文件,将增量应用于未压缩的内容,然后重新压缩新文件。在此过程中,我们需要确保设备上的 APK 与 Play 商店中的完全匹配(字节为字节)(请参阅 APK 签名架构 v2 了解原因)。

当重新压缩新文件时,我们遇到了两个复杂问题。首先,Deflate 有一些影响输出的设置; 而且我们不知道首先使用了哪些设置。其次,deflate 有许多版本,我们需要知道你的设备版本是否合适。

幸运的是,在对 Play 商店中的应用程序进行分析之后,我们发现基于 zlib(最流行的 deflate 库)的最新兼容版本的 deflate 几乎囊括了 Play 商店中几乎所有的收缩内容。另外,默认设置(level = 6)和最大压缩设置(level = 9)是我们在实践中遇到的唯一设置。

知道这一点,我们可以检测和重现原来的放气设置。这样可以解压缩数据,应用一个补丁,然后将数据重新压缩回原来上传的完全相同的字节。

但是,有一个权衡。设备需要额外的处理能力。在现代设备上(例如从 2015 年开始),每兆字节的再压缩可能会稍微超过一秒,而在较旧的或功率较低的设备上,压缩可能会更长一些。目前的分析表明,平均而言,如果补丁大小减半,那么应用补丁(对于逐个文件包括再压缩)花费的时间加倍。

目前,我们正在限制使用这种新的补丁技术来自动更新,即在后台进行更新,通常在晚上当你的手机插入电源,而你不太可能使用它。这可以确保用户在手动更新应用程序时,不必再等待更新才能完成更新。

逐个文件修补如何有效?

以下是已经使用逐个文件修补的应用程序更新示例:

应用原始大小上一个(BSDiff)修补程序大小(%vs 原始)文件的文件修补程序大小(%vs 原始)
Farm Heroes Super Saga71.1 MB13.4 MB(-81%)8.0 MB(-89%)
谷歌地图32.7 MB17.5 MB(-46%)9.6 MB(-71%)
Gmail 的17.8 MB7.6 MB(-57%)7.3 MB(-59%)
Google TTS(翻译)18.9 MB17.2 MB(-9%)13.1 MB(-31%)
Kindle52.4 MB19.1 MB(-64%)8.4 MB(-84%)
Netflix16.2 MB7.7 MB(-52%)1.2 MB(-92%)

免责声明:如果你在手动按下“更新”时看到不同的补丁大小,那是因为我们目前没有使用逐文件进行交互式更新,只有在后台执行的那些文件。

节省数据流量并使我们的用户(和开发者)高兴

这些更改旨在确保我们的超过 10 亿 Android 用户社区尽可能少地使用常规应用程序更新数据。最好的事情是,作为开发者,你不需要做任何事情。你可以免费获得这些缩减到你的更新大小!

如果你想了解更多关于文件修补的信息,包括技术细节,请前往 Archive Patcher GitHub 项目 ,你可以在其中找到信息,包括源代码。是的,逐个文件修补是完全开源的!

作为一名开发者,如果你有兴趣继续缩小 APK 大小,请参阅以下有关 缩小 APK 大小的一般技巧

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦里的微风

暂无简介

文章
评论
26 人气
更多

推荐作者

最终幸福

文章 0 评论 0

与酒说心事

文章 0 评论 0

┈┾☆殇

文章 0 评论 0

梦醒灬来后我

文章 0 评论 0

念﹏祤嫣

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文