Android App Bundle 简介(unity拆包.aab)

Android App Bundle介绍

1.Android App Bundle 是一种全新的上传格式,其中包含您应用的所有编译好的代码和资源,但 APK 生成及签名工作则交给 Google Play 来处理。
2.使用 Android App Bundle 发布时,应用的大小上限也会增加到 150MB,无需使用 APK 扩展文件。请注意,此限制仅适用于实际下载大小,不适用于发布大小。因此,用户可以下载最大为 150MB 的应用,并且通过 Dynamic Delivery,所有存储空间仅用于运行应用所需的代码和资源。如果将此功能与对未压缩的原生库的支持结合使用,较大的应用(如游戏)可以减少磁盘使用量并提高用户留存率。
3.App bundle 是经过签名的二进制文件,可将应用的代码和资源整理到模块中,如图 1 所示。各个模块的代码和资源的组织整理方式与 APK 中的相似,这是合理的,因为每个模块都可以作为单独的 APK 生成。然后,Google Play 会使用 app bundle 来生成向用户提供的各种 APK,例如基本 APK、动态功能 APK、配置 APK 以及多 APK(对于不支持拆分 APK 的设备)。以蓝色标识的目录(例如 drawable/、values/ 和 lib/ 目录)表示 Google Play 用来为每个模块创建配置 APK 的代码和资源。

压缩下载大小限制

虽然借助 Android App Bundle 发布可帮助用户以尽可能最小的下载大小安装您的应用,但压缩下载大小上限为 150MB。 也就是说,当用户下载您的应用时,安装您应用所需的压缩 APK(例如基本 APK 和配置 APK)的总大小不得超过 150MB。任何后续下载内容(例如按需下载动态功能(及其配置 APK))也必须满足此压缩下载大小限制。

Unity打aab包

在Build Settings中勾选 Build App Bundle (Google Play)

image.png

打包的时候勾选Build App Bundle即可,会产生.aab文件,.aab文件可以通过bundletool工具解压成.apks文件,然后通过不同手机硬件配置安装所需要的apk
.apks文件里面内容如下
image.png
image.png

bundletool工具的使用https://blog.csdn.net/wuzi_csdn/article/details/88824438

BaseApk:该APK包含所有其他拆分APK都可以访问的代码和资源,并为您应用程序提供基本功能。当用户请求下载您的应用程序时,首先下载并安装该APK。这是因为只有BaseAPK的manifest 包含应用程序的services、content providers、premissions、platform version 和对系统特性的依赖的完整声明。谷歌Play从项目的app(或base)模块为应用程序生成基本APK。如果您想要减小应用程序的初始下载大小,那么一定要记住,此模块中包含的所有代码和资源都包含在应用程序的基本APK中。

Configuration APKs:每个apk都包含针对特定屏幕密度、CPU架构或语言的本机库和资源。当用户下载您的应用程序时,他们的设备只下载并安装针对其设备的配置apk。每个配置APK都是Base APK或 dynamic feature APK的依赖项。也就是说,它们与它们提供代码和资源的APK一起下载和安装。与基本功能模块和动态功能模块不同,您不需要为配置apk创建单独的模块。如果您使用标准实践为基本功能模块和动态功能模块组织可选的、特定于配置的资源,谷歌Play将自动为您生成配置apk。

Dynamic feature APKs:您可以自定义如何以及何时将该功能下载到设备上。例如,使用Play Core库,可以在设备上安装base APK之后根据需要安装动态APK,以向用户提供额外的功能。考虑一个聊天应用程序,它可以下载并安装只在用户请求使用该功能时才能捕获和发送照片的功能。因为动态特性在安装时可能不可用,所以应该在BseeAPK中包含任何公共代码和资源。也就是说,您的动态特性应该假设只有基本APK的代码和资源在安装时可用。谷歌Play从项目的动态功能模块为应用程序生成动态功能apk。

Apks 依赖关系:

这些apk在gradle构建时自动生成。

在4.4以下系统支持

由于运行Android 4.4 (API级别19)及以下的设备不支持下载和安装split APK,因此谷歌Play为这些设备提供一个名为multi-APK的APK,该APK针对设备的配置进行了优化。也就是说,多apk代表了您完整的应用程序体验,但不包含不必要的代码和资源——例如用于其他屏幕密度和CPU架构的代码和资源。

但是,它们包含应用程序支持的所有语言的资源。例如,这允许用户更改应用程序的首选语言设置,而无需下载不同的multi-APK。

多apk没有能力在以后按需下载动态特性模块。要在这个APK中包含一个动态模块,您必须在创建动态特性模块时禁用随需应变或启用融合。

模块化

模块化应用程序是将应用程序项目的逻辑组件分离为离散模块的过程。

将应用程序的功能重新组织到这些离散组件中需要仔细考虑和时间。

模块化好处:

1.并行开发:通过将应用程序的逻辑组件分离到模块中,组织中的不同团队或个人可以拥有每个模块,并处理它们,从而减少对其他团队的合并冲突或中断。此外,如果您的应用程序的各个部分都使用了逻辑,那么您可以使用库模块来促进代码重用和封装。

2.提升构建时间:构建系统,例如使用Gradle的Android Studio构建系统,针对组织成模块的项目进行了优化。例如,如果您在一个包含多核处理器的工作站上启用Gradle的并行项目执行优化,那么构建系统就能够并行地构建多个模块,从而显著减少构建时间。您的项目越模块化,构建性能的改进就越重要。

3.定制特性交付:将应用程序的特性模块化为动态特性模块是利用动态交付的定制交付选项(如随需应变、有条件交付和即时交付)的必要条件。创建随需应变的动态特性需要付出更多的努力,并可能对应用程序进行重构。因此,请仔细考虑哪些应用程序特性将从模块化为动态特性和自定义交付选项中获益最多。

通过应用程序特性模块化您的项目需要时间和适当的考虑。当您决定开始模块化您的应用程序时,您应该首先使用支持模块化特性所需的属性来配置base module。然后,您可以通过为at-install交付配置动态特性模块,逐步模块化应用程序的特性,而无需更改应用程序的当前行为。

使用动态特性模块进行自定义交付

动态交付的一个独特好处是能够定制应用程序的不同功能如何以及何时下载到运行Android 5.0 (API级别21)或更高的设备上。例如,为了减小应用程序的初始下载大小,您可以配置某些功能,以便根据需要下载,或者只由支持某些功能的设备下载,比如拍照功能或支持增强现实功能。

虽然默认情况下,当您将应用程序作为应用程序包上载时,您可以获得高度优化的下载,但是更高级和可定制的功能交付选项需要使用动态功能模块对应用程序的功能进行额外配置和模块化。也就是说,动态特性模块为创建模块化特性提供了构建块,您可以根据需要将其配置为每个模块。

考虑一个允许用户在在线市场上买卖商品的应用程序。您可以合理地将应用程序的以下功能模块化为单独的动态功能模块

帐号登录及创建

浏览市场

出售物品

处理付款

下表描述了动态特性模块支持的不同交付选项,以及如何使用它们优化示例marketplace应用程序的初始下载大小。

交付选项 行为 样本用例
At-install
安装时 默认情况下,不配置上述任何交付选项的动态特性模块在app安装时下载。这是一个重要的行为,因为它意味着您可以逐步采用高级交付选项。例如,只有在使用Play Core库完全实现了按需下载之后,您才能从模块化应用程序的功能中获益,并启用随需应变交付功能。

此外,您的应用程序可以请求卸载功能在稍后的时间。所以,如果你在app安装时需要某些功能,但在那之后就不需要了,你可以通过请求从设备上移除该功能来减小安装尺寸。 如果应用程序有特定的培训活动,比如关于如何在市场上买卖商品的交互式指南,默认情况下,您可以在应用程序安装时包含该功能。

但是,为了减小app的安装尺寸,app可以在用户完成培训后请求删除该功能。
On demand
按需 允许您的应用程序根据需要请求和下载动态功能模块。 如果只有20%的人使用市场上应用物品出售,一个好的策略来减少初始下载大小对大多数用户来讲是让拍照的功能,包括一个项目的描述,和把一个项目销售提供按需下载。也就是说,您可以为应用程序的销售功能配置动态特性模块,只有当用户对将商品放到市场上感兴趣时,才可以下载该应用程序的销售功能。

此外,如果用户在一段时间后不再出售商品,应用程序可以通过要求卸载该功能来缩小其安装的大小。
Conditional
有条件的 允许您指定特定的用户设备需求,例如硬件特性、区域设置和最低API级别,以确定是否在app安装时下载模块化特性。 如果市场应用程序具有全球性,您可能需要支持仅在某些地区或本地流行的支付方法。为了减少最初的应用程序下载大小,您可以创建单独的动态功能模块来处理某些类型的支付方法,并根据用户的注册地区有条件地将它们安装在用户的设备上。
Instant
即时的 谷歌Play Instant允许用户在不需要在设备上安装APK(s)的情况下与您的应用程序进行交互。相反,他们可以通过谷歌Play Store上的“立即尝试”按钮或您创建的URL体验您的应用程序。这种交付内容的形式使您更容易增加与应用程序的接触。

通过即时交付,您可以利用谷歌Play instant让您的用户无需安装就可以立即体验应用程序的某些功能。 考虑一个在轻量级动态特性模块中包含游戏最初几个级别的游戏。你可以立即启用该模块,这样用户就可以通过URL链接或“立即尝试”按钮来体验游戏,而无需安装应用程序。

Dynamic feature module manifest

当使用Android Studio创建一个新的动态特性模块时,IDE包含了该模块作为动态特性所需要的大部分显式属性。此外,一些属性是编译时由构建系统注入的,所以您不需要自己指定或修改它们。下表描述了对动态特性模块非常重要的清单属性。

属性 描述
<manifest

xmlns:dist="http://schemas.android.com/apk/distribution"    指定一个新的dist: XML名称空间,将在下面进一步描述。
split="split_name"  当Android Studio构建应用程序包时,它会为您包含这个属性。因此,您不应该自己包含或修改这个属性。
定义模块的名称,应用程序在使用Play Core库请求随需应变模块时指定该名称。
Gradle如何确定这个属性的值:
默认情况下,当您使用Android Studio创建动态特性模块时,IDE使用您指定的模块名称来标识模块为Gradle设置文件中的Gradle子项目。
在构建应用程序包时,Gradle使用子项目路径的最后一个元素将这个manifest属性注入模块的manifest中。例如,如果在MyAppProject/features/目录中创建一个新的动态特性模块,并指定“dynamic_feature1”作为模块名,IDE就会在设置中添加“:features:dynamic_feature1”作为子项目。gradle文件。在构建应用程序包时,Gradle会在模块的清单中注入。
android:isFeatureSplit="true |false">   当Android Studio构建应用程序包时,它会为您包含这个属性。因此,不应该手动包含或修改此属性。
指定此模块为动态特性模块。基本模块和配置apk中的Manifest要么省略该属性,要么将其设置为false。
<dist:module    这个新的XML元素定义了一些属性,这些属性决定如何将模块打包并作为apk分发。
dist:instant="true | false" 指定模块是否应该通过谷歌Play Instant作为即时体验提供。
如果您的应用程序包含一个或多个即时启用的动态功能模块,您还必须即时启用基本模块。当使用Android Studio 3.5或更高版本时,当您创建一个即时启用的动态特性模块时,IDE会为您完成这一任务。
在同时设置时,不能将此XML元素设置为true。不过,您仍然可以使用Play Core库按需下载即时启用的动态特性,作为即时体验。当用户下载并安装您的应用程序时,默认情况下,设备会下载并安装您的应用程序的即时启用动态特性,以及基本的APK。
dist:title="@string/feature_name"   为模块指定一个面向用户的标题。例如,当设备请求下载确认时,它可能会显示这个标题。
您需要在基本模块的module_root/src/source_set/res/values/strings.xml文件中包含这个标题的字符串资源。
<dist:fusing dist:include="true |false" /> 
</dist:module>  指定是否将模块包含在针对运行Android 4.4 (API级别20)及以下设备的多apk中。
此外,当您使用bundletool从应用程序包生成APK时,只有将此属性设置为true的动态特性模块才包含在universal APK中——这是一个独立的APK,包含应用程序支持的所有设备配置的代码和资源。
<dist:delivery> 封装定制模块交付的选项,如下所示。请记住,每个动态特性模块只能配置这些自定义交付选项的一种类型。
<dist:install-time/>    指定模块应在安装时可用。这是不指定另一种类型的自定义交付选项的动态特性模块的默认行为。
此节点还可以指定将模块限制为满足特定需求的设备的条件,例如设备特性、用户国家或最低API级别。要了解更多信息,请阅读Configure conditional delivery。
<dist:on-demand/>   指定模块应可随需下载。也就是说,模块在安装时不可用,但是您的应用程序稍后可能会请求下载它。
</dist:delivery>     
<application 
android:hasCode="true | false"> 

</application> 如果动态特性模块没有生成DEX文件——也就是说,它不包含后来编译成DEX文件格式的代码——您必须执行以下操作(否则,您可能会得到运行时错误):
1.在动态特性模块的清单中将android:hasCode设置为“false”。
2.将以下内容添加到基本模块的清单中:
<span style="color:#000000"><span style="color:#37474f"><span style="color:#3b78e7"><application</span>
<span style="color:#9c27b0">android:hasCode</span>=<span style="color:#0d904f">"true"</span>
<span style="color:#9c27b0">tools:replace</span>=<span style="color:#0d904f">"android:hasCode"</span><span style="color:#3b78e7">></span>
...
<span style="color:#3b78e7"></application></span></span></span>
动态特性模块不应该在其清单中指定android: exports设置为true的活动。这是因为,当其他应用程序试图启动活动时,无法保证设备已经下载了动态功能模块。此外,在尝试访问其代码和资源之前,应用程序应该确认下载了动态特性。
参考:https://blog.csdn.net/u011536013/article/details/100104769
https://developer.android.com/studio/build/configure-apk-splits

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容