大部分在应用商店上架过App或者进行过缩包优化的开发者可能都知道,在Android平台上,APK瘦身方面的优化手段其实不多,无非压缩资源、删除无用资源、代码混淆、在线资源库、微信压缩打包工具、插件化等,充其量只是一些裁裁剪剪,并没有从根本上解决安装包过大的问题。
但Google I/O 2018之后,这个问题可能不会再困扰开发者了,因为Google官方推出了一套堪称神器(事实上谷歌官方称它为artifact,就是“神器”)的编译、发布APK机制:Android App Bundles,直译为“应用束”。
事实上,一开始接触到App Bundles 这种机制,听到官方人员“夸夸其谈”的介绍(Youtube有介绍视频),尤其是了解到它存在的限制,比如需要加入谷歌的测试计划,版本限制(5.0以上),需要在谷歌商店的Play Console(应用控制台)注册自己的App,只能通过Google Play发布等,我是很嫌弃的,因为谷歌并不是没有这种雷声大雨点小的先例。
然而当我真的深入了解了Android App Bundles 和它的配套发布机制:Dynamic Delivery(动态交付),还是要说一声“谷歌爸爸真厉害”。
其实上面的限制在长期来看并不是问题,首先,5.0以上的Android app,支持App Bundles 和Dynamic Delivery,应用体积大大减少,而对于5.0以下的版本,Google也有相应的减少体积的方法,只是效果没有那么明显。其次,对于针对国内市场的开发者而言,以中国如此蓬勃的Android生态来看,恐怕不久各大应用商店会有类似的机制出现,因此提前了解好处大大滴有。
谷歌爸爸我错了
Android App Bundles
Android App Bundle是一种新的应用编译、上传、发布形式,它包括了开发者应用中所有编译过的代码、资源(例如图片、语言、字符串资源等)、屏幕大小、硬件架构等等。使用此种格式发布的应用,用户在应用商店看到的包的大小精简到极致。App Bundle需要配合Dynamic Delivery(动态交付)一起使用,原理在下文一起介绍。
新的发布机制
Dynamic Delivery
动态交付,是Google Play提供的新的app服务模块,配合App Bundle使用,可以针对不同用户的设备生成并提供优化过的APK。从而用户可以仅仅下载他们运行此App需要用到的代码和资源。开发者不再需要针对多种设备去编译,签名,管理不同的APK(Multi-APK机制),用户可以下载体积更小的,优化过的APK。
比如,一个英语国家,谷歌手机Pixel 2L的使用者,仅仅需要下载基础代码,xxxhdpi的资源,en的语言包,arm64硬件架构等,而不再需要其他不必要资源。
普通的apk发布流程:
普通的apk我普通地发
使用App Bundle + Dynamic Delivery的应用发布流程:
小小的apk
动态交付
动态交付的功能不仅限于此。开发者可以为应用的工程添加动态功能模块,包含在App Bundle中。这些模块包含了用户首次下载安装应用不需要用到的功能和资源。在集成了 Play Core Library 的SDK后,我们可以在之后请求用户去安装这些动态功能模块。通过动态交付,Google Play仅仅只会提供针对这台设备所需要的代码和资源(某种语言,某种分辨率的资源,对应的ABI)。
对于使用Android Studio开发的App,大多数工程很轻松就可以支持动态交付并建立App Bundle应用束。但动态功能模块还在测试中,支持这个功能可能需要对应用进行重构。
篇幅所限,本文章仅介绍了应用束和动态交付的机制和原理,假如有比较多的朋友关注和喜欢这项技术,我将在之后的文章继续分析它的实现方式、兼容性问题和翻译相关文档等。