关于Android App Bundles

关于Android App Bundles

一个Android应用程序包是一个新的上传格式,包括所有的应用程序的编译代码和资源,但推迟APK生成和sign google play。

Google Play的新应用服务模式称为动态传递,然后使用您的应用包为每个用户的设备配置生成并提供优化的APK,因此他们只下载运行您的应用所需的代码和资源。您不再需要构建,签署和管理多个APK来支持不同的设备,用户可以获得更小,更优化的下载。

此外,您可以向应用项目添加动态功能模块,并将其包含在应用包中。这些模块包含您可以决定在用户​​首次下载和安装应用程序时不包含的功能和资产。 使用Play核心库,您的应用可以稍后请求将这些模块下载为动态功能APK,并且通过动态传递,Google Play仅为该模块提供设备的代码和资源。

开始吧

要构建应用程序包并支持动态交付,请按照下列步骤操作:

  1. 下载Android Studio 3.2或更高版本 - 这是添加动态功能模块和构建应用程序包的最简单方法。

  2. 通过包含基本模块,组织配置APK的代码和资源以及(可选)添加动态功能模块,添加对动态交付的支持。

  3. 构建Android应用程序包。

  4. 使用bundtool测试您的Android应用包,从您的应用包中生成APK并将其部署到连接的设备。

  5. 注册Google Play的应用签名。否则,您无法将应用包上传到Play控制台。

  6. 将您的应用包上传到Play控制台。然后,您可以使用Play控制台的新内部测试轨道快速测试通过动态交付下载您的应用。

动态功能beta测试人员的注意事项

如果要将包含动态要素模块的应用程序发布到生产跟踪,则必须先应用于 动态要素测试程序。如果您已接受测试计划,请在开发动态功能时牢记以下注意事项:

  • 只有运行Android 5.0(API级别21)及更高版本的设备才支持按需下载和安装动态功能。要使您的动态功能适用于早期版本的Android,请确保在创建动态功能模块时 启用“ 融合”。
  • 确保启用S​​plitCompat,以便您的应用程序可以立即访问下载的动态功能模块。
  • 如果动态功能的下载大小很大,则应用程序需要先 获取用户确认, 然后才能将动态功能模块下载到设备。
  • 动态要素模块不应在其清单中指定 android:exported设置为的活动 true。这是因为当另一个应用程序尝试启动活动时,无法保证设备已下载动态功能模块。此外,您的应用应确认在尝试访问其代码和资源之前已下载动态功能。要了解更多信息,请阅读 管理安装的模块。
  • 在发布应用程序之前,请务必使用Play Console的测试轨道彻底测试您的动态功能。要了解更多信息,请阅读 设置打开,关闭或内部测试。

使用拆分APK动态投放

动态传递的一个基本组件是Android 5.0(API级别21)及更高版本上提供的拆分APK机制。拆分APK与常规APK非常相似 - 它们包括已编译的DEX字节码,资源和Android清单。但是,Android平台能够将多个已安装的拆分APK视为单个应用。也就是说,您可以安装多个可以访问公共代码和资源的拆分APK,并在设备上显示为一个已安装的应用程序。

分割APK的好处是可以分解单片APK,即包含应用支持的所有功能和设备配置的代码和资源的APK,以及根据需要安装在用户设备上的较小的离散包。

例如,一个拆分APK可能包含只有少数用户需要的附加功能的代码和资源,而另一个拆分APK包含仅用于特定语言或屏幕密度的资源。当用户请求或设备需要时,下载并安装这些拆分APK中的每一个。

以下描述了可以在设备上一起安装以形成完整应用体验的不同类型的APK。您将在本页的后续部分中了解如何配置您的应用项目以支持这些APK。

  • 基本APK:此APK包含所有其他拆分APK可以访问的代码和资源,并为您的应用提供基本功能。当用户请求下载您的应用时,首先下载并安装此APK。这是因为只有基本APK的清单包含应用程序服务,内容提供商,权限,平台版本要求和系统功能依赖关系的完整声明。Google Play会从您项目的应用(或基础)模块为您的应用生成基本APK。如果您担心减少应用的初始下载大小,请务必记住,此模块中包含的所有代码和资源都包含在您应用的基本APK中。
  • 配置APK:这些APK中的每一个都包含用于特定屏幕密度,CPU架构或语言的本机库和资源。当用户下载您的应用时,他们的设备会下载并仅安装定位其设备的配置APK。每个配置APK都是基本APK或动态功能APK的依赖项。也就是说,它们与APK一起下载和安装,它们提供代码和资源。与基本和动态功能模块不同,您不需要为配置APK创建单独的模块。如果您使用标准做法 为基本和动态功能模块组织备用的,特定于配置的资源,Google Play会自动为您生成配置APK。
  • 动态功能APK:这些APK中的每一个都包含应用功能的代码和资源,这在首次安装应用时不是必需的。也就是说, 使用Play核心库,可以在设备上安装基本APK之后按需安装动态APK,以向用户提供附加功能。例如,您可能有一个聊天应用程序,可以下载并安装仅在用户请求使用该功能时捕获和发送照片的功能。由于动态功能在安装时可能无法使用,因此您应该在基本APK中包含任何公共代码和资源。也就是说,您的动态功能应该假设只有基本APK的代码和资源在安装时可用。Google Play会根据您项目的动态功能模块为您的应用生成动态功能APK。

考虑具有三个动态功能模块的应用程序,并支持多个设备配置。下面的图1说明了应用程序的各种APK的依赖树可能是什么样子。请注意,基本APK构成树的头部,所有其他APK依赖于基本APK。(如果您对Android应用程序包中如何表示这些APK的模块感到好奇,请参阅Android App Bundle格式。)

请注意,您不需要自己构建这些APK - Google Play会使用您使用Android Studio构建的单个签名应用包为您完成此操作。要了解有关应用程序包格式以及如何构建应用程序包格式的更多信息,请转至 构建,部署和上传Android应用程序包。

运行Android 4.4(API级别19)及更低版本的设备

由于运行Android 4.4(API级别19)及更低版本的设备不支持下载和安装拆分APK,因此Google Play会为这些设备提供单个APK,称为多APK,该设备针对设备的配置进行了优化。也就是说,多APK代表您的完整应用体验,但不包含不必要的代码和资源 - 例如其他屏幕密度和CPU架构的代码和资源。

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

多APK无法在以后按需下载动态功能模块。要在此APK中包含动态模块,您必须在创建动态要素模块时 禁用 按需或启用融合。

请注意,使用动态投放,您无需为应用支持的每个设备配置构建,签名,上传和管理APK。您仍然只为整个应用构建并上传了一个应用包,Google Play会为您完成剩下的工作。因此,无论您是否计划支持运行Android 4.4或更低版本的设备,Dynamic Delivery都会为您和您的用户提供灵活的服务机制。

Android App Bundle格式

Android App Bundle是.aab您上传到Google Play以支持动态投放的文件(带有文件扩展名)。

应用程序包是签名的二进制文件,可以将应用程序的代码和资源组织到模块中,如图2所示。每个模块的代码和资源的组织方式与在APK中找到的类似,这是有道理的,因为每个模块都可能是作为单独的APK生成。然后,Google Play会使用应用套件生成向用户投放的各种APK,例如基本APK,动态功能APK,配置APK和(对于不支持拆分APK的设备)多APK。这是在蓝等彩色的目录drawable/,values/以及lib/目录,代表代码和资源,谷歌Play使用每个模块创建配置的APK。

注意:您为每个唯一的应用程序或applicationID构建应用程序包。也就是说,如果您使用产品风格从单个应用程序项目创建应用程序的多个版本,并且每个版本都使用唯一的 applicationID,则需要为每个版本的应用程序构建单独的应用程序包。

以下列表更详细地描述了一些应用程序包的文件和目录:

  • base /,feature1 /和feature2 /:这些顶级目录中的每一个都代表了应用程序的不同模块。应用程序的基本模块始终包含在base应用程序包的目录中。但是,每个动态要素模块的目录都具有模块split清单中属性指定的名称。要了解更多信息,请阅读 动态功能模块清单。
  • BUNDLE-METADATA /:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含ProGuard映射以及应用程序DEX文件的完整列表。此目录中的文件未打包到您应用的APK中。
  • 模块协议缓冲区(*.pb)文件:这些文件提供的元数据有助于向应用商店(如Google Play)描述每个应用模块的内容。例如,BundleConfig.pb提供有关包本身的信息,例如用于构建应用程序包的构建工具的版本,native.pb以及resources.pb 描述每个模块中的代码和资源,这在Google Play针对不同设备配置优化APK时非常有用。
  • manifest /:与APK不同,app bundle将AndroidManifest.xml 每个模块的文件存储在这个单独的目录中。
  • dex /:与APK不同,app bundle将每个模块的DEX文件存储在这个单独的目录中。
  • res /,lib /和assets /:这些目录与典型的APK中的目录相同。当您上传应用包时,Google Play会检查这些目录并仅打包满足目标设备配置的文件,同时保留文件路径。
  • root /:此目录存储稍后重定位到包含此目录所在模块的任何APK的根目录的文件。例如,base/root/应用程序包的目录可能包含应用程序加载的基于Java的资源 Class.getResource()。这些文件稍后会重新定位到应用基础APK的根目录以及Google Play生成的每个多APK。此目录中的路径也会保留。也就是说,目录(及其子目录)也被重定位到APK的根目录。

警告:如果此目录中的内容与APK根目录中的其他文件和目录冲突,则Play Console会在上载时拒绝整个应用程序包。例如,您不能包含 root/lib/目录,因为它会与lib 每个APK已包含的目录冲突。

构建和部署Android应用程序包

应用包与APK不同,因为您无法将其部署到设备。相反,它是一种上传格式,在单个构建工件中包含所有应用程序的已编译代码和资源。因此,在您上传已签名的应用套装后,Google Play会提供构建和签署应用APK所需的一切,并通过动态投放将其提供给用户。

如果您使用的是Android Studio,则 只需点击几下即可将项目构建为已签名的应用包。然后,只需将您的应用套装上传 到Play控制台,即可使用动态投放测试或发布您的应用。

使用bundletool测试您的应用包

在构建Android应用程序包之后,您应该测试Google Play将如何使用它来生成APK以及这些APK在部署到设备时的行为方式。

您可以使用bundletoolGradle,Android Studio和Google Play用于构建Android应用程序包或将应用程序包转换为部署到设备的APK的命令行工具在本地执行这些测试。此工具对于在构建服务器上包含应用程序包支持也很有用。要了解如何下载和使用bundletool,请阅读 使用bundletool测试Android应用程序包。

在本地测试您的应用包后,您应该通过将应用包上传到Play控制台,通过Google Play进行测试 。通过内部测试轨道,您可以将应用程序包上传到Play控制台,并在几分钟内通过Dynamic Delivery开始在设备上对其进行测试。

使用Play核心库下载动态功能模块

如果您的应用包含动态功能,则需要使用Play核心库来请求,监控和管理动态功能模块下载。要了解更多信息,请转到使用Play核心库下载模块。

如果您想查看正在运行的库,请尝试 Play Core Library示例应用程序。

关于即时应用的说明

在Android Studio 3.2或更高版本中, 只要应用程序的大小足够小,您就可以为应用程序包添加即时体验。有关您可以创建的不同类型即时体验的大小限制的详细信息,请参阅Google Play Instant概述。

已知的问题

以下是构建Android应用程序包或使用动态交付为您的应用程序提供服务时当前已知的问题。如果您遇到下面未描述的问题,请 报告错误。

  • Android App Bundles不支持 APK扩展文件。但是,Google Play仍然要求应用下载量不超过100MB。因此,例如,在首次安装您的应用时,您的基本APK及其配置APK的总大小必须等于100 MB或更少。同样,任何动态功能APK及其配置APK的总大小必须为100 MB或更少。上传您的应用套装后,如果您的应用套装导致违反此限制的APK,Play Console会发出警告。
  • 如果您使用动态修改资源表的工具,则从应用程序包生成的APK可能会出现意外行为。因此,在构建应用程序包时,建议您禁用此类工具。
    在动态要素模块的清单中,您不应引用基本模块中不存在的资源。这是因为,当Google Play生成应用的基本APK时,它会将所有模块的清单合并到基本APK的清单中。因此,如果基本APK的清单引用基础APK中不存在的资源,则资源链接会中断。
  • 从Android Studio 3.2 Canary 14开始,当您更改应用程序基本模块的构建变体时,不会为依赖于基本模块的动态功能模块自动选择相同的构建变体。因此,构建应用时可能会收到错误消息。只需确保为基本模块和依赖它的其他模块选择相同的构建变体。
  • 目前,可以在动态要素模块的构建配置中配置与基础(或其他)模块中的属性冲突的属性。例如,您可以buildTypes.release.debuggable = true在基本模块中进行设置,并将其设置false为动态要素模块。此类冲突可能会导致构建和运行时问题。请记住,默认情况下,动态要素模块从基础模块继承一些构建配置。因此,请确保在动态功能模块构建配置中了解应保留哪些配置以及应忽略哪些配置。
  • 由于应用安装可能需要下载多个APK(例如基本APK和一些配置APK),因此在将应用的APK手动转移到设备上时也应该小心(也称为 侧载)。否则,由于缺少代码和资源,您的应用可能会遇到运行时问题。
  • 目前,Google Play在单个APK中包含动态功能模块的所有代码和资源。在不久的将来,对于运行Android 5.0(API级别21)及更高级别的设备,将优化服务以使用配置APK。
  • 下载动态功能模块要求设备安装最新版本的Play商店应用。因此,如果您的应用包含动态功能模块,则极少数用户的下载可能会回退到单个优化的多APK,这与运行Android 4.4(API级别20)及更低版本的设备的下载体验相同。

你可能感兴趣的:(笔记)