您的位置:首页 > 移动开发

防止APP被反编译,混淆设置

2017-03-09 11:47 155 查看
1.首先需要在app下的build.gradle下配置,true表示编译时会混淆代码

[html] view
plain copy

<span style="font-size:18px;">buildTypes {  

        release {  

      

            minifyEnabled true  

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  

        }  

    }</span>  

2.在proguard-rules.pro中配置,一下是基本的配置

[html] view
plain copy

<span style="white-space:pre">        </span><pre name="code" class="html"><span style="white-space:pre">       </span>-dontshrink  

            #指定代码的压缩级别  

            -optimizationpasses 5  

  

            #包明不混合大小写  

            -dontusemixedcaseclassnames  

  

            #不去忽略非公共的库类  

            -dontskipnonpubliclibraryclasses  

  

             #优化  不优化输入的类文件  

            -dontoptimize  

  

             #不做预校验  

            -dontpreverify  

  

             #混淆时是否记录日志  

            -verbose  

  

             # 混淆时所采用的算法  

            -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  

  

            #保护注解  

            -keepattributes *Annotation*  

  

            # 保持哪些类不被混淆  

            -keep public class * extends android.app.Fragment  

            -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.app.backup.BackupAgentHelper  

            -keep public class * extends android.preference.Preference  

            -keep public class com.android.vending.licensing.ILicensingService  

            #如果有引用v4包可以添加下面这行  

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

  

            #忽略警告  

            -ignorewarning  

  

            ##记录生成的日志数据,gradle build时在本项目根目录输出##  

  

            #apk 包内所有 class 的内部结构  

            -dump class_files.txt  

            #未混淆的类和成员  

            -printseeds seeds.txt  

            #列出从 apk 中删除的代码  

            -printusage unused.txt  

            #混淆前后的映射  

            -printmapping mapping.txt  

  

            ########记录生成的日志数据,gradle build时 在本项目根目录输出-end######  

  

  

            #####混淆保护自己项目的部分代码以及引用的第三方jar包library#######  

  

            #-libraryjars libs/umeng-analytics-v5.2.4.jar  

  

            #三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar  

            #-libraryjars libs/sdk-v1.0.0.jar  

            #-libraryjars libs/look-v1.0.1.jar  

  

            #如果不想混淆 keep 掉  

            -keep class com.lippi.recorder.iirfilterdesigner.** {*; }  

            #项目特殊处理代码  

  

            #忽略警告  

            -dontwarn com.lippi.recorder.utils**  

            #保留一个完整的包  

            -keep class com.lippi.recorder.utils.** {  

                *;  

             }  

  

            -keep class  com.lippi.recorder.utils.AudioRecorder{*;}  

  

  

            #如果引用了v4或者v7包  

            -dontwarn android.support.**  

  

            ####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####  

  

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

            }  

  

            #保持 native 方法不被混淆  

#           -keepclasseswithmembernames class * {  

#               native <methods>;  

#           }  

  

            # Keep names - Native method names. Keep all native class/method names.  

            -keepclasseswithmembers,allowshrinking class * {  

                native <methods>;  

            }  

  

            #保持自定义控件类不被混淆  

            -keepclasseswithmembers class * {  

                public <init>(android.content.Context, android.util.AttributeSet);  

            }  

  

            #保持自定义控件类不被混淆  

            -keepclassmembers class * extends android.app.Activity {  

               public void *(android.view.View);  

            }  

  

            #保持 Parcelable 不被混淆  

            -keep class * implements android.os.Parcelable {  

              public static final android.os.Parcelable$Creator *;  

            }  

  

            #保持 Serializable 不被混淆  

            -keepnames class * implements java.io.Serializable  

  

            #保持 Serializable 不被混淆并且enum 类也不被混淆  

            -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();  

            }  

  

            #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可  

            #-keepclassmembers enum * {  

            #  public static **[] values();  

            #  public static ** valueOf(java.lang.String);  

            #}  

  

            -keepclassmembers class * {  

                public void *ButtonClicked(android.view.View);  

            }  

  

            #不混淆资源类  

            -keepclassmembers class **.R$* {  

                public static <fields>;  

            }  



[html] view
plain copy

如果有H5交互页面配置如下  

[html] view
plain copy

<span style="white-space:pre">    </span>    #不混淆H5交互  

            -keepattributes *JavascriptInterface*  

  

<span style="white-space:pre">    </span>    #ClassName是类名,H5_Object是与javascript相交互的object,建议以内部类形式书写  

            -keepclassmembers   class **.ClassName$H5_Object{  

                *;  

            }  

[html] view
plain copy

如果使用有Gson,则添加以下配置  

[html] view
plain copy

<span style="white-space:pre">    </span>   -keepattributes Signature  

             

            -keepattributes *Annotation*<pre name="code" class="html"><span style="white-space:pre">  </span>    -keep class sun.misc.Unsafe { *; }   

[html] view
plain copy

<span style="white-space:pre">    </span>     #下面需要填写自己bean对象对应的包名,所以建议将使用Gson解析的都放在同一包下<pre name="code" class="html"><span style="white-space:pre">    </span>    -keep class com.dingyan.students.javabean.** { *; }  




[html] view
plain copy

如果使用了其它的第三方包,则需要参照文档进行配置,否则会有莫名其妙的错误。  




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: