6

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

应用proguarded和禁用multidex时不会出现这个问题,所以一定是multidex和Dagger 1问题引起的。

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

知道为什么它会崩溃VerifyError吗?

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

编辑

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

4

1 回答 1

0

正如这篇博文 [1] 中所指出的,您是在安装多 dex 后创建匕首图吗?所以在MultiDexApplication#attachBaseContext打电话给超级(或打电话给MultiDex.install()自己)之后。

[1] https://developers.soundcloud.com/blog/congratulations-you-have-a-lot-of-code-remedying-androids-method-limit-part-2

于 2015-10-12T03:28:20.350 回答