尽管Dagger可以生成点文件,但它无法创建对象图

Dav*_*iño 5 android dependency-injection proguard dagger

在现有的应用程序中,我正在努力设置Dagger(1.0.1).它被配置为使用ProGuard,但我禁用它进行此测试-dontobfuscate.

当我启用dagger-compiler时,它能够成功生成带有依赖关系图的点文件,但是当我删除编译器并在Release模式下构建应用程序时,它会在启动时崩溃,抱怨它无法创建对象图.

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
Run Code Online (Sandbox Code Playgroud)

我看到MyAppBaseActivity它和生成的点文件中的依赖关系CroutonManagerConnectionMonitor显示,所以根据这个评论,我希望这个工作.AFAIK如果出现问题,应该通过我用来生成点文件的编译器启用的构建来检测它.


更新:

我之前曾说过

在调试模式下它永远不会失败

但是在进一步测试之后并不是真的:在调试模式下它不会因ProGuard被禁用而失败,而在Release模式下它默认启用.如果我在发布模式下构建应用程序但跳过ProGuard,我也不会收到错误并且应用程序已成功启动.所以问题肯定与我的ProGuard配置有关.

Eri*_*une 17

Dagger非常依赖于反射和类名称,这些名称是硬编码的并且被操作为字符串.这使得代码难以缩小/优化/混淆.

以下配置适用于Dagger 1.1.0中的示例dagger/examples/simple:

-keepattributes *Annotation*

-keepclassmembers,allowobfuscation class * {
    @javax.inject.* *;
    @dagger.* *;
    <init>();
}

-keep class **$$ModuleAdapter
-keep class **$$InjectAdapter
-keep class **$$StaticInjection

-keepnames !abstract class coffee.*

-keepnames class dagger.Lazy
Run Code Online (Sandbox Code Playgroud)

配置使用javax.injectdagger注释以及所有无参数构造函数保留所有字段和方法.如果它们看起来未使用,ProGuard可能会删除它们,但Dagger实际上是通过反射注入/访问它们.这与RoboGuice类似.

它还必须保留Dagger生成的所有适配器类.

它还必须保留与这些适配器类相关的所有类名,因此名称仍然匹配.在这个示例中,这几乎是包中的所有类coffee,因此最简单的方法是使用通配符.对于其他应用程序,此行将有所不同.

最后,它还必须保留类的名称dagger.Lazy,因为它的名称在生成的代码中被硬编码为字符串.


归档时间:

查看次数:

5078 次

最近记录:

11 年,8 月 前