我将cc_library
与android_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.
...
答案 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等选项?