全新发布格式对 Android 的未来意味着什么
Android 的开放性让它在前十年蓬勃发展、硕果累累。市面上有很多设备供用户选择,而生机勃勃的开发者生态系统也提供了各种各样的应用和游戏,让这些设备焕发出精彩活力。开发者都希望确保尽可能为用户提供最佳体验,并希望应用尽可能在所有这些设备上运行良好。开发者还希望尽可能吸引更多用户安装和持续使用自己的应用;而不希望因自己无法控制的原因导致用户卸载应用。到目前为止,Android 应用的发布和交付方式在上述所有方面都仍有改进空间。本文中,我们将探讨开发者面临的部分挑战,然后介绍 Google 正在采取哪些措施来提供相关帮助。
Android 的前 10 年
十年来,在 Android 上发布应用需要采取以下步骤:
- 第 1 步:在 IDE(例如 Android Studio)中编写应用的所有代码。
- 第 2 步:准备测试或发布应用时,将应用构建为 APK(Android 的应用格式)。在构建 APK 的过程中,需要使用应用签名密钥进行数字签名。为应用签名是指将唯一证书安全地附加到应用上,这种机制可确保只有您能够继续更新此应用的已安装副本。这种机制如何运作?在更新应用之前,Android 会始终先检查更新的唯一证书是否与设备上相应应用的唯一证书一致。稍后您就会明白我为何要在此说明这一点。
- 第 3 步:通过 Google Play 管理中心将已签名的 APK 上传至测试轨道。准备就绪后,便可将应用发布到正式版轨道,开放给用户安装。
- 第 4 步:每当有用户安装您的应用时,Google Play 便会将您上传的已签名 APK 原样分发到用户的设备上。
过去这些年来,这种做法确实一直运作得很顺利,用户每月通过 Google Play 安装的应用超过 80 亿个!但是,正如下文所讲,这种模式会让开发者面临的挑战越来越大,已经难以忽视。
“大”问题
问题在于:应用越来越大。实际上,自 2012 年以来,应用的大小平均已增大 5 倍。出现这种情况是可以理解的;开发者希望在应用中添加炫酷功能和新内容,让用户对自己的应用欲罢不能并保持业务不断增长。设备的性能越来越出色,开发者希望充分利用精彩的新功能。而且,由于设备生态系统变得越来越多元,因此开发者会复制应用中的代码和资源,让应用在大小屏幕以及任何 CPU 上都能运行良好。
如果每位用户都拥有无限存储、无限数据流量和极快的网速,那么应用变得越来越大也无关紧要。遗憾的是,事实并非如此(或许将来可以实现!)。看上图,您就会发现 Google Play 上应用的大小与其安装转化率呈负相关。也就是说,应用越大,安装成功率就越低。出现这种情况的原因有很多。很多用户的设备上没有足够的可用空间。这会影响到设备存储空间不大的入门级设备用户,以及会在设备上存储照片、视频和其他媒体内容(这些内容的质量也越来越高,因此在每台设备上占用的空间也越来越多)的高端设备用户。用户也不想为了使用较大的应用而用光昂贵的数据套餐流量及等待缓慢的网络连接,尤其是在新兴市场。
我们不仅知道应用较大会导致安装率下降,我们的用户研究还表明,应用大小也是导致用户卸载应用的主要原因,因此对于注重留存率的应用而言,应用大小这项因素的重要性日益凸显。对于注重留存率的应用而言,应用大小这项因素越来越重要。请想想您自己的经历。在您尝试安装某个应用时,是否看到过来自 Google Play 的警告,提示您卸载不使用的应用来释放空间?每天都有数百万用户会看到此类警告,而在面临选择时,他们通常会卸载最大的应用和游戏。从 Google 相册投放的一条有趣的广告中,可以看出这个问题有多普遍。Google Play 去年开展的一项用户问卷调查表明,用户卸载已安装至少一个月的应用和游戏的主要原因就是为了释放空间。
需要说明的是,上述问题目前其实有一个差强人意的解决方案。现在,您可以在一个版本中为各种设备配置构建多个不同版本的 APK 并指定版本号。但如果您需要针对屏幕大小、CPU 架构(包括 32 位和 64 位)等方面进行优化,则情况会很快失控。最终甚至可能需要为每个版本构建数百个 APK。这种做法很麻烦,因此大多数开发者都不会这么做。很多开发者会将所有内容都放在一个“臃肿”的 APK 中,结果导致用户的设备上存放了许多用不到的重复内容。即使开发者使用多个 APK,也无法针对语言进行优化。您需要在每个 APK 中包含适用于每种设备的所有已翻译字符串,即使用户只需要一两种语言也是如此,而这会浪费更多空间。
因此,目前现有的方法并不理想:如果增加应用大小,就会带来转化率降低和卸载率增加的风险;如果使用多个 APK,不但麻烦,还会导致发布效率降低;如果想避免增加应用大小,就得花很多时间在各项功能之间权衡。
“小”解决方案
Google 不希望开发者做出这些妥协,因此我们一直在努力寻找更好的方法。我们的想法大致如下:开发者将需要的所有内容都上传到 Google Play,然后 Google Play 负责根据每位用户和每种设备的需求提供所需内容。这很简单,对吧?该流程可以减少开发者为支持 Android 的多元化生态系统需要做的工作和投入的精力,而且可以减小为用户提供的应用大小。正如本文稍后会提到的,这种新模式还有助于改善用户获取过程(从发现和安装到借助功能和更新吸引并留住用户)。
缩减安装大小
为实现这一愿景,Google 今年早些时候推出了新的应用发布格式 Android App Bundle。下面详细说明了该格式的运作方式:
- 第 1 步:照常在 IDE(例如 Android Studio)或游戏引擎(例如 Unity)中编写应用的所有代码。
- 第 2 步:现在,准备测试或发布应用时,将应用构建为 Android App Bundle(新的 Android 应用发布格式)。您仍然需要为应用签名,以便 Google Play 可以验证应用是您提供的。
- 第 3 步:如果您还没有为应用签名,可以选择加入 Google Play 应用签名计划。如果您正打算发布新应用,在上传应用时点击一下即可加入。选择加入该计划后,Google Play 会将您用于为 app bundle 签名的密钥指定为“上传密钥”。此密钥仅用于识别身份,保障安全;如果您丢失了该密钥,可以与 Google 联系来验证您的身份并重置密钥。对于现有应用,您需要访问 Play 管理中心内的应用签名部分,然后将您的应用签名密钥转移到 Google Play。为什么需要这么做?继续查看第 4 步即可找到答案。
- 第 4 步:将 app bundle 上传到 Google Play 后,Google Play 会进行处理,并针对您可能支持的每种设备配置和语言生成已用应用签名密钥签名的拆分 APK。拆分 APK 是在 Android L 中推出的一项 Android 平台功能。只要每个拆分 APK 使用的签名密钥相同,Android 平台就会将它们视为一个应用。您可以将拆分 APK 看成 APK 的“零件”:要运行应用,设备会将这些“零件”组合成“完整”的应用。
- 第 5 步:用户安装应用时,Google Play 会提供基本 APK(即每种设备都通用的所有代码)、语言拆分 APK(针对用户所讲的语言)以及设备配置拆分 APK(包括针对各种设备屏幕大小和 CPU 架构的拆分 APK)。
- 这意味着,设备只获取所需内容,而不会浪费空间存放不必要的内容。要让设备接受更新,必须使用原始应用安装所用的应用签名密钥为每个版本的拆分 APK 签名。
这一新模式可以大幅缩减应用大小,减少下载时间较短,并节省应用在设备上占用的空间。您向用户提供的应用更为高效,其中不包含用户用不到的代码和资源。对于大多数开发者来说,切换构建环境也很简单。在 Android Studio 中构建 app bundle 的流程与构建 APK 大致相同。使用 Unity 的游戏开发者也可以使用 Unity 的 2018.3 测试版及更高版本构建 app bundle。Android App Bundle 采用开放源代码且向后兼容(对于 Android L 之前的版本,Google Play 会针对每种设备配置生成包含所有语言资源的 APK,而不是使用拆分 APK)。
我们改用 app bundle 后,在一个小时内就上传了第一个内部版本。
Swiggy ▼23%
数以千计的热门应用开发者都会在正式版发布阶段使用 app bundle。使用 Android App Bundle 的开发者使 APK 大小比过去发布的“通用 APK”(包含支持 Android App Bundle 支持的所有设备配置和语言所需的所有内容)缩减了 35% 左右。更重要的是,对于需要管理每个版本的开发者来说,采用新格式后,就不再需要使用多个 APK。Google Play 负责针对各种设备配置进行优化,让您的工作更加轻松。Play 管理中心很快就会支持上传 APK 安装大小达 500MB 的大型 app bundle,让您在大多数情况下都无需使用扩展文件。
app bundle 可让我们节省时间,因为我们不必使用多个 APK 了。
RedBus ▼22%
这种新模式和新发布格式的优势之一是,Google Play 可以在 APK 生成过程中引入优化功能,让您节省时间和精力。例如,我们刚刚宣布了一项功能:支持未压缩的原生库,这是在 Android Marshmallow 中推出的一项很少使用的平台功能。使用 app bundle 的开发者无需进行任何额外操作即可获取这项功能。
在 Android M 之前,应用中包含的任何原生库都必须从每台设备上的 APK 解压缩。这意味着,每台设备上都会有已压缩副本(位于 APK 中)和未压缩副本这两种副本,非常浪费设备空间。从 Android M 开始,系统可直接从 APK 中读取处于未压缩状态的库,因此可以在设备上节省一个副本的存储空间。Google Play 在下载期间压缩 APK,通常比在 APK 中压缩原生库更高效,因此总体下载大小也会更小。所有应用都可受益于这项功能,Google Play 对大小的限制也在发生变化,限制针对的是用户下载的已压缩 APK 大小,而不是您上传至 Play 管理中心的应用大小。平均来讲,仅这一项优化,就可以将使用原生库的应用的下载大小缩减 8%,将安装到设备上的大小缩减 16%。这个缩减幅度是相当惊人的,毕竟,应用大小在改用 app bundle 时就已经得到缩减!
在开始使用 Android App Bundle 之前,我们的应用中包含 20 多种语言资源,不仅增加了应用的大小,而且明显降低了从访问到安装的转化率。
Riafy ▼37%
就像前文所说,应用必须选择加入 Google Play 应用签名计划才能使用 app bundle。应用签名密钥机制可以确保用户安装应用后,收到的更新始终来自同一开发者。Google 并不会因为持有密钥而获取额外访问权限或开发者的识别信息。密钥仅用于给用于安装和更新的拆分 APK 签名。Google 非常重视安全,为保护开发者的密钥,Goolge 配备了专门的工程师团队和先进的基础架构,存储这些密钥的空间也与 Google 用来保护自家应用密钥的安全密钥存储库相同。事实上,对于大多数开发者来讲,与自己持有密钥相比,选择加入应用签名计划,然后使用上传密钥(与 Google 持有的应用签名密钥不同)为每个版本签名更加安全,可以避免密钥丢失或被盗用。如果您未选择加入应用签名计划,而又丢失了自己的应用签名密钥,则无法更新您的应用,而且很遗憾,我们也无法提供任何帮助。
动态功能
Android App Bundle 的另一项重要创新是模块化设计。这意味着,您能够采用模块来包含那些可按需加载的其他应用功能,如何再将这些模块添加到应用中。这有助于解决前文中提到的会导致应用变大的另一大原因:功能增加。现在,您可以添加更多功能,而不会增加应用的安装大小。动态功能可让您安全地在 Android 上动态加载代码,因为系统扫描和检查动态功能模块的方式与 Google Play 保护机制扫描和检查应用本身的方式相同。
所有应用功能都可包含在动态功能模块中并按需提供。动态功能的编码方式与应用相同,适合用于以下情况:
- 安装时不需要的大型功能:您可以按需加载这些功能,或要求 Google Play 延后安装这些功能,也就是在后台安装。通过这种方式最多可加载 100MB 的功能。发布时不属于应用体验核心的高级功能或插件都适合使用动态功能模块,例如面向付费用户提供的付费功能、个性化选项、AR 功能等。
- 针对特定受众群体打造的功能:有些功能可以归为动态功能,不需要提供给所有使用您应用的受众群体。例如,开发者可以将商务应用中的销售功能单独放在动态功能模块中,让所有用户安装时仅获取购买功能。少数需要使用销售功能的受众群体则可以在需要时下载和使用这项功能。有些开发者还在探索如何利用动态功能来避免为仅有细微差异的受众群体单建一个应用变体的情况。换言之,他们希望能整合并提供一个应用,将针对各种受众群体量身定制的功能移到动态功能模块中。
- 很少使用的功能:另一种很适合使用动态功能模块的功能,是很少使用或只会使用一次的功能。例如,如果您的应用会进行一次性 ID 验证或信用卡扫描,可以在需要时加载此功能并在使用后立即卸载,这种有效率的做法可以避免增加应用的安装大小,而且还可以避免应用整个生命周期内不会用到的功能占用空间(请谨记,应用越大,就越有可能被用户卸载)。
用免安装体验提高曝光率
前面已经介绍了 Android App Bundle 如何帮您缩减应用大小,以及如何通过动态功能打造高度可配置的应用。Android App Bundle 还支持免安装应用。Google Play 免安装体验可让用户在安装完整应用或游戏之前,先通过 Play 商店、广告和链接中的立即试用按钮试用应用及试玩游戏。免安装应用目前已有 12 亿台设备在使用,并已经证实可有效提升曝光率和安装量,从而吸引那些原本可能不会安装应用的用户。Vimeo 是众多借助 Google Play 免安装体验获得成功的合作伙伴之一,他们表示有 15% 的新安装量来自于免安装体验。
过去,由于独立版本和发布流程等问题,采用免安装应用对于部分开发者而言并非易事。现在有了 Android App Bundle,开发者便无需再构建和维护单独的免安装应用。改为使用 app bundle 以后,您可以添加一个模块作为免安装应用的入口点;或者,如果您的应用足够小,则只需将基本模块启用为免安装应用即可。若要在 Play 商店和网页横幅中启用立即试用按钮,您应用的基本模块加上免安装应用模块的大小不得超过 10 MB。免安装应用只能请求支持的权限。如果您的安装版应用使用了其他权限,请在免安装应用中妥善处理权限相关问题,以确保用户获得良好的体验。
我们并不是说每个应用都可以轻松将大小缩减到 10MB 以下。大幅缩减应用大小的方法有很多,使用动态功能模块逐步加载功能只是其中一种。这一大小上限仅适用于将免安装的 app bundle 推送至正式版发布阶段时,因此您可以在将应用缩减至大小上限之前进行测试。如果您能够进一步缩减基本模块和免安装入口点模块的大小,使其低于 4 MB,就可以激活更多免安装位面,例如 Google 搜索以及通过电子邮件或社交媒体等分享的任何网页链接。使用 Android Studio 3.3 测试版,可以为您的免安装应用和安装版应用构建一个 app bundle。
可更快速地进行更新
最后,我想谈谈如何让用户的应用始终保持最新版本。吸引并留住受众群体的最后一步,就是确保您为他们提供了所有最新功能和修正程序。虽然很多 Google Play 用户都已开启自动更新功能,但也有很多用户并未开启,还有一些用户无法经常连接到稳定的 Wi-Fi 网络,以至于无法确保所有应用都是最新版本。新的 In-app updates API 可让您检测何时有可用的更新,并且集成了一个可自定义的内嵌更新流程,其外观和使用体验与应用的风格相符。当系统检测到更新时,您可以通过提示通知用户,请他们立即进行更新,或一次只针对一项弹性更新显示,并以您选择的方式进行更新。
立即更新流程适用于您希望用户尽快应用的关键更新,例如安全修复程序或隐私权增强更新。用户在应用中接受此类更新后,系统就会下载和应用更新,然后重启应用。弹性更新可自定义的程度更高。用户接受此类更新后,系统会在后台下载更新。下载完成后,您可以提示用户重启应用,也可以选择在应用进入后台时应用更新。
Google Chrome 目前正在测试 In-app Updates API。要获得较高的更新率,最好清楚地告诉用户更新的好处,如果可以,可让系统在用户完成工作之后再提示执行更新,而不是在用户刚打开应用时提示。用户通常是有想做的事才会打开您的应用,此时他们并不想等待应用更新后再继续使用。
更小、更好、更快、更新
我们所做的这些努力旨在通过缩减应用大小和简化应用版本,来帮助您增加安装量及减少卸载量。Android App Bundle 还可通过动态功能和免安装体验支持高度可配置的应用,从而增加转化次数。最终让用户的应用保持为最新版本也变得更简单了。改为使用 Android App Bundle 非常容易,您可以前往 g.co/androidappbundle 开始使用,也可以前往 Google Play Medium 博客阅读这篇文章和其他相关文章。未来 10 年,让我们共同见证 Android 生态系统的成长与成功!