2017-03-06 251 views
0

我有一個使用Rx的庫,我將這個庫打包爲可用於其他項目的aar。我能夠生成aar,但是當我嘗試在其他項目中訪問它時,它會拋出: java.lang.NoClassDefFoundError:失敗的解決方案:Lrx/Observer;Android庫項目拋出java.lang.NoClassDefFoundError:失敗的解決方案:Lrx/Observer

產生的原因:拋出java.lang.ClassNotFoundException:路徑上沒有找到類「rx.Observer」:DexPathList

也許我寫的build.gradle錯誤或不排除一些事情。任何幫助深表感謝。

我的圖書館的build.gradle看起來像這樣

compile 'io.reactivex:rxandroid:1.0.1' 
compile 'io.reactivex:rxjava:1.0.14 

'

我們能在圖書館項目中使用Rx和其導出爲AAR?任何幫助深表感謝。

編輯:添加完整的gradle文件。

庫搖籃文件:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1' 
    } 
} 

apply plugin: 'com.android.library' 

apply plugin: 'com.neenbedankt.android-apt' 
apply plugin: 'com.jakewharton.butterknife' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      consumerProguardFiles 'proguard-rules.pro' 
     } 
    } 

    packagingOptions { 
     exclude '.readme' 
     exclude 'LICENSE.txt' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/DEPENDENCIES.txt' 
     exclude 'META-INF/LGPL2.1' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/README.txt' 
     exclude 'META-INF/dependencies.txt' 
     exclude 'META-INF/license.txt' 
     exclude 'META-INF/notice.txt' 
     exclude 'META-INF/services/javax.annotation.processing.Processor' 
     exclude 'META-INF/MANIFEST.MF' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
// compile project(path: ':backend', configuration: 'android-endpoints') 

    compile 'com.android.support:appcompat-v7:25.1.0' 
    compile 'com.android.support:gridlayout-v7:25.1.0' 
    compile 'com.android.support:design:25.1.0' 

    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0' 
    compile 'com.google.code.gson:gson:2.8.0' 
    compile 'com.google.dagger:dagger:2.0' 
    apt 'com.google.dagger:dagger-compiler:2.0' 
    provided 'org.glassfish:javax.annotation:10.0-b28' 

    compile 'io.reactivex:rxandroid:1.0.1' 
    compile 'io.reactivex:rxjava:1.0.14' 
    compile 'com.artemzin.rxjava:proguard-rules:1.2.7.0' 

    compile 'com.google.api-client:google-api-client:1.22.0' 
    compile 'com.google.api-client:google-api-client-android:1.22.0' 


    compile 'com.google.android.gms:play-services-base:10.0.1' 
    compile 'com.google.android.gms:play-services-location:10.0.1' 
    compile 'com.google.android.gms:play-services-places:10.0.1' 
    compile 'com.google.firebase:firebase-messaging:10.0.1' 

    compile 'com.android.support:appcompat-v7:25.1.1' 
    testCompile 'junit:junit:4.12' 

} 

Proguard的文件:

# Dagger 
-dontwarn dagger.internal.codegen.** 
-keepclassmembers,allowobfuscation class * { 
    @javax.inject.* *; 
    @dagger.* *; 
    <init>(); 
} 
-keep class dagger.* { *; } 
-keep class javax.inject.* { *; } 
-keep class * extends dagger.internal.Binding 
-keep class * extends dagger.internal.ModuleAdapter 
-keep class * extends dagger.internal.StaticInjection 

*編輯*

爲庫項目的gradle更新文件

apt 'com.google.dagger:dagger-compiler:2.0' 
provided 'org.glassfish:javax.annotation:10.0-b28' 
compile 'com.sothree.slidinguppanel:library:3.3.1' 

compile 'io.reactivex:rxandroid:1.2.1' 
compile 'io.reactivex:rxjava:1.2.7' 
compile 'com.artemzin.rxjava:proguard-rules:1.2.7.0' 

更新proguard-rules.pro

# Dagger 
-dontwarn dagger.internal.codegen.** 
-keepclassmembers,allowobfuscation class * { 
    @javax.inject.* *; 
    @dagger.* *; 
    <init>(); 
} 
-keep class dagger.* { *; } 
-keep class javax.inject.* { *; } 
-keep class * extends dagger.internal.Binding 
-keep class * extends dagger.internal.ModuleAdapter 
-keep class * extends dagger.internal.StaticInjection 

-dontwarn sun.misc.** 

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { 
    long producerIndex; 
    long consumerIndex; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode producerNode; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode consumerNode; 
} 

-dontnote rx.internal.util.PlatformDependent 

我加入此所生成的AAR作爲模塊,其是用於其他應用的依賴性。

我仍然得到這個錯誤

java.lang.NoClassDefFoundError: Failed resolution of: Lrx/Observer; 
+0

發佈你的'構建。gradle'文件 – user1140237

+0

添加gradle和proguard文件 – chethanks

回答

0

您需要添加

-dontwarn sun.misc.** 

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { 
    long producerIndex; 
    long consumerIndex; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode producerNode; 
} 

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { 
    rx.internal.util.atomic.LinkedQueueNode consumerNode; 
} 

-dontnote rx.internal.util.PlatformDependent 

更多細節見https://github.com/artem-zinnatullin/RxJavaProGuardRules

到您的proguard文件。 PS:你正在使用RxJava的一個非常舊的版本。您可能需要升級到版本1.2.7甚至RxJava2。

編輯:您可能還需要在使用AAR項目的build.gradle文件中加入類似

compile ('com.somepackage:LIBRARY_NAME:[email protected]'){ 
    transitive=true 
} 

,而不是僅僅

compile ('com.somepackage:LIBRARY_NAME:[email protected]') 

。這會告訴gradle下載您的aar所需的任何依賴關係。

+0

謝謝!我厭倦了添加這些規則,它仍然被包裝在aar中。 – chethanks

+0

您如何在使用該庫的項目中包含aar? – JohnWowUs

+0

New-> Module->導入AAR/Jar。我正在使用推薦的方式。所以,在模塊中有一個新的模塊,其中包含aar和gradle文件。 搖籃文件看起來像這樣: ' configurations.maybeCreate( 「默認」) artifacts.add( 「默認」,文件( 'flashsdk-debug.aar')) ' – chethanks

相關問題