Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Dagger注入依赖项时在multidex应用程序中验证错误_Android_Dagger_Android Multidex - Fatal编程技术网

Android 使用Dagger注入依赖项时在multidex应用程序中验证错误

Android 使用Dagger注入依赖项时在multidex应用程序中验证错误,android,dagger,android-multidex,Android,Dagger,Android Multidex,库的示例应用程序有约67k个方法。它启用了multidex以克服65k方法的限制。不幸的是,启用multidex后,当尝试在主活动中注入EndpointAdapter时,应用程序在VerifyError上崩溃 此问题在应用程序已升级且禁用multidex时不会发生,因此它一定是由multidex和Dagger 1问题引起的 我确信EndpointAdapter在主dex文件中,但是Dagger生成的一些类位于multidex生成的第二个dex文件中。此问题发生在API

库的示例应用程序有约67k个方法。它启用了multidex以克服65k方法的限制。不幸的是,启用multidex后,当尝试在主活动中注入
EndpointAdapter
时,应用程序在
VerifyError
上崩溃

此问题在应用程序已升级且禁用multidex时不会发生,因此它一定是由multidex和Dagger 1问题引起的

我确信
EndpointAdapter
在主dex文件中,但是Dagger生成的一些类位于multidex生成的第二个dex文件中。此问题发生在API<21的设备上(例如使用KitKat 4.4.4的genymotion)

你知道为什么它会因为验证错误而崩溃吗

FATAL EXCEPTION: main
Process: pl.toro.libsample.debug, PID: 11775
java.lang.VerifyError: pl/toro/lib/network/EndpointAdapter
    at java.lang.Class.getDeclaredConstructors(Native Method)
    at java.lang.Class.getDeclaredConstructors(Class.java:574)
    at dagger.internal.loaders.ReflectiveAtInjectBinding.getConstructorsForType(ReflectiveAtInjectBinding.java:232)
    at dagger.internal.loaders.ReflectiveAtInjectBinding.create(ReflectiveAtInjectBinding.java:168)
    at dagger.internal.FailoverLoader.getAtInjectBinding(FailoverLoader.java:74)
    at dagger.internal.Linker.createBinding(Linker.java:224)
    at dagger.internal.Linker.linkRequested(Linker.java:141)
    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:309)
    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279)
    at pl.toro.lib.app.BaseApplication.inject(BaseApplication.java:135)
    ...
这是MultiDex标记的输出

VM with version 1.6.0 does not have multidex support
install
MultiDexExtractor.load(/data/app/pl.toro.libsample.debug-1.apk, false)
Detected that extraction must be performed.
Extraction is needed for file /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip
Extracting /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes-1477675005.zip
Renaming to /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip
Extraction success - length /data/data/pl.toro.libsample.debug/code_cache/secondary-dexes/pl.toro.libsample.debug-1.apk.classes2.zip: 187777
load found 1 secondary dex files
install done
编辑


我已经切换到匕首2,这个问题现在已经解决了。Dagger 2不再使用反射,反射是这个问题的主要因素。

正如在这篇博文[1]中指出的,您是在安装multi-dex后创建Dagger图的吗。因此,在调用super(或自己调用
MultiDex.install()
之后,在
MultiDexApplication#attachBaseContext


[1]

EndpointAdapter是否具有在辅助索引中接受参数的构造函数?另外,你能确认这个错误是在类加载器被修补之后发生的吗?我必须检查它。它有
@Inject
带注释的构造函数和2个依赖项,但我不确定依赖项在哪个索引中。“修补”是指在MultiDex初始化并打印“安装完成”日志后?是的,我正在检查,MultiDex成功完成。最后一个问题,你使用的是什么版本的Android SDK?MultiDex安装没有问题,我想,我很快会将MultiDex标签的完整输出附加到这个问题上。我的目标是API 22,但min SDK设置为15。这可能是API的一部分吗?描述错误,带有与验证相关(但不完全相同)的跟踪。抱歉,我不明白。调用super之后会发生什么?抱歉,如果您将
MultiDexApplication
子类化,那么在调用
super.attachBaseContext()
之后,您需要在
attachBaseContext
中创建匕首图。这有意义吗?你确定吗?它是在onCreate之后调用还是在onCreate之前调用?我不再使用匕首1了,所以我们需要其他人来确认这解决了问题。嗯,我想你是对的。始终在onCreate之前调用attachBaseContext()。看来我的答案是错的。