分享好友 最新动态首页 最新动态分类 切换频道
AAB 扶正!APK 将退出历史舞台
2024-12-27 02:28

令我惊讶的是,这样一条“旧闻”最近却被炒得沸沸扬扬,原来竟还是因为蹭了鸿蒙的热度

要知道 AAB 的首次亮相是在2018年的 GoogleI/O 上,难道彼时谷歌就遇见到鸿蒙的出现了

不过客观来说,AAB 虽然早已出现,但在国内很少被提及,因此造成部分媒体的错误解读也有情可原。那么本文就为大家做一个关于 AAB 的科普,打消鸿蒙支持者们的顾虑。



Android App Bundle(简称AAB) 是 Google 2018年推出的一种动态化的打包方式。当应用程序以 AAB 的格式上传 Google Play(或其他支持 AAB 的应用市场)后,可以根据不同用户实现 features 或者 resources 的按需下发。Google Play (简称GP) 目前提供的动态化服务都是基于 AAB 实现的(不少文章说这些服务是 AAB 的,这种说法不严谨,准确的说是 GP 的

  • Play Feature Delivery(PFD) :借助 AAB 实现 Feature 的按需动态加载,这类似于国内流行的“插件化”技术
  • Play Asset Delivery (PAD) :借助 AAB 实现一些资源素材的按需动态下载,这特别适合一些游戏类APP,无需为了适配所有机型保留全部游戏素材

除了游戏资源以外,对于常规资源,AAB 也可以做到按需下发。例如无需同时存在 hdpi、xhdpi 等多套图片,不少 APP 因此在包大小方面有显著提高

更小的包体积意味着更高的装机率,这在用户推广成本激高的今天至关重要



解压后的 AAB 中的内容和 APK 很相似,但又有不少区别

aab fielsdescriptionsbase/feature1/feature2base 是应用的基本功能,feature 承载各 DynamicFeature 的内容(后文介绍)manifest.xmlAPK 中只有一个 manifest 且是二进制格式,AAB 会存在于每个模块中e中,且使用 ProtoBuf(pb)格式,便于处理dex与 APK 不同,AAB 将每个模块的 dex 文件存储在各自目录中res/assets/libs该目录与 APK 中相同,当上传 AAB 时,GP 会检查这些目录并仅打包满足目标设备需要的最小文件resources.pb类似于 resource.arsc 文件,是一个资源索引表,其中描述了应用程序内部存在的资源和目标的细节,可用于 GP 针对不同设备配置 APK。assets.pb相当于应用程序 assets 的资源表,可用于 GP 针对不同设备配置 APK。例如将 assets 资源放到 assets/languages#lang_xx 或 assets/i18n#lang_xx 路径下,则会根据语言配置下发 assets 资源。native.pb这相当于native库的资源表,可用于 GP 针对不同设备配置 APK

后三个文件是 AAB 格式的重要部分,它们描述了 APP 的不同服务目标,动态下发根据这些目标从 、 或者 等路径中组织不同资源进行下发。



Split APKs 机制是 AAB 实现动态下发的基础,它允许将一个庞大的 APK 按不同维度拆分成独立的 APK,当用户在 GP 下载应用时,Android Framework 通过 IPC 与 GP 通信,为当前设备匹配并下载最小构成的 APK, 这只在 Android 5.0 以上的设备才有效。

AAB 上传后,GP 通过分析找出所有设备的共同资源, 生成一个 Base APK,当用户下载应用时,Base APK 将被首先安装。

GP 又根据、、 等三个维度,分别生成 Configuration APKs(Splits, Splits 与 Base 共享 versionCode 、packageName等,在进程管理器中以一个应用的形式存在。

当用户从市场下载应用时,GP 根据设备类型,为其下发不同的 Splits,实现最小化下发。

如下图,针对三种不同设备下发不同 Splits

当用户的设备发生 Configuration Changed (比如切换了系统语言)时,GP 会下发新的 Splits 到手机,如果此时手机不在线会等待下次上线时自动下发。

Split APKs 的这种动态下发只能用于 Android 5.0 以上设备,对于更旧的设备,AAB 会根据 这些 Splits 的矩阵生成多个 Standalone 的 APK,虽然缺少了动态下发的能力必须一次安装到位,但是相对于传统 APK 仍然减小了一定包大小。

作为开发者,我们无需关心这些具体的下发策略,只需要向市场上传一个 AAB ,后续就交给 FW 和 GP 去处理了。



打包 AAB

使用 Android Studio 可以方便地打包 AAB

此外,也可以使用 Gradle 命令打包,这更适用于一些 CI 流程中。

如下使用 gradle 打包一个 debug 版的 AAB

 

如果要生成 release 的 AAB 需要配置签名,与 APK 的配置方式是一样的。

AAB 默认会为三种 Configurations 都生成 Splits,当然你可以根据需求自己配置

 

上传应用市场

生成 AAB 后就可以上传应用市场了,GP 中上传 AAB 和 APK 的入口在一起,当然 8 月以后就没有 APK 的上传入口了。

AAB 上传后,通过后台可以查看其详细信息

例如可以查看 AAB 支持的屏幕密度,以及包体积的减少等信息



AAB 是无法直接安装到手机的,如果想本地对 AAB 做测试,需要将 AAB 转成 APK,这需要使用 Google 官方提供的 Bundletool 工具

Bundletool 可以获取当前设备信息

 

设备的 Configurations 信息输出到指定 json 中

 

Bundletool 根据 json 生成 中间文件

 
 
 

apks 的产物分为 和 两个目录,splits 是按照 Configuration维度拆分的 Split APKs,必须依赖 base.apk 一起安装;standalone 必须独立安装,这是为了兼容 Android 5.0 以下的版本。

是 apks 的存档清单,包含 APK 集合信息的描述文件

然后再根据 json 文件,从 apks 中提取 apk

 

最后,通过 Bundletool 将 apk 安装到手机上。 注意该命令实际安装 apk 并非 apks

 

总结一下 Bundletool 生成 APK 的整体流程



除了下发 Configuration APKs,还可以以业务模块为单元“插件化”地动态下发,也就是所谓的 Dynamic Features(简称 DF

IDE 中选择 New 一个 DF 的 Module

点击 next,选择 DF 的安装时机,例如一次安装到位或是按需安装

创建好的 DynamicFeature Module, 目录和一个普通的 Gadle Module 类似

但是 build.gradle 中 plugin 有所不同

 

build.gradle 中也无需配置 、、等,DF 本质上也是 Split APKs,所以共享 Base APK 的这些信息。

此时再打开 app/ 的 build.gradle,会发现多了如下配置

 

这是 APP 当前支持的所有 DF 的声明

最后,DF 的 Manifeset 也发生了变化

 
  • dist:delivery: 在创建 Dynmaic Feature 的 Module 时选择的下发方式, onDemand 表示方式为按需下发
  • title:当用户确认下载 Module 时,标识相关名称
  • fusing include:设为 ture,意味着 5.0 以下的设备可以以 multi-APK 的形式安装此 Feature,此时必须设置为 onDemand 方式。


当应用支持 DF 之后,我可以按需的请求并安装这些 Features,这需要集成 Play Core SDK

 

Play Core 允许用户通过交互的方式请求 DF 的下载安装,并监听下载状态

发起下载请求

DF 的下载需要借助

 

创建 , 请求下载 Module

 

可以多次调用,添加多个请求的 DF

使用 启动 Request 进行请求,并设置回调监听为下载状态

 

调用后会立即发起请求。另外还可以使用 延迟请求, 当应用切到后台启动时才开始请求。

 

除了请求指定 DF 以外,也可以请求指定的资源,比如安装语言资源

 

发起请求后,会返回一个 值作为 session ID,通过调用 , 可以取消当前的下载。

发起请求后,可能无法正常建立链接,此时会返回错误信息如下

ErrorDescriptionsACCESS_DENIED鉴于当前设备的某些原因,无法下载ACTIVE_SESSIONS_LIMIT_EXCEEDED当前应用的请求 session 太多API_NOT_AVAILABLE请求 API 目前无法使用INCOMPATIBLE_WITH_EXISTING_SESSION请求的 session 中包含了已经请求中的 DFINTERNAL_ERROR内部错误INVALID_REQUEST无效请求MODULE_UNAVAILABLE请求的 DF 不存在NETWORK_ERROR网络错误NO_ERROR无法获得错误信息SERVICE_DIED服务无响应SESSION_NOT_FOUND无法获取被请求的 session

下载安装

成功建立了连接后,便进入下载、安装阶段。使用 能够监听下载安装的状态,可以根据这些状态为对下载进度等进行用户提示

 
StateDescriptionCANCELED下载被取消CANCELING下载取消中DOWNLOADED下载完成,但是尚未安装DOWNLOADING下载即将完成FAILED下载或安装失败INSTALLED成功安装INSTALLING安装中PENDING下载等待中REQUIRES_USER_CONFIRMATION等待用户确认UNKNOWN未知

卸载模块

成功安装后,通过 可以获取所有已安装的 Module

 

另外,通过 可以对 DF 进行指定卸载

 


根据 Google 官方的数据,AAB 比 APK 的包大小平均会减小 20% ,这同时意味着节省了 20% 的下载流量。 以 为例,采用 AAB 之后

  • language 相关资源节省 95%
  • density 相关的 Splits 节省 45%
  • abi 相关资源节省 20%

除了包大小方面的优势以外,使用 AAB 在开发效率上也有收益,无需再针对不同目标点设备,配置多个 Flavor、生成多个 APK 并分别上传,只要上传一个 AAB,剩下的事情交由应用市场去做就好了。



Qigsaw 是爱奇艺提供的一套基于 Android App Bundle 的动态化方案,无需 Google Play Service 即可在国内体验 Android App Bundle 开发工具。它支持动态下发插件 APK,采用单类加载器方式,让应用能够在不重新安装的情况下实现动态安装插件。

此外,华为应用市场也早就支持了 AAB 的上传和动态下发,所以不要再说 AAB 是打压华为的产物了 😅

最新文章
[源码解析] PyTorch分布式优化器(3)---- 模型并行
本系列介绍分布式优化器,分为三篇文章,分别是基石篇,DP/DDP/Horovod 之中数据并行的优化器,PyTorch 分布式优化器,按照深度递进。本文介绍PyTorch 分布式优化器和PipeDream之中的优化器,主要涉及模型并行(流水线并行)。PyTorch分布
简单一百网课app
简单一百网课app,一般又称简单一百。
热门中高端手机大排行 京东焕新季补贴10%起
如今,对于手机品牌而言,要想掌控市场话题权,必须要在中高端市场站稳脚跟。2022年已经过去四分之一,手机市场新机不断。眼下正是京东手机焕新季,用户换机需求也日渐高涨。面对琳琅满目的机型,用户多少会不知道如何下手,京东各类手机热卖榜单
网站关键词优化步骤,让网站在搜索引擎中脱颖而出
随着互联网的快速发展,数量呈爆炸式增长,如何在众多网站中脱颖而出,吸引目标用户,成为企业关注的焦点。而网站优化是提升网站搜索引擎排名、吸引潜在客户的重要手段。本文将从关键词选择、布局、优化策略等方面,详细介绍网站关键词优化
PingPong深耕跨境支付场景创新,为企业出海提供本地化生态服务网络
  伴随西方传统节日临近,海外消费需求持续升温。从近日落幕的全球黑色星期五和网购星期一(下称黑五网一)购物季看,各大跨境电商平台战绩不俗,中国商家更是作出贡献的中坚力量。  11月份,制造业采购经理指数(PMI)新出口订单恢复至48.1%,
让你快速精通SEO优化
高转化页面的打造!这里210.30.208.205提醒大家,做SEO无论你技术怎么样,都要做好高转化页面的打造,否则你的SEO最终都会功 亏一篑,无论排名如何,高转化页面的方式很多,销售信的引导,免费的引导,低价的引导,绝对化优势的引导,做好
高清美女写真生成大揭秘:用AI技术打造你的虚拟女友
在当今这个科技飞速发展的时代,AI技术不仅改变了我们的工作生活方式,也彻底颠覆了我们的艺术审美。想象一下,你在朋友圈中悄悄发布了一张梦幻般的美女写真,朋友们纷纷点赞,而这张照片的创作过程仅需几分钟。这并不是未来科幻片中的情节
花30万读个港硕,我后悔了
“最新消息,今年可能不考虑港硕了。”看到秋招群里的对话,七月心底五味杂陈,本科毕业时,她陪同学去比亚迪面试,在现场亲眼见证了比亚迪对海归派的求贤若渴、来者不拒。如今,她读了个港硕、捧着QS名校研究生毕业证回来,面对的却是通道
楼上半夜又唱又跳,楼下房客睡不着写投诉信!长沙一直播公司:会装隔音棉
楼上半夜直播楼下住户睡不着网友入住酒店发现楼板嗡嗡作响,直播公司承诺会装隔音棉潇湘晨报记者 於广强 长沙报道近日,有网友反映,在长沙县一家电竞酒店入住,楼上一家直播公司半夜直播声音很大,影响休息,希望改进。记者现场探访发现,
鸿蒙系统用什么开发的
鸿蒙系统是由华为自主研发的分布式操作系统,主要采用微内核设计,使用了C/C++和Java作为主要开发语言。 鸿蒙系统的开发主要包括五个方面:微内核、分布式架构、ARK编译器、开发环境和应用生态。其中,微内核是鸿蒙系统的核心,而分布式架
相关文章
推荐文章
发表评论
0评