2017-04-20 176 views
2

我将cc_library链接到android_binary并且出现命名问题。有人能告诉我如何解决它吗?Android二进制文件中的.so文件的名称冲突

cc_library

cc_library(
    name = "native_library", 
    srcs = glob(["libs/**/*.so"]) 
) 

库目录的内容:

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

我可能是错的,但它的局限性的APK布局,所以我怕你只是不能有一个脂肪apk的命名库。重命名库为libSound-armeabi.so等你的选择?

+0

好吧,明白了,谢谢你的回应! – ldjhust

2

另一种方法,它利用的android_binary是--fat_apk_cpu标志,并且不需要重新命名库:

android_binary将打造每cc_library一次通过--fat_apk_cpu指定的每个架构。 --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文件。