【问题标题】:Android Library project throws java.lang.NoClassDefFoundError: Failed resolution of: Lrx/ObserverAndroid 库项目抛出 java.lang.NoClassDefFoundError: Failed resolution of: Lrx/Observer
【发布时间】:2017-03-06 07:22:59
【问题描述】:

我有一个使用 Rx 的库,我将这个库打包为可用于其他项目的 aar。我能够生成 aar 但是当我尝试在其他项目中访问它时,它会抛出 java.lang.NoClassDefFoundError: 解析失败: Lrx/Observer;

原因:java.lang.ClassNotFoundException:在路径:DexPathList 上找不到类“rx.Observer”

也许我写错了 build.gradle 或者没有排除一些东西。非常感谢任何帮助。

我的库的 build.gradle 看起来像这样

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

'

我们可以在库项目中使用 Rx 并将其导出为 aar 吗?非常感谢任何帮助。

编辑:添加完整的 gradle 文件。

库 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;

【问题讨论】:

  • 发布您的build.gradle 文件
  • 添加了 gradle 和 proguard 文件

标签: android rx-java rx-android


【解决方案1】:

你需要添加

-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。

编辑:您可能还需要添加类似

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
    transitive=true
}

而不仅仅是

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar')

在项目的build.gradle文件中使用aar。这告诉 gradle 下载 aar 所需的任何依赖项。

【讨论】:

  • 谢谢!我厌倦了添加这些规则,它仍然被打包在 aar 中。
  • 你是如何在使用该库的项目中包含 aar 的?
  • 新建->模块->导入 AAR/Jar。我正在使用推荐的方式。因此,在该模块中有一个带有 aar 和 gradle 文件的新模块。 Gradle 文件如下所示:`configurations.maybeCreate("default") artifacts.add("default", file('flashsdk-debug.aar')) `
  • 我尝试包括transitive=true。它没有下载任何依赖项。
猜你喜欢
  • 2018-11-19
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多