主要参考文章如下。
https://developer.android.com/guide/app-bundle/
https://developer.android.com/platform/technology/app-bundle/
什么是Android App Bundle
Android App Bundle是一种新的Android App开发,编译和发布机制,它也可以用来表示这种机制生成文件的格式。在文章https://developer.android.com/guide/app-bundle/中并没有明确的区分这两者,它有时表示这种机制,有时表示文件格式。此外,它的写法也很随意,有时用首字母大写的形式Android App Bundle,有时用全小写的android app bundle,有时又把Android或android省掉,变成App Bundle和app bundle,bundle和bundles的单复数使用也很随意。
bundle是一捆,一束的意思,正如这个词的字面意思,Android App Bundle会将整个App编译成一个bundle,在这个bundle里包含了若干个子的模块,每个模块都可以拆分成一个单独的apk。这一点会在后面介绍。
Android App Bundle和Android 9
有人可能认为Android App Bundle和Android 9是捆绑在一起的,但其实并不是,它们两除了都是今年发布的之外并无其他关系。
顺便吐槽下Android Pie的版本号,所有官方文档中都将Android Pie的版本号称为Android 9,而不是Android 9.0,但在这之前的其他版本一直都是有.0的小尾巴的。然后在Android Studio中很多地方选择版本号时,Android Pie的版本号又变成了9.0。
Android App Bundle和Android Studio 3.2
Android Studio 3.2中增加了Android App Bundle的支持,包括在Build中增加了Build Bundles和Generate Signed Bundle的选项,在new module时增加了Dynamic Feature Module的模板等,这些在以前版本中是没有的。所以如果要方便的使用Android App Bundle,需要使用Android Studio 3.2及以上版本。
在Android Studio中使用Android App Bundle来开发
如前所述,Android App Bundle是一种新的Android App开发,编译和发布机制。在Android App Bundle出现之前,开发者开发一个App一般都是在Android Studio中创建一个Phone Module,把App的框架和主要功能的代码写到Phone Module中,创建0到多个Library Module,把一些相对独立的子功能代码写到Library Module,然后将整个工程编译成一个apk文件。apk文件中包含了工程中的全部代码和资源,无论是Phone Module还是Library Module都被编译到了apk文件中。
Android App Bundle在原先的Phone Module和Library Module基础上增加了一个Dynamic Feature Module,可以在开发时创建0到多个Dynamic Feature Module,正如这三个英文单词所表示的,每个Dynamic Feature Module表示一个动态的功能模块,关于这个模块的用途需要结合后面的split APKs和Dynamic Delivery来理解。这里只是介绍它的创建过程。
Dynamic Feature Module的创建
在Android Studio 3.2中,选择File - New - New Module…,打开New Module窗口,选择第三个Dynamic Feature Module,然后选择一个Base application module,输入Module name和Package name,选择Mininum API Level即可创建一个Dynamic Feature Module。Module name,Package name和Mininum API Level的含义和创建其他Module是一样的,这里多出来一个Base application module,它表示这个要创建的Dynamic Feature Module所依附的Base module,它必须是一个application module即在build.gradle中第一行是apply plugin: 'com.android.application’的module,不能是apply plugin: ‘com.android.library’。这一般就是工程的主module。Base module和Dynamic Feature Module的关系同样要到后文介绍split APKs和Dynamic Delivery的时候才能够理解。
创建好后的Dynamic Feature Module后,会在base module的build.gradle中增加android.dynamicFeatures配置,表示依赖此module的所有Dynamic Feature Modules。
android {
…
// Specifies dynamic feature modules that have a dependency on
// this base module.
dynamicFeatures = [":my_dynamic_feature1", “:my_dynamic_feature2”]
}
在创建的Dynamic Feature Module的build.gradle中,第一行不再是apply plugin: ‘com.android.application’,也不是apply plugin: ‘com.android.library’,而是apply plugin: ‘com.android.dynamic-feature’。同时,在创建的Dynamic Feature Module的build.gradle中还会自动添加对base module的依赖。
dependencies {
…
// Declares a dependency on the base module, ‘:app’.
implementation project(’:app’)
}
上述过程都是在Android Studio中创建Dynamic Feature Module时自动完成的,无需手动添加。不过如果要修改一个已有的Dynamic Feature Module的名字,并不会自动修改base module中dynamicFeatures配置中的名字,需要手动修改一下,这可能是现阶段Android Studio的一个bug,应该不久就会被修复。
使用Android App Bundle方式来编译
在Android Studio 3.2中,选择Build - Build Bundle(s) / APK(s) - Build Bundle(s)即可使用Android App Bundle方式来编译。如果要生成带签名的Bundle,则选择Build - Generate Signed Bundle /APK…,在弹出的对话框中选中Android App Bundle即可。
使用Android App B