【问题标题】:RoboGuice 3.0 NoClassDefFoundError: roboguice.inject.ContextScopedRoboInjectorRoboGuice 3.0 NoClassDefFoundError:roboguice.inject.ContextScopedRoboInjector
【发布时间】:2016-04-17 22:44:19
【问题描述】:

这并不总是可见,但在特定的 API 14 和 19 上可见。

下面是堆栈跟踪

java.lang.NoClassDefFoundError: roboguice.inject.ContextScopedRoboInjector
    at roboguice.RoboGuice.getInjector(RoboGuice.java:197)
    at roboguice.activity.RoboActivity.onCreate(RoboActivity.java:90)
    at com.bnmcombines.galleryflavors.Launcher.onCreate(Launcher.java:71)
    at android.app.Activity.performCreate(Activity.java:5343)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2441)
    at android.app.ActivityThread.access$900(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5345)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
    at dalvik.system.NativeStart.main(Native Method)

RoboGuice 3.0 已经记录了一个问题:https://github.com/roboguice/roboguice/issues/328

但没有回应,我们目前被阻止。

问题已解决

这次我更仔细地参考了MultiDex Document,并将我的AndroidManifest.xml更新到了我错过的下方

<application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

【问题讨论】:

  • 你在 build.gradle 中使用了 proguard 吗?
  • 它用于发布构建类型而不是在调试中,我在调试运行时遇到此错误
  • 似乎是一个多索引问题。您是否使用 multidex 进行调试构建?
  • 是的,我正在使用 multidex,我想我的应用程序仅适用于 Android 5.0 及更高版本,因此不适用于 Android 5.0 及更高版本。可能 RoboGuice 在内部添加了很多函数调用。我将尝试更新我的应用程序并返回。感谢您指出这一点。
  • @rsakhale 我可以在这里给出我的答案,但你的问题还没有解决,你能发布你的 build.gradle 文件吗?应用程序启动时是否有任何 RoboGuice 声明,例如应用程序类?

标签: java android roboguice android-multidex


【解决方案1】:

我建议执行以下操作 -

  1. 通过尝试使用 Proguard 删除未使用的函数并减少 dex 中的函数数量运行发布版本来检查这是否是 65k 方法限制(multidex)问题。

  2. java.lang.NoClassDefFoundError 也可能在静态变量/对象初始化期间引发异常时引起。检查您是使用/继承自 RoboGuice 类还是使用带有静态对象或代码块的初始化代码。问题可能来自那里。

另外,看看RoboGuice 3.0 NoClassDefFoundError: AnnotationDatabaseImpl,它可能会对你有所帮助(尽管用户得到的错误是关于另一个类的,但他们的初始化是静态对象的)。

祝你好运。

【讨论】:

  • 除此之外也没有运气。
【解决方案2】:

来自您在回答中发布的 git 链接

在 API 级别 14 和 API 级别 19 设备上出现此错误。 在尝试搜索 Class 时,我看到这个类可用,但仍然得到 NoClassDefFoundException ,这很奇怪。这仅在某些情况下才会发生,并不总是

这个错误会因为MultiDexApplication 而出现。我在其他一些库不是同一个库而是其他一些库时遇到了这种问题。它会出现 RoboGuice 库的错误,因为它的应用程序在 dex(in您的 RoboGuice 库代码转换为 dex) 文件是不设置(安装)。

要解决您需要处理多个 Dex 文件的问题。在应用程序的帮助下build.gradle & Application class

build.gradle 文件中所需的以下更改

dexOptions {
        incremental true
        // here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }


dependencies {
     compile 'com.android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}

整个build.gradle

apply plugin: 'com.android.application'
repositories {
    mavenCentral()// for new android studio version it can be jcenter()

}
configurations {
//    all*.exclude group: 'com.android.support', module: 'recyclerview-v7'
}

android {
    signingConfigs {
        /*
        releasebuild {
            keyAlias 'hellotest'
            keyPassword 'hellotest'
            storeFile file('path to keystore')
            storePassword 'hellotest'
        }
        */
    }
    compileSdkVersion 'Google Inc.:Google APIs:22'
    buildToolsVersion '23.0.0'
    /* if you got error regarding duplicate file of  META-INF/LICENSE.txt from jar file
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
    */
    dexOptions {
        jumboMode = true
        incremental true
        // here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }
    defaultConfig {
        multiDexEnabled true
        applicationId "com.myapp.packagenme"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releasebuild
        }
        debug {
            signingConfig signingConfigs.releasebuild
        }
    }
}

dependencies {
     compile 'com.android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}

如果您的应用使用扩展 Applicationclass,您可以重写 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 multidex。install multipledex file context 使用应扩展 MultiDexApplication 的 Applicaiton 类

public class MyAppClass extends MultiDexApplication{
@Override
    protected void attachBaseContext(Context newBase) {
        MultiDex.install(newBase);
        super.attachBaseContext(newBase);
    }
}

如果有什么事请告诉我。

【讨论】:

  • 我试过了,但由于空间问题没有帮助,因为它说无法使用给定的配置创建 Java 虚拟机。
  • 您使用的是哪个 ide..?如果是工作室,请您发布您的 build.gradle。
  • 我使用的是 Android Studio 1.5.1,我的问题刚刚通过在 AndroidManifest.xml 中添加 android:name="android.support.multidex.MultiDexApplication"&lt;application 得到解决,这是我在配置中唯一错过的事情。
  • 但是仅仅通过将 MultiDexApplication 添加到清单问题将无法解决 4.1 设备您需要创建将扩展 MultiDexApplication 并需要在 attachBasContext 方法中安装 multidex 的应用程序类。然后在中声明创建的应用程序类manifest..检查最后一个代码块MyAppClass in answer...如果那个魔法对你有用,那绝对没问题.. :)
  • MultiDex 已经在我的 build.gradle 中启用,MultiDex.install 不是所有时候都需要 TestRunner 的。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2013-08-14
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多