在特定的API 14和19中,并不总能看到这一点。
下面是stacktrace
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
更新到了我错过的<{p}>
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
答案 0 :(得分:3)
您在回答中发布的git链接
在API Level 14和API Level 19设备上获取此错误。 在尝试搜索Class时,我看到这个类是可用的,但仍然得到NoClassDefFoundException这很奇怪。只有在某些情况下才会发生这种情况并不总是
这个错误将来自MultiDexApplication。我遇到了这种问题,其他一些库不是同一个库而是其他一些库。这将是RoboGuice库的错误,因为它的启动app启动了dex (其中您的RoboGuice库代码转换为dex)文件不设置(安装)。
要解决此问题,您需要处理Multiple Dex文件。在应用build.gradle
&amp;的帮助下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
的Applicaiton类到MultiDexApplication
public class MyAppClass extends MultiDexApplication{
@Override
protected void attachBaseContext(Context newBase) {
MultiDex.install(newBase);
super.attachBaseContext(newBase);
}
}
如果有的话,请告诉我。
答案 1 :(得分:1)
我建议做以下事情 -
通过尝试运行Proguard删除未使用的函数并减少dex中函数的数量来检查这是否是65k方法限制(multidex)问题。
在静态变量/对象初始化期间抛出异常时,也会导致java.lang.NoClassDefFoundError。检查您是使用/继承RoboGuice类还是使用带有静态对象或代码块的初始化代码。问题可能来自那里。
另外,看一下RoboGuice 3.0 NoClassDefFoundError: AnnotationDatabaseImpl,它可能对你有所帮助(尽管用户得到的错误是关于另一个类,但它们的初始化是静态对象的错误)。
祝你好运。