【转发】
Android App Bundle是Google最新推出的Apk动态打包,动态组件化的技术,与Instant App不同,AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。
原理:资源选择性加载;动态下发组件库
优势:
(1)Size更小
(2)安装更快
(3)支持动态发布
限制:仅限于使用Android新应用发布格式和Google Play动态交付上传的应用,国内暂不支持
Android App Bundle原理
1.资源选择性加载
App Bundle将这些特性在多个维度进行拆分,在资源维度,ABI维度和Language维度 ……,然后按需组装Apk然后安装即可。
项目中可能会不同dp密度的图片资源文件,或者适配不同手机内核架构的SO库,通常打包方式是把这些全部打包进Apk文件然后装进用户的手机中;使用App Bundle,会事先检测目标手机的特性,根据目标手机特性,选择性打包有用的资源文件和SO库下发到目标手机进行安装。假设你是一个x86,xxhdpi的手机,那么App Bundle会帮你拼装好一个只有xxhdpi,so库只有x86的Apk,其他无关的都会剔除。
2.动态下发组件库(组件化实现)
App Bundles将一个apk拆分成多个apk,一般会被拆分为如下几个部分:
(1)Base Apk:首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk;
(2)Configuration APKs:native libraries 和适配当前手机屏幕分辨率的资源;
(3)Dynamic feature APKs:不需要在首次安装就加载的模块。
备注:
1.AAB并不是一个插件化框架,它利用的是Android Framework提供的split apks技术来完成的,而所有安装split apk工作均是通过IPC交由google play完成。所以,该方式仅限于使用Android新应用发布格式和Google Play动态交付上传的应用。需要充分考虑国内市场的支持程度。
2.兼容性问题
Api < 21的手机无法进行模块化,Google Play会对其进行Multiple Apks操作来进行下发操作。
AS版本要求 3.2以上( Build – Build Bundle(s) /APK(s) )
集成Play Core Library
动态组件的一些使用场景
1.语言包的动态下发
当Split 针对语言进行划分时候,用户下载的Apk仅仅只能下载下来一个Base Apk,包含他的当前系统语言,你可以将其他语言作为Dynamic feature下发给用户,做到语言包的动态下发
2.功能的动态下发
对于某些独立的feature,这其实跟之前的插件化方案有异曲同工之处,而且天然支持友好,动态下发业务需求能有效的减少包大小,增加启动速度,减少安装时间等等。