编者按:本文来自微信公众号“三易生活”(ID:IT-3eLife),作者:三易菌,36氪经授权发布。
不久前,在海外科技媒体GSMArena关于手机存储空间的调查中,绝大多数参与者友认为他们的下一部手机需要有128GB和256GB的空间。但这一结果就在4年前,主流观点还是只需要64GB就够了。
其实关于这个问题,用“安迪-比尔定律”来解释非常恰当,就是硬件提高的性能很快被软件消耗掉,而整个问题其中一个很重要的原因,就是APP的体积越来越大,曾经小巧玲珑的APP已经非常少见。随着APP的体积越来越大,下载与安装的速度自然也就越慢,首次运行时对于硬件的压力同样也就越大。
以微信这个国民级APP为例,在其诞生的2011年,还只是一款功能非常简单的社交软件,但如今的微信却已经是一个集聊天、直播、视频、小程序等众多功能的超级APP。并且由于微信这类超级APP的不同组件或框架往往都是独立开发,如果将每一个额外的组件都整合在一起势必还会产生额外的开销,而代码量的增大也就意味着APP体积会越大。
面对这一情况,谷歌在Play商店上选择使用基于大数据的全新安装方式,来加快APP安装、打开和首次运行的时间。日前来自开发论坛XDA的消息显示,谷歌这项新技术将被命名为“App install optimization”,并且是一项可选功能。在其被开启后,将会收集每一位用户即将安装APP的相关数据,并会监视用户使用APP的哪些部分,以及哪些部分未被使用,从而形成大数据来判断APP解压运行后最重要的一部分文件是哪些。
例如当用户首次下载Instagram这个图片社交软件时,可能会花上十分钟来设置自己的个人资料并找到朋友。如果大量用户属于这种情况,那么Play商店会先下载Instagram的对应部分,而发帖或故事查看功能模块则将暂时不被安装,直到用户尝试使用它们或网络连接情况良好时才会继续安装。目前,Play商店的25.5.13版本中已经引入了App install optimization功能,但尚不清楚其将于何时正式启用。
这也就意味着,谷歌希望通过尽可能收集Play商店用户下载APP的文件信息,来整理出不同类别APP在首次打开时所需要的文件,并从中总结出相应的规律。并且谷歌方面也已经表示,这一功能将不会收集用户的任何隐私数据,例如电子邮件地址、姓名和本地存储内容等。
那么谷歌是如何实现这个苹果App Store都还没有用上的功能呢?要知道,Android应用尽管是以Java之后的Kotlin作为官方开发语言,但准确来说Android并不一定要用Java来开发,只是用Java更快更方便而已。例如知名的2D手游引擎Cocos2d-X,其实就是使用C++写逻辑,然后利用NDK进行交叉编译成为APK文件。
开放的开发环境造就了Play商店乃至国内安卓渠道中的应用,最终都是以APK文件呈现,但其背后所使用的开发技术却可以说是五花八门。所以在这样的情况下即便是有大数据与强力算法,要从如此繁杂的APP中找出规律,可以说是无异于天方夜谭。
事实上App install optimization得以问世的背后,是谷歌在2018年推出的一种名为Android App Bundle的全新应用程序打包方式。在经过了两年多的推广后,让Play商店上的APP上传逐渐有了标准化的趋势。
在Android App Bundle这一打包方式逐渐成为潮流后,APP的打包也成为了模块化、标准化的形式。众所周知,大数据虽然看上去非常高大上,但在最基础的数据标注、数据获取、特征提取、模型设计和训练上,还是需要人工打标签的方式来实现。而所谓的“数据标注员”,就是生产大量可供计算机深度学习训练数据的职业,这是一项非常要求重复性机械式的枯燥工作。
显而易见,让谷歌自己来雇佣庞大的人力完成Play商店上APP的数据标注,无疑是不现实且不经济的,所以Android App Bundle就是其利用在Android的领导地位,以及Play商店在应用分发上的垄断地位,所提出带有半强制性的措施。并且Android App Bundle与传统应用打包模式最大的不同,就是前者可以将APK生成及签名交由Play商店而不是开发者来完成,开发者就无需再编译、签署和管理多个APK,以支持各种不同的设备。
以往用户从应用分发渠道中拿到的APK包,其实是一个涵盖了针对不同屏幕、SoC的整合包,开发者需要将不同屏幕大小、SoC型号、语言等资源都打包到APK中,即便你的手机不需要非中文及低分辨的相关资源,同样也需要下载。但在使用Android App Bundle这一机制后,开发者就能实现“千机千面”的专属App Bundle(应用束),使得APK的体积有着显著的缩减。
Android App Bundle是谷歌推动模块化应用开发技术的组成部分,它可以将一个传统的APP拆分成三个不同部分。这三部分则分别为,包含了提供应用基本功能的Base APK、适配当前手机屏幕分辨率资源的Configuration APK,以及包含应用中某项功能代码和资源的Dynamic feature APK。
这就使得用户在Play商店下载一个通过Android App Bundle方式打包的应用时,只会下载Base Module对应的APK文件,此后如果用户要用到其他功能,系统就会指挥相关APP使用Dynamic Feature Module(动态特性模块),用类似网络游戏中玩家到了某个新地图才开始下载地图资源一样,下载这个APP的其他功能。
所以在这一技术的加持下,用户下载APP时,Play商店的新动态机制就只会传输适配设备的专属代码和资源。而Play商店中看到的安装包体积越小,下载速度自然也就越快,同时也节省了设备的存储空间,并且开发者甚至可以实现按条件分发应用,让一些组件排除在一些设备的初始安装之外,避免将无用功能安装到用户的手机上。
有了模块化的应用打包方式,Play商店自然就能更明确地找出APP的共性,进而发现哪些功能是用户最希望率先体验的,并最终优先加载相应的模块。不过考虑到国内安卓分发渠道中还没有Play商店这样的渠道存在,并且各渠道方也未必有意愿做这样在开发者层面吃力不讨好的工作,所以国内用户想要体验到如丝般顺滑的应用安装与首次打开速度,可能就只有能等国内手机厂商使出“神优化”了。