2016-05-13 9 views
5

Wenn ich die gradle verwendet zu bauen und die apk laufen lasse, erhalte ich die Fehler unter ::::Wie behebt man die Datei libgnustl_shared.so, die in sdks von Drittanbietern dupliziert wurde?

Error:Execution failed for task ':app:transformNative_libsWithMergeJniLibsForDebug'. 
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK lib/armeabi-v7a/libgnustl_shared.so 
    File1: 
app/build/intermediates/exploded-aar/com.facebook.react/react-native/0.20.1/jni 
    File2: 
app/build/intermediates/exploded-aar/app/videosdk/unspecified/jni 
+0

einer meiner Module die gleiche libgnustl_shared.so Datei, wenn ich die ReactAndroid zu meinem Projekt hinzufügen, bekomme ich diesen Fehler Spitze .. –

+0

Hier ist eine saubere, nicht-Hack-Lösung: https://StackOverflow.com/a/35660513/2850807 – UrbanMetro

Antwort

2

Schließlich bewege ich mich eines der so auf Vermögenswerte Datei, und laden Sie es vor manuell verwendet

String path = getApplication().getFilesDir().toString() + "/armeabi-v7a/libgnustl_shared.so"; 
if (!FileUtils.isFileExit(path)) //move so from assets to another dir 
     FileUtils.initSOFileFromAssetsFile(getApplication()); 
System.load(path); 

Dies funktioniert nicht sehr gut, obwohl es den DuplicateFileException-Fehler behebt. Wenn jemand den besseren Weg bekommen, sagen Sie mir bitte. Danke!^_^

+0

Haben Sie jemals einen besseren Weg gefunden, ohne eine der .so-Dateien neu zu packen? – matt

+1

Können Sie das genauer erklären? Ich verstehe nicht, was du meinst "ich verschiebe eine der so Datei zu Vermögenswerten". –

2

Ich konnte das beheben, indem ich den Code unten zu meinem build.gradle hinzufüge. Es ist eine Art Hack; Es sollte eine elegantere Lösung geben, als müsste die React Native Version nicht enthalten sein. Idealerweise würde React Native dies auflösen. Ich öffnete ein Problem aufgetreten: https://github.com/facebook/react-native/issues/9454

import com.android.build.gradle.internal.pipeline.TransformTask 

def deleteDuplicateJniFiles() { 
    def files = fileTree("${buildDir}/intermediates/exploded-aar/com.facebook.react/react-native/0.31.0/jni/") { 
     include "**/libgnustl_shared.so" 
    } 
    files.each { it.delete() } 
} 

tasks.withType(TransformTask) { pkgTask -> 
    pkgTask.doFirst { deleteDuplicateJniFiles() } 
} 
+0

ich glaube nicht, dass dies eine gute Möglichkeit ist, libgnustl_shared.so zu entfernen. –

+1

Es war auch wichtig für mein Projekt, flatDir {dirs 'libs'} in die Master-Gradle-Datei aufzunehmen (eine Ebene höher als die, die Sie hinzufügen oben zu.) –

1

sauberere Lösung ist ausdrücklich Gradle zu sagen, dass Sie über das Problem wissen und eine dieser Dateien zu akzeptieren. Abhängig von den Architekturen, die Sie unterstützen, benötigen Sie möglicherweise nur einige der. Details finden Sie in documentation

android { 

// some stuff 
packagingOptions { 
     pickFirst 'lib/armeabi-v7a/libgnustl_shared.so' 
     pickFirst 'lib/arm64-v8a/libgnustl_shared.so' 
     pickFirst 'lib/x86_64/libgnustl_shared.so' 
     pickFirst 'lib/x86/libgnustl_shared.so' 
    } 
}