2017-04-20 13 views
2

cc_libraryandroid_binaryにリンクしていて、名前の問題が発生しました。誰かがそれを解決する方法を教えてもらえますか?アンドロイドバイナリの名前の競合。

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

ビルドするアーキテクチャを1つだけ指定すると、開発ビルドを高速化できます。たとえば、開発中にx86エミュレータを使用する場合は、armeabiおよびarmeabi-v7a .soファイルは必要ありません。

関連する問題