大多数应用程序项目不需要太多的努力来支持动态交付。这是因为包含应用程序基本APK的代码和资源的模块是标准的应用程序模块,在Android Studio中创建新应用程序项目时,默认情况下会得到这个模块。也就是说,将下面的app插件应用于其构建的模块。gradle文件提供应用程序基本功能的代码和资源。
// The standard application plugin creates your app's base module.
apply plugin: 'com.android.application'
此模块中包含的所有代码和资源都包含在应用程序的基本APK中。
除了为应用程序提供核心功能外,baseModule 还提供许多构建配置和清单条目,这些配置和清单条目会影响整个应用程序项目。例如,应用程序包的签名由base moudle块提供的信息决定,并且所有应用程序apk的版本控制都在基本模块清单中的versionCode属性上指定。下面将描述基本模块的其他重要方面。
Base module manifest
App base module的manifest类似于任何其他应用程序模块。请记住,当谷歌Play生成应用程序的base APK时,它将所有模块的清单合并到base APK的清单中。所以,如果你正在考虑在你的app项目中添加动态功能模块,那么你应该记住base的APK manifest的一些方面:
1.因为Base APK总是先安装的,所以它应该为你的app提供主入口点。也就是说,它应该声明一个activity with the following intent filter:
2.当按需下载动态功能模块时,运行Android 6.0 (API level 23)及以下版本的设备在完成新模块的安装之前需要重新启动应用程序。但是,如果希望能够在下载后立即访问下载模块的代码和资源,则应该在manifest中包含对SplitCompat库的支持。
3.同样,在运行Android 6.0 (API级别23)或更低的设备上,应用程序需要重新启动才能应用新的清单条目。因此,如果在下载动态特性模块时需要某些权限或服务,请考虑将它们包含在基本模块的manifest中。
4.Android App Bundles包括对未压缩的本地库的支持。因此,如果您在应用程序中包含本机库,并希望减少磁盘使用,请在基本模块的清单中包含以下内容:
Base module构建配置
对于大多数现有的应用程序项目,您不需要更改基本模块的构建配置中的任何内容。但是,如果您正在考虑将动态特性模块添加到您的app项目中,那么对于基本模块的构建配置,您应该记住以下几个方面:
1.App signing:您不需要在构建配置文件中包含签名信息,除非您希望从命令行构建应用程序包。但是,如果确实包含签名信息,则应该只将其包含在Base module的构建配置文件中。
2.Code shrinking:如果您想为整个应用程序项目(包括其动态特性模块)启用代码收缩,必须从基本模块的构建开始执行。gradle文件。也就是说,您可以在动态特性模块中包含自定义的ProGuard规则,但是动态特性模块构建配置中的minifyEnabled属性将被忽略。
3.The splits
block is ignored:在构建应用程序包时,Gradle会忽略android.splits
block中的属性。如果你想控制你的app bundle支持哪种类型的配置,那就使用android吧。绑定以禁用配置apk的类型。
4.App versioning:Base module确定整个应用程序项目的版本代码和版本名称。
重新启用或禁用配置apk类型
默认情况下,当您构建一个app bundle时,它支持为每一组语言资源、屏幕密度资源和ABI库生成配置apk。使用android。在基本模块的构建中捆绑块。gradle文件,如下所示,你可以禁用对一种或多种配置apk的支持:
android {
// When building Android App Bundles, the splits block is ignored.
splits {...}
// Instead, use the bundle block to control which types of configuration APKs
// you want your app bundle to support.
bundle {
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// dynamic feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
}
}
}
管理应用程序更新
通过Android App Bundle 和 Dynamic Delivery,你不再需要为你上传到谷歌Play的多个apk管理版本代码。相反,你只管理一个版本代码在你的应用程序的基本模块,如下所示:
// In your base module build.gradle file
android {
defaultConfig {
…
// You specify your app’s version code only in the base module.
versionCode 5
versionName "1.0"
}
}
上传app bundle后,谷歌Play使用base module中的version code 将相同的version vode 分配给它从该包生成的所有apk。也就是说,当一个设备下载并安装您的app时,该app的所有split apk共享相同的version code。
当你想用新的代码或资源更新你的app时,你必须在你的app base module 中更新版本代码,并构建一个新的、完整的app bundle。当您将该app bundle上传到谷歌Play时,它将根据base module指定的version code生成一组新的apk。随后,当用户更新您的app时,谷歌Play为他们提供当前安装在设备上的所有apk的更新版本。也就是说,所有已安装的apk都更新为新版本代码。
注意:因为您不再需要为您的应用程序的所有apk管理version code,您不再需要包含基于设备配置动态修改version code的逻辑。
下载其他配置apk
上述更新流的一个例外是,当已安装的应用程序需要额外的配置apk时。考虑这样一个用户,他在已经下载了您的应用程序之后更改了默认的系统语言。如果您的应用程序支持该语言,那么设备就会从谷歌Play请求并下载这些语言资源的额外配置apk。但是,这种对应用程序的更新不会更改其version code,因此设备只下载并安装所需的配置APKs。