2016-12-09 164 views
0

我已经使用proguard构建了一个发布Android应用程序,但在反编译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 { *; } 

嗯,我预计MySQLCipherOpenHelperSCLcipherOpenHelper会被混淆,但实际上他们不“T。也许在proguard-rules.pro中有错误?

+0

的可能的复制(http://stackoverflow.com/questions/40811898/proguard-obfuscation-doesnt-work-on-activities) –

回答

1

保持规律进行分析,并相互独立地进行处理,所以如果你写这样

-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

谢谢!有用! –