2014-10-23 33 views
7

Tôi đang gặp khó khăn khi tích hợp SDK vải Twitter vào ứng dụng của mình. Tôi làm theo các bước của Twitter tutorial và everyhting diễn ra tốt đẹp nhưng khi tôi cố gắng để xây dựng dự án của tôi với gradle, tôi nhận được lỗi này:Xung đột SDK Android SDK vải với Google GSON

Error:Execution failed for task ':app:dexDebug'. 
> com.android.ide.common.internal.LoggedErrorException: Failed to run command: 
D:\Android\android-studio\sdk\build-tools\android-4.4W\dx.bat --dex --output ... 
Error Code: 2 
Output: 
UNEXPECTED TOP-LEVEL EXCEPTION: 
com.android.dex.DexException: Multiple dex files define Lcom/google/gson/JsonSerializer; 
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594) 
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552) 
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533) 
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170) 
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) 
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) 
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) 
    at com.android.dx.command.dexer.Main.run(Main.java:230) 
    at com.android.dx.command.dexer.Main.main(Main.java:199) 
    at com.android.dx.command.Main.main(Main.java:103) 

tôi đã cố gắng loại bỏ thư viện Gson tĩnh của tôi từ thư mục lib mô-đun ứng dụng của tôi và tất cả mọi thứ đã đi tốt sau đó. Tương tự khi loại bỏ các dòng thêm sdk twitter từ phụ thuộc module gradle vì vậy tôi khá chắc chắn có một số loại xung đột giữa hai và tôi đang tìm cách để giải quyết nó.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

Trong trường hợp nó có thể được sử dụng bất kỳ người ngoài kia đây là gradle tập tin mô-đun ứng dụng của tôi:

apply plugin: 'com.android.application' 
apply plugin: 'io.fabric' 

android { 
    ... 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      signingConfig signingConfigs.debug 
      ext.enableCrashlytics = false 
     } 
    } 
} 

repositories { 
    jcenter() 
    mavenCentral() 
    maven{ url 'https://maven.fabric.io/repo'} 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':facebook') 
    compile 'com.android.support:support-v13:20.0.0' 
    compile 'com.google.android.gms:play-services:6.1.11' 
    compile('com.twitter.sdk.android:twitter:[email protected]') { 
     transitive = true; 
    } 
} 
+0

SDK vải phải sử dụng Gson trong nội bộ, do đó nếu bạn tiếp xúc, bạn cũng có thể sử dụng công cụ này và xóa Gson khỏi '/ libs /'. Ngoài ra, hãy nhập cả hai thư viện dưới dạng phụ thuộc trong Gradle và sau đó bạn có thể loại trừ 'Gson' khỏi' Fabric' – Blundell

+0

@Blundell Cảm ơn câu trả lời của bạn. Đó là những gì tôi nghĩ ! Tôi sẽ xem xét việc xóa Gson khỏi Fabric SDK vì tôi duyệt mọi gói bên trong SDK và không tìm thấy bất kỳ thứ gì giống như nó. Bạn có bất kỳ thông tin chi tiết nào về việc xóa Gson khỏi SDK ở chế độ gradle không? – user3476114

+1

Vâng nó sẽ như thế này, nhưng với các thư viện liên quan của bạn: 'biên dịch ('com.google.dexmaker: dexmaker-mockito: 1.1') { loại trừ mô-đun: 'hamcrest-core' }' – Blundell

Trả lời

11

Tôi là một nhà phát triển Twitter Android.

Thử chạy ./gradlew app:dependencies để xem tất cả các phụ thuộc của các tác vụ được phân loại của bạn. Các phụ thuộc biên dịch của bạn sẽ bao gồm một số thông tin như:

+--- com.twitter.sdk.android:twitter-core:1.0.0 
| | +--- com.squareup.retrofit:retrofit:1.6.1 
| | | \--- com.google.code.gson:gson:2.2.4 
| | +--- com.google.code.gson:gson:2.2.4 
| | \--- io.fabric.sdk.android:fabric:1.0.0 

cho thấy GSON thực sự được sử dụng bởi Vải trong nội bộ.

Đề xuất của tôi là xóa GSON khỏi thư mục/libs của bạn và thêm nó dưới dạng phụ thuộc trực tiếp vào build.gradle của bạn thay vì loại trừ nó khỏi biểu đồ deps của Twitter. Bạn cũng có thể tận dụng các cơ chế phân giải phụ thuộc trong công cụ xây dựng.

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) // Maybe remove this. 
    compile project(':facebook') 
    compile 'com.android.support:support-v13:20.0.0' 
    compile 'com.google.android.gms:play-services:6.1.11' 
    compile('com.twitter.sdk.android:twitter:[email protected]') { 
     transitive = true; 
    } 
    compile 'com.google.code.gson:gson:2.2.4' // Added. 
} 
+0

Xin chào và cảm ơn câu trả lời của bạn. Nó có vẻ là cách android studio/gradle muốn mọi thứ được như vậy tôi chắc chắn sẽ cố gắng mà :) Tốt đẹp của bạn để hoàn thành sự hiểu biết của tôi về gradle và cách nó quản lý phụ thuộc – user3476114

+0

Chạy như một say mê!cảm ơn một lần nữa! – user3476114

+0

Bạn được chào đón! – joeblubaugh

10

Vải SDK phải đang sử dụng Gson nội bộ, do đó nếu nó được tiếp xúc với bạn có thể chỉ cần sử dụng này và xóa Gson khỏi/libs /.

Hoặc nhập cả hai thư viện dưới dạng phụ thuộc vào Gradle và sau đó bạn có thể loại trừ Gson khỏi Fabric.

Loại trừ gson từ vải như thế này:

compile('com.twitter.sdk.android:twitter:[email protected]') { 
     transitive = true; 
     exclude module: 'gson' 
} 
+0

Phương pháp tương tự có thể được sử dụng trên các gói khác của Twitter. Ví dụ: 'compile ('com.twitter.sdk.android:twitter-core:3.1.1') {loại trừ module: 'gson'}' – efkan