【问题标题】:How to successfully obfuscate project with Dagger 2.0 using Proguard?如何使用 Proguard 成功地用 Dagger 2.0 混淆项目?
【发布时间】:2014-09-24 19:13:44
【问题描述】:

我很高兴看到 google 的 Dagger 分支已经可用。 (在撰写本文时,我意识到它还没有“发布”。)我们有一个大量使用 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 的 dagger fork 试用过 proguard 吗?

【问题讨论】:

    标签: java android dependency-injection proguard dagger


    【解决方案1】:

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

    顺便说一句,我还在我的项目中使用 ButterKnife 和 greenDAO。两者都需要 3-4 个 ProGuard 规则。

    【讨论】:

      【解决方案2】:

      您似乎仍在使用 Dagger v1 - 在 2.0 存储库中,ObjectGraph 类不存在:https://github.com/google/dagger/tree/master/core/src/main/java/dagger

      虽然我看到您的问题在撰写本文时已经将近两个月了 - 您是否再次尝试使用 2.0-SNAPSHOT? Proguard 有问题吗?

      【讨论】:

      • 事实上,这正是发生的事情。 Dagger 2.0 首次在 github 上发布时,包含 1.0 代码并且没有更新示例项目。所以我错误地认为我使用的是 2.0。 dagger 1.0 代码最终从 dagger 2.0 fork 中移除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2015-08-11
      • 2010-10-14
      • 1970-01-01
      • 2012-06-24
      相关资源
      最近更新 更多