Come escludere le biblioteche condivise (.so) duplicate in una creazione di Android multiprogetto?

Ottengo un conflitto di "file duplicati" quando costruisco un progetto di padre con due moduli di libreria che utilizzano la stessa libc++_shared.so condivisa libc++_shared.so .

( NOTA : per favore non considerare questa una "domanda duplicata", ho letto diversi post correlati, che mi hanno aiutato ad arrivare finora, ma nessun post ha fornito una risposta che funziona nel mio caso che riguarda gli artefatti di NDK .)

  • phonegap.js arresta l'app android
  • Il path locale di Android Studio non esiste
  • Singolo intento di lasciare che l'utente prenda l'image o scegli l'image dalla galleria in Android
  • Finestra di selezione del numero
  • Firebase Java Server per submit notifica push a tutti i dispositivi
  • Ottieni le size dello schermo in pixel
  • La costruzione funzionava correttamente quando avevo solo 1 module di libreria. L'aggiunta del secondo module di libreria sta creando il conflitto.

    Si consideri la seguente struttura del progetto: 1 progetto genitore, 2 progetti "figlio", ma each progetto si trova allo stesso livello di directory (cioè non gerarchicamente nidificato)

     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) 

    Il module di libreria A1 dipende da entrambi i moduli di libreria B1 e C1.
    A1 -> B1
    A1 -> C1

    I progetti B e C hanno entrambi codice basato su NDK e vengono costruiti / testati correttamente. Entrambi dipendono dalla biblioteca condivisa libc++_shared.so .

    Tuttavia, durante la creazione del progetto A, ho il seguente errore durante il :LibraryModuleA1:packageDebugTest : task :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 

    Quello che ho provato finora

    1. Ho tentato di aggiungere la chiusura suggerita al mio file build.gradle , ma quale file build.gradle lo aggiungo? Ho aggiunto la chiusura a bgA1 , bgB1 e bgC1 (uno alla volta), senza successo.
    2. La chiusura suggerisce di utilizzare exclude 'lib/armeabi-v7a/libc++_shared.so' . Ogni module di libreria "bambino" costruisce il file libc++_shared.so sotto il path build/lib . Tuttavia, ho notato che il module della libreria padre copia il file libc++_shared.so sotto jni/armeabi-v7a/libc++_shared.so all'interno della struttura di directory build/exploded-aar . (Vedi sopra) Se invece la chiusura si legge, exclude 'jni/armeabi-v7a/libc++_shared.so (cioè jni vs lib )?
    3. Dal momento che sto usando Gradle plugin 0.9.1, ho provato a usare pickFirst in luogo di exclude , ma questo non ha avuto successo.

    Può qualcuno aiutare a determinare come devo configurare la chiusura `packagingOptions 'per il mio caso specifico?

    Grazie per l'aiuto!

  • Android: c'è una libreria PDF gratuita per Android
  • Come posso impostare AM / PM in un TimePicker?
  • Perché mai non potrei usare l'opzione inPurgeable di BitmapFactory?
  • android cambia l'ascoltatore della lingua
  • Perché Android ignora l'authorization READ_SMS?
  • C'è un modo per passare i parametri a un Runnable?
  • One Solution collect form web for “Come escludere le biblioteche condivise (.so) duplicate in una creazione di Android multiprogetto?”

    Mi sono imbattuto nello stesso problema e non ho avuto fortuna con l'esclusione o il pickFirst. Così ho usato una soluzione un po 'brutta. L'idea è quella di creare una cartella "native-libs" nella directory di generazione del progetto principale, copiare tutti i file * .so richiesti dai progetti di libreria ndk e quindi informare il sistema di build per includere tali libs nell'APK.

    Nel mio progetto principale (il progetto app), definisco esplicitamente l'elenco dei moduli che contengono codici ndk su cui dipendo

     // Ndk stuff. We have to explicitely manage our NDK dependencies ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')] apply from: '../depend_ndk.gradle' 

    E poi, 'depend_ndk.gradle' è uno script di gradle esterno che contiene

     // Build helper for projects that depends on a native library with a NDK part // Define the list of ndk library you depend on in project main file : // ext.jniProjects = [project(':ndklib1')] // apply from : 'depend_ndk.gradle' buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.12.+' } } import com.android.build.gradle.tasks.PackageApplication // As a workaround, we create a new 'native-libs' folder in the current project and // copy all the .so we depend on into it def ndkLibsDir = new File(buildDir, 'native-libs') ndkLibsDir.mkdir() task copyDependingNativeLibs(type: Copy) { // Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html println 'jniProjects ' + jniProjects jniProjects.each { from(new File(it.buildDir, 'native-libs')) { include '**/*.so' } } into ndkLibsDir } tasks.withType(PackageApplication) { pkgTask -> pkgTask.jniFolders = new HashSet<File>() pkgTask.jniFolders.add(ndkLibsDir) pkgTask.dependsOn copyDependingNativeLibs } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.