有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Proguard成功地用Dagger 2.0混淆项目?

我很高兴看到谷歌的匕首叉已经上市。(在撰写本文时,我意识到它还没有“发布”。)我们有一款安卓应用程序,它大量使用dagger,尽管我们没有使用许多更高级的功能

我们有一个模糊代码的业务需求,所以我尝试升级到Dagger 2.0-SNAPSHOT,希望从Dagger中删除运行时反射可以运行模糊处理。。然而,我发现反射仍然用于在运行时加载类时使用的字符串常量

下面是我的proguard的相关部分。形态

-dontpreverify
-keepattributes *Annotation*,JavascriptInterface,SourceFile,LineNumberTable,Signature
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-ignorewarnings

-keep public class * extends 安卓.app.Activity
-keep public class * extends 安卓.app.Application
-keep public class * extends 安卓.app.Service
-keep public class * extends 安卓.app.Fragment
-keep public class * extends 安卓.content.BroadcastReceiver
-keep public class * extends 安卓.content.ContentProvider
-keep public class * extends 安卓.app.backup.BackupAgentHelper
-keep public class * extends 安卓.preference.Preference

-keep class 安卓.support.v4.app.** { *; }
-keep interface 安卓.support.v4.app.** { *; }

-keep public class * extends 安卓.view.View {
    public <init>(安卓.content.Context);
    public <init>(安卓.content.Context, 安卓.util.AttributeSet);
    public <init>(安卓.content.Context, 安卓.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(安卓.content.Context, 安卓.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(安卓.content.Context, 安卓.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 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
E/AndroidRuntime( 7228):    at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
E/AndroidRuntime( 7228):    at 安卓.app.ActivityThread.access$800(ActivityThread.java:135)
E/AndroidRuntime( 7228):    at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
E/AndroidRuntime( 7228):    at 安卓.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 7228):    at 安卓.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 7228):    at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 7228):    at com.安卓.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 安卓.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime( 7228):    at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime( 7228):    at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
E/AndroidRuntime( 7228):    ... 11 more

有人用谷歌的匕首叉试用过proguard吗


共 (2) 个答案

  1. # 2 楼答案

    最新的Dagger 2.0快照(在撰写本文时)与ProGuard配合得很好。我在ProGuard配置中为匕首2添加了规则。一切正常

    顺便说一句,我在我的项目中也使用了ButterKnife和greenDAO。两者都需要3-4条前进规则