注:1、本文译自[https://codelabs.developers.google.com/codelabs/your-first-dynamic-app/#0]
2、本文“应用(程序)束”、“应用(程序)包”等价于App bundle(s)
一、引言
本文将介绍Android App Bundles的概念以及基于优化apk集的动态交付特性

什么是Android App Bundle?
Android App Bundle是一种新的上传格式,包含所有应用的已编译代码和资源,但推迟了APK生成并签名到Google Play

什么是动态交付?
它是Google Play的新应用服务模式,它使用您的应用束为每个用户的设备配置生成并提供优化的APK,因此他们只需下载运行应用所需的代码和资源。您不再需要构建,签名和管理多个APK,用户可以获得更小,更优化的下载。

什么是动态功能模块?
这些是您可以添加到应用项目的模块,并将它们包含在您的应用束中。通过动态交付,您的应用可以在需要时下载和安装动态功能。
此功能仍处于测试阶段。

图1.左侧:一个简单的应用程序,包括基本APK(B)和一些可配置的APK集(C)。右侧:一个更复杂的应用程序,包括两个动态功能APK(D)和相应的可配置的APK集(C)供需要时下载。

二、安装
以下步骤将帮助您设置安装前的前提条件。
获取Android Studio 3.2金丝雀
开始配置项目和构建app bundles的最简单方法是使用最新版本的Android Studio。如果您还没有这样做,请立即下载Android Studio 3.2 Canary。

确保您拥有最新版本的Canary版本。使用顶部菜单,展开Android Studio菜单,然后单击关于Android Studio。您应该使用Android Studio 3.2 Canary 14.此codelab中描述的某些工具仅适用于此版本的Android Studio。

开始代码
当使用针对多种语言的复杂真实应用程序,使用多个资源用于不同的屏幕密度并针对不同的体系结构时,Android应用程序束和动态​​功能的好处最为明显。在此类应用程序中,应用程序束可以大大减少用户设备上安装的APK的大小。

但是,在codelab中,为了演示目的,我们会保持简单的做法。您需要做的就是在Android Studio中创建一个通用的Android项目,并在创建完后修改该项目。

三、具有拆分APK集的动态交付
动态交付的一个基本要素是Android 5.0(API21)及更高版本上提供的拆分APK机制。使用该机制,Google Play可以将大型应用分解为较小的离散包,并根据需要安装在用户的设备上。
不同类型的拆分APK
您将在此codelab中了解有三种拆分APK。
基础APK
包含所有其他拆分APK可以访问的代码和资源,并为您的应用提供基本功能。当用户下载应用程序时,总是会包含此APK。

配置APK
仅包含给定设备配置的本机库和资源。具体来说,这意味着根据以下几点优化APK内容:

语言环境
屏幕密度
CPU架构

动态功能APK
包括首次安装应用程序时不需要的功能,但可以在以后下载和安装。
Google Play会为您构建并提供所有应用的APK集。而且,对于运行Android 4.4(API20)及更低级别的设备,Google Play会自动提供针对设备配置进行了优化的单个APK。

四、构建应用程序束
好的,让我们开始启动Android Studio Canary 14。

使用以下步骤创建新的Android Studio项目:

选择“Start a new Android Studio project”菜单项。
在“Create Android Project”屏幕上,选择项目名称并使用合理的默认值填写其余字段。
在Target Android Devices屏幕上,选择“Phone and Tablet”
在下一个屏幕上,选择“Empty Activity”
配置Activity(可以保持Android Studio提供的默认设置)
点击完成。
以上,你刚刚创建了一个很小的Android项目,打印出“Hello,World!”到屏幕。

建立你的项目
在这一步中,我们将比较和对比构建项目的两种方法:1)构建整个APK,以及2)构建应用束。

构建APK应该是大多数Android开发人员所熟悉的(转到Build> Build Bundle(s)/ APK(s)并选择Build APK(s))。整个APK包括以下所有内容:

所有res值,无论设备区域设置如何。
所有assets,无论设备的相关密度如何。
支持所有体系结构,无论设备的相关配置如何。

构建bundles
作为构建整个APK的替代方法,您可以选择构建应用束。

首先,打开app / build.gradle并在android {}块中添加以下内容:

bundle {   language {       enableSplit = true   }   density {       enableSplit = true   }   abi {       enableSplit = true   }}

这可确保语言,屏幕密度和abi配置拆分全部被启用。

注意:将来,默认情况下这些将设置为true,并且不需要此步骤。

等待项目同步。

现在,您可以构建您的App Bundle。转到Build> Build Bundle(s)/ APK(s)并选择Build Bundle(s):

Bundles以.aab格式存储。您可以在构建目录中看到生成的.aab。请参阅app> build> outputs> bundle> debug> bundle.aab

将bundle上传到Google Play后,Google Play仅会安装用户设备所需的配置。这包括:

仅对应于设备区域设置的res值。例如,默认语言设置为日语的用户将只获取values-jp中的字符串,而不是所有字符串。
只有与设备屏幕密度对应的assets。对于xxxhdpi设备,这意味着只提供drawable-xxxhdpi的内容,而不是针对其他密度的内容。
如果模块具有x86和ARM CPU体系结构,则只有该体系结构的相关本机库。

在最基本的层面上,现有的应用程序可以转换为捆绑“单个模块”和ABI,密度和语言配置。在这种情况下,Google Play为目标设备提供具有正确配置集合的单个模块,使apk更小。

这种方法使开发人员获益良多。它使应用程序更小,并且无需构建和发布多个APK。

五、使用bundletool测试Android App Bundles
构建Android应用程序包后,您应该测试Google Play如何使用它来生成APK以及这些APK在部署到设备时的行为方式。有两种方法可以考虑用于测试您的应用包:

本地使用bundletool命令行工具
通过Google Play将您的bundle上传到Play控制台并使用新的内部测试工具。
codelab的这一步解释了如何使用bundletool在本地测试您的应用程序包。

什么是bundletool?
Bundletool是一种Gradle,Android Studio和Google Play用于构建Android应用程序包或将应用程序包转换为部署到设备的各种APK的基础工具。 Bundletool也可作为命令行工具使用,因此您可以重新创建,检查和验证Google Play的应用程序APK的服务器端版本。
下载bundletool
如果您还没有下载bundletool,请从GitHub下载bundletool。您将下载bundletool-all-0.3.3.jar文件。

从您的应用包中生成一组APK
当bundletool从您的应用包中生成APK时,它会将它们包含在名为APK 存档集合的容器中,该容器使用.apks文件扩展名。要为应用程序包中支持的所有设备配置生成APK集,请使用bundletool build-apks命令,如下所示。

bundletool build-apks命令语法如下:

bundletool build-apks --bundle= --output=

只需要两个参数,1).aab文件的路径,以及2)存储生成的apks的目录。

1),回想一下Android debug应用程序包(.aab文件)是在以下位置生成的:
./app/build/outputs/bundle/debug/bundle.aab
2),创建一个目录来存储生成的apks:
mkdir out.apks
现在您可以运行build-apks。如果bundletool在您的路径中,请运行以下命令:

java -jar ~/Downloads/bundletool-all-0.3.3.jar build-apks --bundle=./app/build/outputs/bundle/debug/bundle.aab --output=out.apks

这假设你下载了bundletool-all-0.3.3.jar到〜/ Downloads目录;如果bundletool-all-0.3.3.jar的路径不同,请调整命令。
执行命令后,您应该看到与此类似的输出:

WARNING: The APKs won't be signed and thus not installable unless you also pass a keystore via the flag --ks. See the command help for more information.

如输出所示,如果您要将APK部署到设备,则还需要包含应用的签名信息。我们将在此codelab中跳过该步骤并开始工作。相反,我们将从应用程序包生成apks并检查输出。
检查生成的APK
运行bundletool build-apks会根据语言,屏幕密度和abi生成大量拆分的apk。现在,您将解压缩out.apk的内容并检查生成的apks。

创建一个apks /目录来存储解压缩的apks:

mkdir apks

然后,将out.apks的内容解压缩到apks /:

unzip out.apks -d apks

apks /目录现在包含许多apk。您的输出应如下所示:

shailentuli:~/work/android/DynamicAppsCodelab (master)$ ls -l apkstotal 4584-rw-r--r--  1 shailentuli  eng    97167 May  7 15:37 base-arm64_v8a.apk-rw-r--r--  1 shailentuli  eng    69911 May  7 15:37 base-armeabi_v7a.apk-rw-r--r--  1 shailentuli  eng    40332 May  7 15:37 base-hdpi.apk-rw-r--r--  1 shailentuli  eng    36156 May  7 15:37 base-ldpi.apkArchive:  out.apks extracting: apks/base-xhdpi.apk      extracting: apks/base-hdpi.apk       extracting: apks/base-mdpi.apk       extracting: apks/base-ldpi.apk       extracting: apks/base-xxxhdpi.apk    extracting: apks/base-xxhdpi.apk     extracting: apks/base-ca.apk         extracting: apks/base-da.apk         extracting: apks/base-ja.apk         extracting: apks/base-fa.apk         extracting: apks/base-tvdpi.apk      extracting: apks/base-ka.apk         extracting: apks/base-pa.apk         extracting: apks/base-ta.apk         extracting: apks/base-nb.apk         extracting: apks/base-be.apk         extracting: apks/base-de.apk         extracting: apks/base-ne.apk         extracting: apks/base-te.apk         extracting: apks/base-af.apk         extracting: apks/base-th.apk         extracting: apks/base-bg.apk         extracting: apks/base-fi.apk         extracting: apks/base-si.apk         extracting: apks/base-hi.apk         extracting: apks/base-vi.apk         extracting: apks/base-kk.apk         extracting: apks/base-mk.apk         extracting: apks/base-sk.apk         extracting: apks/base-uk.apk         extracting: apks/base-el.apk         extracting: apks/base-gl.apk         extracting: apks/base-ml.apk         extracting: apks/base-nl.apk         extracting: apks/base-pl.apk         extracting: apks/base-tl.apk         extracting: apks/base-sl.apk         extracting: apks/base-am.apk         extracting: apks/base-km.apk         extracting: apks/base-bn.apk         extracting: apks/base-in.apk         extracting: apks/base-kn.apk         extracting: apks/base-mn.apk         extracting: apks/base-ko.apk         extracting: apks/base-lo.apk         extracting: apks/base-ro.apk         extracting: apks/base-sq.apk         extracting: apks/base-fr.apk         extracting: apks/base-ar.apk         extracting: apks/base-master.apk     extracting: apks/base-sr.apk         extracting: apks/base-hr.apk         extracting: apks/base-mr.apk         extracting: apks/base-tr.apk         extracting: apks/base-cs.apk         extracting: apks/base-ur.apk         extracting: apks/base-bs.apk         extracting: apks/base-et.apk         extracting: apks/base-es.apk         extracting: apks/base-ms.apk         extracting: apks/base-is.apk         extracting: apks/base-lt.apk         extracting: apks/base-eu.apk         extracting: apks/base-it.apk         extracting: apks/base-pt.apk         extracting: apks/base-zu.apk         extracting: apks/base-hu.apk         extracting: apks/base-ru.apk         extracting: apks/base-gu.apk         extracting: apks/base-lv.apk         extracting: apks/base-iw.apk         extracting: apks/base-sv.apk         extracting: apks/base-sw.apk         extracting: apks/base-my.apk         extracting: apks/base-az.apk         extracting: apks/base-hy.apk         extracting: apks/base-ky.apk         extracting: apks/base-uz.apk         extracting: apks/base-zh.apk         extracting: apks/base-en.apk         extracting: apks/base-jp.apk         extracting: apks/base-armeabi_v7a.apk   extracting: apks/base-arm64_v8a.apk   extracting: apks/base-x86_64.apk     extracting: apks/base-x86.apk

这里有很多apk!让我们划分这些apk。请注意,所有apk都以base-为前缀,因为我们的app只包含一个基本模块。
base-master.apk 包含基本模块的代码和资源
base-armeabi_v7a.apk, base-arm64_v8a.apk, 等 ABI配置拆分
base-xhdpi.apk, base-mdpi.apk,等 屏幕密度配置拆分
base-ko.apk, base-fr.apk, 等 语言配置拆分

六、动态功能模块
动态功能模块允许您将某些功能和资源与应用程序的基本模块分开,并将它们包含在您的应用程序包中。通过动态交付,用户可以在安装了应用程序的基本APK后,在需要时下载和安装这些组件。

创建动态功能模块
要向您的应用添加动态功能模块,请执行以下操作:

从菜单栏中选择File> New> New Module。在“Create New Module”对话框中,选择“Dynamic Feature Module”。

在“Configure your new module”屏幕上,为模块命名。请注意,已为您选择app作为Base application module。

在“Configure your new module”屏幕上,指定模块标题。

如果希望模块可用于按需下载,请勾选“Enable on-demand”框。如果未选中此选项,则当用户首次下载并安装您的应用时,就会获取动态功能模块。

如果您希望此模块可供运行Android 4.4(API20)及更低版本的设备使用,请检查“Fusing”框,并将其包含在多个APK中。仅当您选中“Enable on-demand”旁边的框时,此选项才可用。这意味着您可以为此模块启用按需行为,并禁用融合以从不支持下载和安装拆分APK的设备中省略它。

点击完成并等待项目同步。您应该看到新创建的Payments模块,您的项目结构应如下所示:

您应该很快注意到默认代码,资源和结构与标准app模块的默认代码,资源和结构类似。

检查生成的内容
平台使用您刚为功能模块指定的标题向用户标识模块,例如,在确认用户是否要下载模块时。

因此,您的应用程序的基本模块(app)必须包含模块标题作为字符串资源,可以进行翻译。 Android Studio会在基础模块中为您创建此资源,并将其注入功能模块的manifest文件中(Payments):

打开payment / src / main / AndroidManifest.xml,你应该看到代表模块配置的以下XML:

   

动态功能模块构建配置
使用Android Studio创建新的动态功能模块时,IDE会将以下Gradle插件应用于动态功能模块的build.gradle文件。

apply plugin: 'com.android.dynamic-feature'

该插件包括配置和构建包含动态功能模块的应用程序包所需的Gradle任务和属性。

当Android Studio创建动态功能模块时,通过将android.dynamicFeatures属性添加到基础模块的build.gradle文件,它使基本模块可见。

打开app / build.gradle,您应该看到以下内容:

dynamicFeatures = [":payments"]

此外,Android Studio将基本模块作为动态功能模块的依赖项。打开payment / build.gradle,您应该看到以下内容:

dependencies {   ...   implementation project(':app')}

标准应用程序插件可用的许多属性也可用于动态功能模块。由于每个动态功能模块都依赖于基本模块,它还会继承某些配置。因此,您应该在动态要素模块的build.gradle文件中省略以下内容:

minifyEnabled属性(如果需要,可以为每个动态要素模块指定其他ProGuard规则)。
versionCode和versionName:构建应用程序包时,Gradle使用基本模块提供的应用程序版本信息。您应该从动态模块的build.gradle文件中省略这些属性。

七、总结
恭喜!您已完成所有步骤。在此codelab中,您了解了Android App Bundle格式,使用bundletool检查生成的APK并创建了动态功能模块。

在整个codelab中,您使用了debug构建。有关创建已签名bundles以及如何在Google Play商店中部署它们的详细信息,请访问https://developer.android.com/guide/app-bundle/。

更多相关文章

  1. Android动态控制手机屏幕方向
  2. 【译】如何在 Android(安卓)中使用 Retrofit, Moshi, Coroutines
  3. Android(安卓)Studio生成JavaDoc
  4. Security and Permissions 安全与权限 (一)
  5. 【android】 调用别的应用的activity
  6. Security and Permissions安全与权限(三)
  7. android 组件生命周期
  8. 基于Android的SDIO-WIFI移植(1)
  9. Android(安卓)动态权限封装

随机推荐

  1. 关于android中使用new Message的内存泄露
  2. android重要包的描述
  3. android动态创建控件
  4. Android近期任务列表 Recent Applicatoin
  5. Android屏幕适配攻略
  6. Android(安卓)-- Looper.prepare()和Loop
  7. Android项目--团购类客户端
  8. 生命週期
  9. 【安卓学习笔记】Android(安卓)Studio第9
  10. Andriod自动化测试原理基础