Wie erfolgreich verschleiern Projekt mit Dolch 2.0 mit Proguard?
War ich glücklich, zu sehen, die google-fork von Dolch zur Verfügung gestellt wurde. (Zum Zeitpunkt des Schreibens dieses Artikels, wird mir klar, dass es nicht "freigegeben" noch nicht.) wir haben eine android-app, die verwendet Dolch stark, obwohl wir nicht viele der erweiterten features.
Wir haben eine business-Anforderung zu verschleiern, die unseren code, so habe ich versucht ein upgrade zu Dolch 2.0-SNAPSHOT, in der Hoffnung, dass die Entfernung von Laufzeit-Reflexion der Dolch, der es möglich machen würde, zu laufen, Verschleierung.. aber ich finde, dass die Reflexion immer noch in Form von string-Konstanten werden zur Laufzeit verwendet, um Klassen zu laden.
Unten ist das entsprechende bit meines 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
Wie Sie sehen können, habe ich ausgeschaltet viel von der Verschleierung. Dies ermöglicht für einige Klassen injiziert werden, richtig, aber es immer noch nicht auf die Injektion ein besonderes Klasse.
Hier ist die Ausnahme:
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
Hat jemand versucht, aus proguard mit Google ' s dagger Gabel noch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neuesten Dolch 2.0 SNAPSHOT (wie geschrieben) spielt schön mit ProGuard. Ich fügte hinzu, keine Regeln für Dolch 2 in meinem ProGuard-Konfiguration. Alles funktioniert einfach.
BTW ich bin auch mit ButterKnife und greenDAO in meinem Projekt. Beide brauchen 3-4 ProGuard Regeln.
Sieht es aus wie Sie sind immer noch mit Dolch v1 - in der 2.0-repo, die
ObjectGraph
Klasse nicht existiert: https://github.com/google/dagger/tree/master/core/src/main/java/daggerObwohl ich sehe, dass Ihre Frage ist fast zwei Monate alt, als des Schreibens dieses Artikels - haben Sie versucht, wieder mit
2.0-SNAPSHOT
? Haben Sie noch ein problem mit Proguard?