Występuje konflikt "duplikatów plików" podczas budowania projektu nadrzędnego z dwoma modułami bibliotecznymi, które korzystają z tej samej biblioteki współużytkowanej libc++_shared.so
.Jak wykluczyć duplikaty współdzielonych bibliotek C (.so) w wielozadaniowym systemie Android?
(UWAGA. Nie uważam tego za „duplikat pytanie” Znam kilka podobnych stanowisk, które pomogły mi zajść tak daleko, jednak żadnych postów dostarczyły odpowiedzi, który działa w moim przypadku z udziałem . Artefakty NDK:.)
Kompilacja działała poprawnie, gdy miałem tylko 1 taki moduł biblioteczny. Dodanie drugiego modułu bibliotecznego powoduje teraz konflikt.
Rozważmy następującą strukturę projektu: 1 projekt rodzic, 2 projekty „dziecko” - ale każdy projekt znajduje się na poziomie samego katalogu (czyli nie zagnieżdżane hierarchicznie)
ProjectA/ (Parent)
LibraryModuleA1/
build/exploded-aar/com.package.name/
LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
build.gradle (bgA1)
Test_APK_Module A1T/
build.gradle (bgA1T)
build.gradle (bgPA)
ProjectB/
LibraryModuleB1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgB1)
build.gradle (bgPB)
ProjectC/
LibraryModuleC1/ (Uses NDK)
build/lib/armeabi-v7a/libc++_shared.so
build.gradle (bgC1)
build.gradle (bgPC)
Biblioteka Moduł A1 zależy zarówno Bibliotece Moduły B1 & C1.
A1 -> B1
A1 -> C1
Projekty B i C mają zarówno kodu opartego NDK i budować/test prawidłowo. Obie są zależne od udostępnionej biblioteki libc++_shared.so
.
Jednak podczas budowy project, pojawia się następujący błąd podczas zadania :LibraryModuleA1:packageDebugTest
:
Error: duplicate files during packaging of APK /ProjectA/LibraryModuleA1/build/apk/LibraryModuleA1-debug-test-unaligned.apk
Path in archive: lib/armeabi-v7a/libc++_shared.so
Origin 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so
Origin 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
You can ignore those files in your build.gradle:
android {
packagingOptions {
exclude 'lib/armeabi-v7a/libc++_shared.so'
}
}
* What went wrong:
Execution failed for task ':LibraryModuleA1:packageDebugTest'.
> Duplicate files copied in APK lib/armeabi-v7a/libc++_shared.so
File 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
File 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so
:LibraryModuleA1:packageDebugTest FAILED
Co ja próbowałem dotąd
- próbowałem dodać sugerowana zamknięcie pliku
build.gradle
, ale który plikbuild.gradle
należy dodać do? Dodałem zamknięcie dobgA1
,bgB1
ibgC1
(po jednym na raz), bez powodzenia. - Sugerowane zamknięcie mówi o użyciu
exclude 'lib/armeabi-v7a/libc++_shared.so'
. Każdy moduł biblioteki "child" buduje pliklibc++_shared.so
pod ścieżkąlibc++_shared.so
. Jednak zauważyłem, że moduł biblioteki nadrzędnej kopiuje pliklibc++_shared.so
podjni/armeabi-v7a/libc++_shared.so
wewnątrz struktury katalogówbuild/exploded-aar
. (Patrz wyżej) Czy zamiast tego zamiast zamknięcia należy przeczytać:exclude 'jni/armeabi-v7a/libc++_shared.so
(tj.jni
vs.lib
)? - Ponieważ używam wtyczki Gradle 0.9.1, spróbowałem użyć
pickFirst
zamiastexclude
, ale to też się nie udało.
Czy ktoś może pomóc w określeniu sposobu konfiguracji zamknięcia `packagingOptions 'dla mojego konkretnego przypadku?
Dziękuję za pomoc!
W jaki sposób uruchamiana jest aplikacja PackageApplication? w aplikacji - nie widzę tego na kompilacjach debugowania ... więc moje pliki APK do debugowania są w tym ... Dzięki. –
Masz rację, mam problemy z pobieraniem funkcji copyDependingNativeLibs automatycznie. Myślę, że dodanie go jako zależności dla pkgTask nie jest właściwym rozwiązaniem. Nie miałem czasu na znalezienie rozwiązania, więc na razie uruchamiam aplikację "./gradlew app: copyDependingNativeLibs", kiedy zmieniam część natywną. – Julien