【发布时间】:2013-08-07 11:22:23
【问题描述】:
我正在努力在现有应用程序中设置 Dagger (1.0.1)。它被配置为使用 ProGuard,但我使用 -dontobfuscate 禁用了它。
当我启用 dagger-compiler 时,它能够成功地生成一个带有依赖关系图的点文件,但是当我删除编译器并在发布模式下构建应用程序时,它在启动时崩溃,抱怨它无法创建对象图。
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.corp.myapp/com.corp.myapp.ui.activity.MainActivity}:
java.lang.IllegalStateException: Errors creating object graph:
No injectable members on com.corp.myapp.core.services.ConnectionMonitor. Do
you want to add an injectable constructor? required by
com.corp.myapp.core.services.ConnectionMonitor
com.corp.myapp.ui.activity.MyAppBaseActivity.connectionManager
No injectable members on com.corp.myapp.ui.crouton.CroutonManager. Do you want
to add an injectable constructor? required by
com.corp.myapp.ui.crouton.CroutonManager
com.corp.myapp.ui.activity.MyAppBaseActivity.croutonManager
No injectable members on com.corp.core.assembler.ResourceAssembler. Do you want
to add an injectable constructor? required by
com.corp.core.assembler.ResourceAssembler
com.corp.myapp.ui.activity.MyAppBaseActivity.resourceAssembler
我看到MyAppBaseActivity,它与CroutonManager 或ConnectionMonitor 的依赖关系显示在生成的点文件中,所以根据this comment,我希望这可以工作。 AFAIK 如果有问题,我用来生成点文件的启用编译器的构建应该会检测到它。
更新:
我之前说过
在调试模式下它永远不会失败
但经过进一步测试后并非如此:在 Debug 模式下它不会失败,因为 ProGuard 被禁用,而在 Release 模式下它默认启用。如果我在发布模式下构建应用程序但跳过 ProGuard,我也不会收到错误并且应用程序成功启动。所以这个问题肯定和我的 ProGuard 配置有关。
【问题讨论】:
-
为什么要删除发布模式的编译器?编译器旨在用于加快速度,因为在运行时不必进行注释处理。对我来说,通过删除 dagger-compiler 让应用程序在发布时运行速度变慢是没有意义的。
-
是的,我知道编译器可以提供这样的性能改进(除了编译时的图形验证)。我禁用它是因为我也在使用 ProGuard,根据 Square 的人的说法,避免问题的方法是禁用编译器并让 Dagger 在运行时生成所有必需的代码。
标签: android dependency-injection proguard dagger