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
它和生成的点文件中的依赖关系CroutonManager
或ConnectionMonitor
显示,所以根据这个评论,我希望这个工作.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.inject
或dagger
注释以及所有无参数构造函数保留所有字段和方法.如果它们看起来未使用,ProGuard可能会删除它们,但Dagger实际上是通过反射注入/访问它们.这与RoboGuice类似.
它还必须保留Dagger生成的所有适配器类.
它还必须保留与这些适配器类相关的所有类名,因此名称仍然匹配.在这个示例中,这几乎是包中的所有类coffee
,因此最简单的方法是使用通配符.对于其他应用程序,此行将有所不同.
最后,它还必须保留类的名称dagger.Lazy
,因为它的名称在生成的代码中被硬编码为字符串.
归档时间: |
|
查看次数: |
5078 次 |
最近记录: |