如何在 bazel 中合并 AndroidManifest.xml

How to merge AndroidManifest.xml in bazel

我的 android 项目包含一些 aar 模块,它们有自己的 AndroidManifest.xml。我应该怎么做才能将 aar 的清单合并到最终的 AndroidManifest.xml?

非常感谢您的帮助!

我的android_binary规则:

android_binary(
    name="apk",
    custom_package = "com.xtbc",
    manifest_merger = "android",
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"], exclude=["res/.DS_Store"]),
    assets = glob(["assets/**"], exclude=["assets/.DS_Store"]),
    assets_dir = "assets",
    multidex = "manual_main_dex",
    main_dex_list = "mainDexList.txt",
    dexopts = [
        "--force-jumbo"
    ],
    deps = [
        ":lib",
        ":base_lib",
        ":jni"
    ]
)

:base_lib 是一个模块(即 android_library 规则):

android_library(
    name = "base_lib",
    srcs = glob(["base/src/**/*.java"]),
    custom_package = "com.xtbc.base",
    manifest = "base/AndroidManifest.xml",
    resource_files = glob(["base/res/**"], exclude=["base/res/.DS_Store"]),
    assets = glob(["base/assets/**"], exclude=["base/assets/.DS_Store"]),
    assets_dir = "base/assets",
    deps = [
        "@androidsdk//com.android.support:support-annotations-23.0.1"
    ]
)

它有自己的base/AndoridManifest.xml,我想要的是:base_lib的AndroidManifest.xml会合并到最后的AndroidManifest.xml(即:apk 的 AndroidManifest.xml).

我没有足够的 Whosebug 信誉来回复评论链,但听起来你想要的是 android_libraryexports_manifest 属性。

https://bazel.build/versions/master/docs/be/android.html#android_library.exports_manifest 的文档说默认值为 1,但是,该文档基于尚未进入 Bazel 版本的源代码更改。现在您需要将 exports_manifest = 1 添加到您的 android_library 上。在下一个 Bazel 版本中,这将不再是必需的。

此外,关于 "AAR modules":如果这些是预构建的 .aar 文件,您将需要使用 aar_import 规则。它没有 exports_manifest 属性,因为它总是默认导出。如果这些是 Gradle Android 库模块,那么您可以只使用 android_library 规则。如果您指的是支持库,@androidsdk//com.android.support:support-annotations-23.0.1 实际上是一个 JAR,而不是 AAR。