| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> AAB 扶正!APK 将退出历史舞台 -> 正文阅读 |
|
[移动开发]AAB 扶正!APK 将退出历史舞台 |
令我惊讶的是,这样一条“旧闻”最近却被炒得沸沸扬扬,原来竟还是因为蹭了鸿蒙的热度: 要知道 AAB 的首次亮相是在2018年的 GoogleI/O 上,难道彼时谷歌就遇见到鸿蒙的出现了? 不过客观来说,AAB 虽然早已出现,但在国内很少被提及,因此造成部分媒体的错误解读也有情可原。那么本文就为大家做一个关于 AAB 的科普,打消鸿蒙支持者们的顾虑。 Android App BundleAndroid App Bundle(简称AAB) 是 Google 2018年推出的一种动态化的打包方式。当应用程序以 AAB 的格式上传 Google Play(或其他支持 AAB 的应用市场)后,可以根据不同用户实现 features 或者 resources 的按需下发。Google Play (简称GP) 目前提供的动态化服务都是基于 AAB 实现的(不少文章说这些服务是 AAB 的,这种说法不严谨,准确的说是 GP 的)
除了游戏资源以外,对于常规资源,AAB 也可以做到按需下发。例如无需同时存在 hdpi、xhdpi 等多套图片,不少 APP 因此在包大小方面有显著提高: 更小的包体积意味着更高的装机率,这在用户推广成本激高的今天至关重要: App Bundle 文件格式我们先来看一下 AAB 的文件格式,与传统的 APK 有何不同 解压后的 AAB 中的内容和 APK 很相似,但又有不少区别:
后三个 Split APKsSplit APKs 机制是 AAB 实现动态下发的基础,它允许将一个庞大的 APK 按不同维度拆分成独立的 APK,当用户在 GP 下载应用时,Android Framework 通过 IPC 与 GP 通信,为当前设备匹配并下载最小构成的 APK, 这只在 Android 5.0 以上的设备才有效。 AAB 上传后,GP 通过分析找出所有设备的共同资源, 生成一个 Base APK,当用户下载应用时,Base APK 将被首先安装。 GP 又根据 当用户从市场下载应用时,GP 根据设备类型,为其下发不同的 Splits,实现最小化下发。 如下图,针对三种不同设备下发不同 Splits 当用户的设备发生 Configuration Changed (比如切换了系统语言)时,GP 会下发新的 Splits 到手机,如果此时手机不在线会等待下次上线时自动下发。 Split APKs 的这种动态下发只能用于 Android 5.0 以上设备,对于更旧的设备,AAB 会根据 这些 Splits 的矩阵生成多个 Standalone 的 APK,虽然缺少了动态下发的能力必须一次安装到位,但是相对于传统 APK 仍然减小了一定包大小。 作为开发者,我们无需关心这些具体的下发策略,只需要向市场上传一个 AAB ,后续就交给 FW 和 GP 去处理了。 创建 App Bundle打包 AAB使用 Android Studio 可以方便地打包 AAB 此外,也可以使用 Gradle 命令打包,这更适用于一些 CI 流程中。 如下使用 gradle 打包一个 debug 版的 AAB
如果要生成 release 的 AAB 需要配置签名,与 APK 的配置方式是一样的。 AAB 默认会为三种 Configurations 都生成 Splits,当然你可以根据需求自己配置:
上传应用市场生成 AAB 后就可以上传应用市场了,GP 中上传 AAB 和 APK 的入口在一起,当然 8 月以后就没有 APK 的上传入口了。 AAB 上传后,通过后台可以查看其详细信息 例如可以查看 AAB 支持的屏幕密度,以及包体积的减少等信息 Bundle ToolAAB 是无法直接安装到手机的,如果想本地对 AAB 做测试,需要将 AAB 转成 APK,这需要使用 Google 官方提供的 Bundletool 工具 Bundletool 可以获取当前设备信息
设备的 Configurations 信息输出到指定 json 中
Bundletool 根据 json 生成
apks 的产物分为
然后再根据 json 文件,从 apks 中提取 apk :
最后,通过 Bundletool 将 apk 安装到手机上。 注意该命令实际安装 apk 并非 apks
总结一下 Bundletool 生成 APK 的整体流程: 创建 Dynamic Feature除了下发 Configuration APKs,还可以以业务模块为单元“插件化”地动态下发,也就是所谓的 Dynamic Features(简称 DF) IDE 中选择 New 一个 DF 的 Module: 点击 next,选择 DF 的安装时机,例如一次安装到位或是按需安装 创建好的 DynamicFeature Module, 目录和一个普通的 Gadle Module 类似 但是 build.gradle 中 plugin 有所不同:
build.gradle 中也无需配置 此时再打开 app/ 的 build.gradle,会发现多了如下配置
这是 APP 当前支持的所有 DF 的声明 最后,DF 的 Manifeset 也发生了变化:
安装 Dynamic Feature当应用支持 DF 之后,我可以按需的请求并安装这些 Features,这需要集成 Play Core SDK
Play Core 允许用户通过交互的方式请求 DF 的下载安装,并监听下载状态 发起下载请求DF 的下载需要借助
创建
使用
除了请求指定 DF 以外,也可以请求指定的资源,比如安装语言资源
发起请求后,会返回一个 发起请求后,可能无法正常建立链接,此时会返回错误信息如下
下载安装成功建立了连接后,便进入下载、安装阶段。使用
卸载模块成功安装后,通过
另外,通过
AAB 使用效果根据 Google 官方的数据,AAB 比 APK 的包大小平均会减小 20% ,这同时意味着节省了 20% 的下载流量。 以
除了包大小方面的优势以外,使用 AAB 在开发效率上也有收益,无需再针对不同目标点设备,配置多个 Flavor、生成多个 APK 并分别上传,只要上传一个 AAB,剩下的事情交由应用市场去做就好了。 国内的 AAB 使用Qigsaw 是爱奇艺提供的一套基于 Android App Bundle 的动态化方案,无需 Google Play Service 即可在国内体验 Android App Bundle 开发工具。它支持动态下发插件 APK,采用单类加载器方式,让应用能够在不重新安装的情况下实现动态安装插件。 此外,华为应用市场也早就支持了 AAB 的上传和动态下发,所以不要再说 AAB 是打压华为的产物了 😅
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/11 16:14:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |