2013-05-25 16 views
34

tôi có một dự án có sử dụng một vài dự án thư viện khác (SlidingMenu, ActionBarSherlock) và cả hai sử dụng thư viện hỗ trợ android, khi xây dựng Tôi nhận được như sau:build gradle Android và các thư viện hỗ trợ

UNEXPECTED TOP-LEVEL EXCEPTION: 
java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/LoaderManager; 
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) 
    at com.android.dx.dex.file.DexFile.add(DexFile.java:163) 
    at com.android.dx.command.dexer.Main.processClass(Main.java:490) 
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459) 
    at com.android.dx.command.dexer.Main.access$400(Main.java:67) 
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398) 
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) 
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) 
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) 
    at com.android.dx.command.dexer.Main.processOne(Main.java:422) 
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333) 
    at com.android.dx.command.dexer.Main.run(Main.java:209) 
    at com.android.dx.command.dexer.Main.main(Main.java:174) 
    at com.android.dx.command.Main.main(Main.java:91) 

Cả hai dự án thư viện có một sự phụ thuộc vào sự ủng hộ lib:

dependencies { 
    compile files('libs/android-support-v4.jar') 
} 

Trả lời

19

Cho đến khi chúng tôi có thư viện hỗ trợ có một kho lưu trữ, bạn không thể đưa nó vào trong nhiều dự án thư viện. Bạn có thể tạo một dự án thư viện chỉ chứa thư viện hỗ trợ và có tất cả các thư viện khác phụ thuộc vào nó.

Cập nhật: this is now possible.

+0

cảm ơn bạn rất nhiều:) –

+1

Tôi đã cố gắng thực hiện điều đó, nhưng tôi nhận được một số lỗi 'Không thể tìm thấy phần tử/tệp kê khai/ứng dụng.' .. –

+1

Nếu dự án thư viện có thư viện hỗ trợ là 'android- dự án library'? –

1

các ADT sẽ ném một ngoại lệ như UNEXPECTED TOP-LEVEL EXCEPTION nếu classpath Eclipse của bạn chứa nhiều hơn một lớp cùng tên/gói/lọ. Trong trường hợp này, nó đang gặp phải nhiều trường hợp của lớp LoaderManager.

Giải pháp: Bạn có cùng một thư viện jar bao gồm hai lần. Kiểm tra ứng dụng của bạn và tất cả các thư viện Android được tham chiếu và đảm bảo bạn có tất cả các jars được bao gồm chính xác một lần.

13

Dựa vào câu trả lời từ Xav, nếu bạn có các mô-đun khác phụ thuộc vào android-support-v4.jar, tạo dự án thư viện chứa android-support-v4.jar và tham khảo dự án này thay vì tệp jar .

Ví dụ:

Thêm một dự án với cấu trúc này:

- android-support 
    - libs 
    - android-support-v4.jar 
    - AndroidManifest.xml 
    - build.gradle 

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.example.support.lib"> 

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7"/> 

<application /> 

</manifest> 

build.gradle:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.2' 
    } 
} 
apply plugin: 'android-library' 

dependencies { 
    compile files ("libs/android-support-v4.jar") 

} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 7 
    } 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
     } 

    } 
} 

nhớ để bao gồm này dự án trong y dự án của chúng tôi settings.gradle:

include ':android-support' 

bây giờ, đối với từng dự án đòi hỏi các thư viện hỗ trợ, thay vì

compile files ("libs/android-support-v4.jar") 

sử dụng dòng sau:

compile project (':android-support') 
51

này bây giờ là có thể bằng cách tải xuống Android Support Repository từ Trình quản lý SDK và thay thế

compile files("libs/android-support-v4.jar") 

với

compile 'com.android.support:support-v4:13.0.0' 

này đã được thực hiện cho tất cả các dự án có sử dụng các thư viện hỗ trợ. Kho lưu trữ hỗ trợ Android được tự động thêm vào danh sách các kho lưu trữ của bạn bằng hệ thống xây dựng (Không chắc chắn phần nào thêm nó, chưa biết đủ gradle).

Source

+0

Tôi có cần phải nhập lại dự án của mình để dự án này có hiệu lực không? Tôi đã thử nó nhưng nó không hoạt động. – dannyroa

+0

@dannyroa Có khả năng nhưng nút "Nhập từ Gradle" trong studio android nên thực hiện thủ thuật. Hãy thử xây dựng từ dòng lệnh một lần và nhìn thấy nếu điều đó sửa chữa nó đầu tiên. – abhishekmukherg

+0

Điều đó đã khắc phục được sự cố của tôi nhờ có rất nhiều bạn đời –

2

FYI, tôi đã có thêm này để loại trừ các android-support-v4.jar trong xây dựng gradle của tôi, vì tôi đã thêm nó như là một artifact:

biên dịch fileTree (dir: 'libs' , bao gồm: '* .jar', loại trừ: 'android-support-v4.jar')

Tôi đã tạo build.gradle bằng tính năng xuất dự án trong plugin ADT của Eclipse.

+0

Điều này gây ra lỗi của trình biên dịch do thiếu lib. –

+0

cảm ơn bạn, thông tin của bạn đã giúp tôi – feelinglucky