2014-09-24 9 views
8

Sono stato felice di vedere la forcella di Dagger di google è stata resa disponibile. (Al momento in cui scrivo, mi rendo conto che non è ancora stato "rilasciato"). Abbiamo un'app per Android che usa molto il pugnale, sebbene non usiamo molte delle funzionalità più avanzate.Come nascondere con successo il progetto con Dagger 2.0 usando Proguard?

Abbiamo un requisito aziendale per offuscare il nostro codice, quindi ho tentato un aggiornamento a Dagger 2.0-SNAPSHOT nella speranza che la rimozione del riflesso di runtime da Dagger renderebbe possibile eseguire l'offuscamento .. tuttavia sono trovare quel riflesso è ancora usato in termini di costanti di stringa utilizzate in fase di runtime per caricare le classi.

Di seguito sono riportati i bit rilevanti del mio 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 

Come potete vedere ho disattivato gran parte dell'offuscamento. Ciò consente ad alcune classi di essere iniettate correttamente, tuttavia non riesce ancora a iniettare una classe paticolare.

Qui è l'eccezione:

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 

Qualcuno ha provato Proguard con la forchetta il pugnale di Google?

risposta

9

L'ultimo Dagger 2.0 SNAPSHOT (come da questo scritto) funziona bene con ProGuard. Ho aggiunto no regole per Dagger 2 nella mia configurazione di ProGuard. Tutto funziona.

BTW Sto usando anche ButterKnife e greenDAO nel mio progetto. Entrambi hanno bisogno di 3-4 regole ProGuard.

1

Sembra che si sta ancora utilizzando Dagger v1 - nel repository 2.0, la classe ObjectGraph non esiste: https://github.com/google/dagger/tree/master/core/src/main/java/dagger

Anche se vedo che la tua domanda è quasi due mesi di età al momento della stesura - avete provato di nuovo usando 2.0-SNAPSHOT? Hai ancora un problema con Proguard?

+0

Ho davvero bisogno di aggiornare questo, grazie per avermelo ricordato. – derekv

+0

In effetti, questo è esattamente quello che è successo. Dagger 2.0, quando è stato rilasciato per la prima volta su github, includeva il codice 1.0 e non aveva aggiornato i progetti di esempio. Quindi credevo erroneamente che stavo usando 2.0. Il codice del pugnale 1.0 è stato finalmente rimosso dalla forcella del pugnale 2.0. – derekv