我很高兴看到谷歌的Dagger分叉已经上市。 (在撰写本文时,我意识到它还没有“发布”。)我们有一个使用匕首的Android应用程序,虽然我们没有使用许多更高级的功能。
我们有一个业务要求来混淆我们的代码,所以我尝试升级到Dagger 2.0-SNAPSHOT,希望从Dagger中删除运行时反射可以运行混淆..但是我找到了该反射仍然用于在运行时用于加载类的字符串常量。
以下是我的proguard.conf的相关内容。
-dontpreverify
-keepattributes *Annotation*,JavascriptInterface,SourceFile,LineNumberTable,Signature
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-ignorewarnings
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.app.Fragment
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
###### dagger 2.0 stuff
-keep class dagger.** { *; }
-keep interface dagger.** { *; }
-keepnames class com.ourcompany.**
-keep class **$$ModuleAdapter { *; }
-keepnames class **$$InjectAdapter { *; }
-keepclassmembers class * {
@javax.inject.Inject <fields>;
@javax.inject.Inject <init>(...);
}
-adaptclassstrings
正如你所看到的,我已经关闭了很多混淆。这允许正确地注入一些类,但是在注入一个特定类时它仍然失败。
以下是例外:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ourcompany.mobile.ourapp/com.ourcompany.mobile.ourapp.MainActivity}: java.lang.IllegalStateException: Unable to create binding for com.ourcompany.mobile.ourapp.LogMetricsHelper
E/AndroidRuntime( 7228): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
E/AndroidRuntime( 7228): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
E/AndroidRuntime( 7228): at android.app.ActivityThread.access$800(ActivityThread.java:135)
E/AndroidRuntime( 7228): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
E/AndroidRuntime( 7228): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 7228): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 7228): at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 7228): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 7228): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 7228): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 7228): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 7228): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 7228): Caused by: java.lang.IllegalStateException: Unable to create binding for com.ourcompany.mobile.ourapp.LogMetricsHelper
E/AndroidRuntime( 7228): at dagger.internal.Linker.linkRequested(Linker.java:147)
E/AndroidRuntime( 7228): at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:320)
E/AndroidRuntime( 7228): at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:290)
E/AndroidRuntime( 7228): at com.ourcompany.mobile.module.ScopedActionBarActivity.onCreate(ScopedActionBarActivity.java:20)
E/AndroidRuntime( 7228): at com.ourcompany.mobile.ourapp.BaseActivity.onCreate(BaseActivity.java:68)
E/AndroidRuntime( 7228): at com.ourcompany.mobile.ourapp.MainActivity.onCreate(MainActivity.java:146)
E/AndroidRuntime( 7228): at android.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime( 7228): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime( 7228): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
E/AndroidRuntime( 7228): ... 11 more
有没有人用Google的匕首叉尝试过proguard?
答案 0 :(得分:9)
最新的Dagger 2.0 SNAPSHOT(编写此内容)与ProGuard完美搭配。我在ProGuard配置中为Dagger 2添加了 no 规则。一切正常。
BTW我也在我的项目中使用ButterKnife和greenDAO。两者都需要3-4个ProGuard规则。
答案 1 :(得分:1)
看起来你还在使用Dagger v1 - 在2.0回购中,ObjectGraph
类不存在:https://github.com/google/dagger/tree/master/core/src/main/java/dagger
虽然在撰写本文时我发现您的问题已近两个月了 - 您是否再次尝试使用2.0-SNAPSHOT
?你还有Proguard的问题吗?