在android二进制文件中命名.so文件的冲突

时间:2017-04-20 01:54:48

标签: bazel

我将cc_libraryandroid_binary关联起来并获得命名问题。有人能告诉我如何解决它吗?

cc_library

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.
...

2 个答案:

答案 0 :(得分:2)

利用android_binary的--fat_apk_cpu标志并且不需要重命名库的替代方法:

android_binary将为--fat_apk_cpu指定的每个体系结构构建一次cc_library。默认的--fat_apk_cpu只是armeabi-v7a。这被称为“Android拆分转换”。当它构建每个cc_library时,cc_library会从--fat_apk_cpu中的列表传递一个--cpu标志。我们可以定义读取这些标志的config_setting规则,并在cc_library中使用select语句,以便cc_library包含不同的.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文件。

答案 1 :(得分:0)

我可能错了,但这是apk布局的限制,所以我担心你不能在胖apk中找到那个命名的libs。是否将libs重命名为libSound-armeabi.so等选项?

相关问题