Bazel android二进制文件中.so文件的名称冲突

Bazel android二进制文件中.so文件的名称冲突,bazel,Bazel,我正在将一个cc_库链接到一个android_二进制文件,并得到一个命名问题。有人能告诉我怎么解决吗 cc\u库: cc_library( name = "native_library", srcs = glob(["libs/**/*.so"]) ) libs目录的内容: libs ├── armeabi │   ├── libSound.so │   ├── libSec.so │   ├── libWatch.so │   └── libTec.so ├── armeab

我正在将一个
cc_库
链接到一个
android_二进制文件
,并得到一个命名问题。有人能告诉我怎么解决吗

cc\u库

cc_library(
    name = "native_library",
    srcs = glob(["libs/**/*.so"])
)
libs目录的内容:

libs
├── armeabi
│   ├── libSound.so
│   ├── libSec.so
│   ├── libWatch.so
│   └── libTec.so
├── armeabi-v7a
│   ├── libSound.so
│   ├── libSec.so
│   └── libWatch.so
├── x86
│   ├── libSound.so
│   ├── libSec.so
│   ├── libWatch.so
│   └── libTec.so
|—— other jars
错误消息如下所示:

ERROR: /the/path/to/BUILD:10:1: in android_binary rule //:debug_apk: Each library in the transitive closure must have a unique basename to avoid name collisions when packaged into an apk, but two libraries have the basename 'libSound.so': libs/armeabi/libSound.so and libs/armeabi-v7a/libSound.so.
...

我可能错了,但这是apk布局的局限性,所以我担心您不能在胖apk中使用名为libs的。是否可以将libs重命名为libSound-armeabi.so等?

这是一种利用android二进制--fat\u apk\u cpu标志的替代方法,无需重命名库:

android_binary将为--fat_apk_cpu指定的每个架构构建每个cc_库一次。--fat_apk_cpu的默认值只是armeabi-v7a。这被称为“Android拆分转换”。当它构建每个cc_库时,该cc_库从--fat_apk_cpu中的列表中获得--cpu标志。我们可以定义读取这些标志的配置设置规则,并在cc_库中使用select语句,以便您的cc_库包含不同的.so文件,具体取决于构建它的体系结构

例如:

# BUILD
CPUS = ["armeabi", "armeabi-v7a", "x86"]
[config_setting(name = cpu, values = {"cpu": cpu}) for cpu in CPUS]

cc_library(
    name = "native_library",
    srcs = select(
        {":%s" % cpu : glob(["libs/%s/*.so" % cpu]) for cpu in CPUS}
    ),
)

android_binary(
    name = "app",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    deps = [":native_library"],
)
然后在命令行上,您可以指定希望在最终APK中呈现的体系结构

$ bazel build --fat_apk_cpu=armeabi,armeabi-v7a,x86 //:app
$ zipinfo -1 bazel-bin/app.apk | grep \.so$
lib/x86/libWatch.so
lib/x86/libSound.so
lib/x86/libSec.so
lib/x86/libTec.so
lib/armeabi-v7a/libWatch.so
lib/armeabi-v7a/libSound.so
lib/armeabi-v7a/libSec.so
lib/armeabi-v7a/libTec.so
lib/armeabi/libWatch.so
lib/armeabi/libSound.so
lib/armeabi/libSec.so
lib/armeabi/libTec.so

$ bazel build --fat_apk_cpu=x86 //:app
$ zipinfo -1 bazel-bin/app.apk | grep \.so$
lib/x86/libWatch.so
lib/x86/libSound.so
lib/x86/libSec.so
lib/x86/libTec.so
只指定一个要构建的体系结构可以加快开发构建。例如,如果在开发时使用x86仿真器,则不需要armeabi和armeabi-v7a.so文件