2016-12-09 7 views
0

Я создал выпускное приложение Android с proguard, но после декомпиляции APK я вижу, что классы, которые должны быть запутаны, имеют обычные источники. Там это часть моей Gradle сборки:Android proguard не обфускает классы

buildTypes { 
    debug { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
    } 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
    } 
} 

А вот мой proguard-rules.pro файл:

-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-keepattributes *Annotation* 

-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.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 

-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*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep public class * extends android.support.v4.app.Fragment 
-keep public class * extends android.app.Fragment 

-keepnames class * implements java.io.Serializable 

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    !static !transient <fields>; 
    !private <fields>; 
    !private <methods>; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 

-assumenosideeffects class android.util.Log { 
    public static *** e(...); 
    public static *** w(...); 
    public static *** wtf(...); 
    public static *** d(...); 
    public static *** v(...); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 
-keepclassmembers class * { 
    public void *ButtonClicked(android.view.View); 
} 

-dontwarn okio** 
-dontwarn java.lang.invoke** 
-dontwarn org.apache.commons.io** 
-dontwarn org.codehaus** 
-keep public class java.nio** 
-dontwarn android.support.v4.** 
-keep class android.support.v4.** { *; } 
-dontwarn android.support.v7.** 
-keep class android.support.v7.** { *; } 
-keep class net.sqlcipher.** { *; } 

-keep class net.sqlcipher.database.** { *; } 

-keep class retrofit2.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 
-keep class com.squareup.okhttp.** { *; } 
-keep interface com.squareup.okhttp.** { *; } 
-keep class com.google.gson.** { *; } 
-keep class com.google.inject.* { *; } 
-keep class org.apache.http.** { *; } 
-keep class org.apache.james.mime4j.** { *; } 
-keep class javax.inject.** { *; } 
-keepclassmembernames interface * { 
    @retrofit.http.* <methods>; 
} 

-keep class sun.misc.Unsafe { *; } 
-keep public class !com.vidal.cardio.datas.MySQLCipherOpenHelper { *; } 
-keep public class !com.vidal.cardio.datas.SCLcipherOpenHelper { *; } 

Ну, я ожидал, что MySQLCipherOpenHelper и SCLcipherOpenHelper будет запутанным, но на самом деле они надевают «т. Может быть, в proguard-rules.pro есть ошибка?

+0

Возможный дубликат (http://stackoverflow.com/questions/40811898/proguard-obfuscation-doesnt-work-on-activities) –

ответ

1

Keep правила будут проанализированы и обработаны независимо друг от друга, так что если вы пишете правила, как этот

-keep public class !com.vidal.cardio.datas.MySQLCipherOpenHelper { *; } 
-keep public class !com.vidal.cardio.datas.SCLcipherOpenHelper { *; } 

ProGuard будет делать следующее:

  • процессу первое правило, чтобы сохранить все, кроме MySQLCipherOpenHelper
  • обрабатывать второе правило, чтобы сохранить все, кроме SCLcipherOpenHelper

, как вы можете видеть, с первым правилом вы также неявно сохраняете второй класс, тогда как со вторым правилом вы также сохраняете первый.

Для того, чтобы не держать их обоих, вы должны объединить такие правила, что: [? Proguard запутывания не работает на деятельности]

-keep public class !com.vidal.cardio.datas.MySQLCipherOpenHelper, 
        !com.vidal.cardio.datas.SCLcipherOpenHelper { *; } 
+0

Спасибо! Оно работает! –

 Смежные вопросы

  • Нет связанных вопросов^_^