我很高兴看到谷歌的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(android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (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 ; @javax.inject.Inject (...); } -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
有没有人用谷歌的匕首叉尝试过proguard呢?
最新的Dagger 2.0 SNAPSHOT(编写此内容)与ProGuard完美搭配.我在ProGuard配置中没有为Dagger 2 添加规则.一切正常.
顺便说一句,我也在我的项目中使用ButterKnife和greenDAO.两者都需要3-4个ProGuard规则.