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 .)

  • Come prendere più foto prima di scartare l'intenzione della camera?
  • Come hide un elemento in un Android Spinner
  • Come eliminare l'elemento di listview dal database sqlite quando il button di eliminazione viene cliccato in una window di dialogo creata?
  • Quali dispositivi eseguono e non supportno la modalità Host USB?
  • Perché non utilizzare sempre android: configChanges = "keyboardHidden | orientation"?
  • Aggiornamento da Cordova 2.5 a Cordova 3.0, affrontando problemi durante l'utilizzo di CordovaInterface
  • 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!

  • Ciclo di vita di attività Android - quali sono tutti questi methods?
  • Colore di background del menu delle opzioni della barra degli strumenti
  • Rileva la connessione USB e controlla se è un PC
  • Sovrascrivere il responsabile di fiducia SSL in Android
  • Come registrare il suono utilizzando l'auricolare Bluetooth
  • Rilevatore di volti di Android utilizzando la camera android
  • 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.