2014-09-24 2 views
8

Google의 대거 포크가 출시 된 것을보고 기뻤습니다. (이 글을 쓰고있는 시점에서 아직 출시되지 않았다는 것을 알고 있습니다.) 우리는 더 많은 고급 기능을 많이 사용하지는 않지만 단도를 많이 사용하는 Android 앱을 보유하고 있습니다.Proguard를 사용하여 Dagger 2.0으로 프로젝트를 난독 화하는 방법은 무엇입니까?

우리는 코드를 난처하게하는 비즈니스 요구 사항이 있으므로 단검에서 런타임 리플렉션을 제거하면 난독 화를 실행할 수 있기를 기대하면서 단검 2.0-SNAPSHOT으로 업그레이드를 시도했습니다. 클래스가로드 할 때 런타임에 사용되는 문자열 상수에 대해 여전히 리플렉션이 사용된다는 것을 알았습니다.

다음은 내 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 

사람이 아직 구글의 단검 포크 함께 난독 시도했습니다 : 여기

은 예외?

여전히 단검의 V1을 사용하는 것 같습니다

답변

9

최신 단검 2.0 SNAPSHOT (작성 중)은 ProGuard와 잘 어울립니다. 내 ProGuard 구성에서 단검 2에 아니요 규칙을 추가했습니다. 모든 것이 효과가 있습니다.

BTW 또한 프로젝트에서 ButterKnife 및 greenDAO를 사용하고 있습니다. 둘 다 3-4 ProGuard 규칙이 필요합니다.

1

- 2.0의 repo에서 ObjectGraph 클래스가 존재하지 않습니다 https://github.com/google/dagger/tree/master/core/src/main/java/dagger

을 나는 귀하의 질문에이 글을 쓰는 등의 거의 2 개월 된 것을 볼 수 있지만 - 당신이 2.0-SNAPSHOT을 사용하여 다시 시도 했습니까? Proguard에 여전히 문제가 있습니까?

+0

정말로 이것을 고칠 필요가 있습니다. 나를 상기시켜 주셔서 감사합니다. – derekv

+0

실제로 이것은 정확히 일어난 일입니다. Dagger 2.0은 github에서 처음 릴리스되었을 때 1.0 코드를 포함하고 예제 프로젝트를 업데이트하지 않았습니다. 그래서 나는 내가 2.0을 사용하고 있다고 잘못 생각했다. 단검 1.0 코드는 단검 2.0 포크에서 마지막으로 제거되었습니다. – derekv

관련 문제