如何生成包含动态功能模块的完整 APK 文件

How to generate full APK file including dynamic feature module

我的项目有动态功能模块,我想生成包含动态功能的调试或发布 APK。目前我只能获取基础 APK 文件。

基本上我会像普通应用程序一样生成一个 APK 文件。但是我无法使用动态功能。是的,我知道动态功能将基于 AAB 工作。

有什么方法可以制作普通的(基础+所有模块)APK文件吗?请帮忙解决这个问题。

谢谢

您可以指定您的点播模块是否需要包含在通常为旧设备生成的通用 APK 中,然后您可以使用 bundletool to generate an Universal APK from the App Bundle:

在这种特殊情况下,您可以使用类似的东西:

bundletool build-apks --bundle <bundle_file> --output <APKS file> --ks <key_store> --key-pass <jks password> --ks-key-alias <key_alias> --ks-pass <key password> --overwrite --mode=universal

关键点是包含 --mode=universal 此指示 bundletool 以生成通用 APK,其中将包含清单中具有 <dist:fusing dist:include="true"/> 的所有模块。

以类似的方式,当您从设备上的 Android Studio 运行 项目时,使用 运行 的默认配置(部署 = 默认 APK),它包括所有您的点播模块。
相反,当您使用 运行 配置(Deploy = AppBundle 中的 APK)运行 Studio 中的应用程序时,您可以选择安装哪些模块。

但是,在这两种情况下,如果您不通过 Play 商店,则无法测试按需模块下载。

备注(2020 年 11 月)

正如下面另一个答案中所报告的,Android Gradle 插件包括几个未记录的任务,可用于生成应用程序的调试和未签名发布通用 APK。

如果您只需要这种类型的构建,与调试版本相关的任务可以是一个快速的替代方案:

./gradlew :app:packageDebugUniversalApk

此任务将生成(默认)app/build/outputs/universal_apk/debug/app-debug-universal.apk

2019 年 6 月更新

Google 在 I/O Internal App Sharing 引入,允许轻松测试您的 App Bundle 和 APK,包括调试版本:

With internal app sharing, you can quickly share an app bundle or APK with your internal team and testers by uploading an APK or app bundle on the internal app sharing upload page.

我没有在任何地方看到它的文档,但是 Android Gradle 构建工具包含为您提取通用 APK 的任务。您可以使用类似于:

./gradlew :yourmodule:packageDebugUniversalApk

在幕后,它使用 bundletool 并做与其他答案基本相同的事情,但能够从 Gradle.

做到这一点真是太好了

Github 下载 bundletool jar 文件(最新版本 > 资产 > bundletool-all-version.jar 文件)。将该文件重命名为 bundletool.jar

  1. 从 Android Studio 生成您的 aab 文件,例如:myapp-release.aab
  2. 运行 以下命令:

java -jar "path/to/bundletool.jar" build-apks --bundle=myapp-release.aab --output=myapp.apks --ks="/path/to/myapp-release.keystore" --ks-pass=pass:myapp-keystore-pass --ks-key-alias=myapp-alias --key-pass=pass:myapp-alias-pass

  1. myapp.apks 将生成文件
  2. 下面是生成通用apk的命令

java -jar bundletool.jar build-apks --bundle=nhl.aab --output=nhl.apks --mode=universal

`