• Android混淆配置及总结


    Android打正式的release包混淆是必备的,避免APP被反编译,使项目中隐秘的技术或信息被别人查看。

    Android studio则写在proguard-rules.pro中,当然写在proguard-android.txt中也可以。

    gradle配置

    buildTypes {   
         release {        
               buildConfigField "boolean", "LOG_DEBUG", "false" //不显示log    
               zipAlignEnabled true     //Zipalign优化   
               shrinkResources true    // 移除无用的resource文件   
               minifyEnabled true     //混淆    
               proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    
         }
    }

     经常用第三方SDK的时候会忘了顺手把混淆加进来,到了打包的时候又去找,很是麻烦,因此在这里总结一下

    -optimizationpasses 5 # 指定代码的压缩级别
    -dontusemixedcaseclassnames # 是否使用大小写混合
    -dontpreverify # 混淆时是否做预校验
    -verbose # 混淆时是否记录日志
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
    -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 # 保持哪些类不被混淆
    -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 
       native <methods>;
    }
    -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 
       public <init>(android.content.Context, android.util.AttributeSet);
    }
    -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 
       public <init>(android.content.Context, android.util.AttributeSet, int); 
    }
    -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆  
       public void *(android.view.View);
    }
    -keepclassmembers enum * { # 保持枚举 enum 类不被混淆  
       public static **[] values(); 
       public static ** valueOf(java.lang.String);
    }
    -keep class * implements android.os.Parcelable {#保持Parcelable不被混淆
       public static final android.os.Parcelable$Creator *;
    }
    # Explicitly preserve all serialization members. The Serializable interface
    # is only a marker interface, so it wouldn't save them.
    # 显式保留所有序列化成员。可序列化接口只是一个标记接口,因此不会保存它们。
    -keep public class * implements java.io.Serializable {*;} -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } -keepclassmembers class * { public
    <init> (org.json.JSONObject); } #com.demo.demo 是你的包名 -keep public class com.demo.demo.R$*{ public static final int *; }

    1. Gson  GitHub地址

    # removes such information by default, so configure it to keep all of it.
    -keepattributes Signature
    # Gson specific classes
    -keep class sun.misc.Unsafe { *; }
    -keep class com.google.gson.stream.** { *; }
    # Application classes that will be serialized/deserialized over Gson
    -keep class com.google.gson.examples.android.model.** { *; }
    -keep class com.google.gson.** { *;}
    #这句非常重要,主要是滤掉 com.demo.demo.bean包下的所有.class文件不进行混淆编译,com.demo.demo是你的包名
    -keep class com.demo.demo.bean.** {*;}

    2. Butterknife  GitHub地址

    -keep class butterknife.** { *; }
    -dontwarn butterknife.internal.**
    -keep class **$$ViewBinder { *; }
    -keepclasseswithmembernames class * {    
       @butterknife.* <fields>;
    }
    -keepclasseswithmembernames class * {    
       @butterknife.* <methods>;
    }

    3. SlidingMenu   GitHub地址

    -dontwarn com.jeremyfeinstein.slidingmenu.lib.**
    -keep class com.jeremyfeinstein.slidingmenu.lib.**{*;}

    4. ImageLoader   GitHub地址

    #Universal Image Loader
    -keep class com.nostra13.universalimageloader.** { *; }
    -keepattributes Signature

    5. ShareSDK   文档

    -keep class cn.sharesdk.**{*;}
    -keep class com.sina.**{*;}
    -keep class **.R$* {*;}
    -keep class **.R{*;}
    -dontwarn cn.sharesdk.**
    -dontwarn **.R$*
    -dontwarn com.tencent.**
    -keep class com.tencent.** {*;}

    6. Okhttp-OkGo  GitHub地址

    #okhttp
    -dontwarn okhttp3.**
    -keep class okhttp3.**{*;}
    
    #okio
    -dontwarn okio.**
    -keep class okio.**{*;}

    7. RxJava    GitHub地址

    # RX
    -dontwarn rx.**
    -keepclassmembers class rx.** { *; }
    # retrolambda
    -dontwarn java.lang.invoke.*

    8. Glide    GitHub地址

    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {   
      **[] $VALUES; 
      public *;
    }

    9. 环信SDK   文档

    -keep class com.easemob.** {*;}
    -keep class org.jivesoftware.** {*;}
    -keep class org.apache.** {*;}
    -dontwarn  com.easemob.**
    #2.0.9后的不需要加下面这个keep
    #-keep class org.xbill.DNS.** {*;}
    #另外,demo中发送表情的时候使用到反射,需要keep SmileUtils
    -keep class com.easemob.chatuidemo.utils.SmileUtils {*;}
    #注意前面的包名,如果把这个类复制到自己的项目底下,比如放在com.example.utils底下,应该这么写(实际要去掉#)
    #-keep class com.example.utils.SmileUtils {*;}
    #如果使用easeui库,需要这么写
    -keep class com.easemob.easeui.utils.EaseSmileUtils {*;}
    #2.0.9后加入语音通话功能,如需使用此功能的api,加入以下keep
    -dontwarn ch.imvs.**
    -dontwarn org.slf4j.**
    -keep class org.ice4j.** {*;}
    -keep class net.java.sip.** {*;}
    -keep class org.webrtc.voiceengine.** {*;}
    -keep class org.bitlet.** {*;}
    -keep class org.slf4j.** {*;}
    -keep class ch.imvs.** {*;}
  • 相关阅读:
    TCP拥塞控制机制
    C/S 与 B/S 区别
    ext4文件系统新特性
    关于TCP慢启动和拥塞避免的题
    [信息图表]移动学习 Go Study
    [时间线]Android市场的发展
    学习,只有勤奋是不够的……
    UNIX域套接字实例
    程序员的本质
    淘宝Web服务器Tengine正式开源
  • 原文地址:https://www.cnblogs.com/steffen/p/9886141.html
Copyright © 2020-2023  润新知