2017-04-20 1 views
2

cc_libraryandroid_binary에 연결하고 명명 문제가 발생했습니다. 누군가 그것을 해결하는 방법을 말해 줄 수 있습니까?안드로이드 이진 파일에서 .so 파일 이름이 충돌합니다.

cc_library :

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

libs와 디렉토리의 내용 :

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

내가 잘못 될 수도 있지만 한계입니다 :

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 

및 오류 메시지는 다음과 같이 있습니다 apk 레이아웃에 대해, 나는 당신이 단지 apk라는 이름의 libs를 가질 수 없다는 것을 두려워한다. libs를 libSound-armeabi.so 등으로 이름을 바꿉니 까?

+0

OK, 답장을 보내주세요. – ldjhust

2

android_binary가 --fat_apk_cpu 플래그의 활용 및 라이브러리의 이름을 변경 필요없는 다른 방법 :

android_binary 구축 각 cc_library 번 --fat_apk_cpu로 지정된 각 아키텍처. --fat_apk_cpu의 기본값은 armeabi-v7a입니다. 이것을 "Android split transition"이라고합니다. 각 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 파일이 필요하지 않습니다.

관련 문제