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?

InformationsquelleAutor derekv | 2014-09-24
Schreibe einen Kommentar