2016-12-09 6 views
0

proguard를 사용하여 Android 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가 난독 화 될 것으로 예상했지만, 실제로 돈 '티. 프로 가드 룰에 실수가있을 수도 있지. 프로?

+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

감사합니다! 그것은 작동합니다! –