Android 混淆总结

混淆

关于混淆的概念请移步郭霖大神博客:Android安全攻防战,反编译与混淆技术完全解析(下)。小白必看,全面易懂。

使用

这里就直接说怎么使用了。

简单总结了下,我们项目中的混淆规则基本分为两类:固定不变的和会改变的(这不是废话)。

因此在查了网上的资料后就整理出了下面的proguard文件。复制到项目中,稍微修改就OK了。

  • 基本不变区域:顾名思义,绝大多数情况都不会变,Copy就OK了,注释也加上了

  • 定制化区域:根据不同的项目会有不同的混淆规则

    1. 实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的。将你项目中实体类都拎出来。

    2. 第三方包要添加的混淆规则,具体请看你自己用了什么,再去官网或者GitHub找相关混淆规则。没有的话最好要根据包名自己写。具体怎么写,放到最后说

    3. 与js互相调用的类

    4. 与反射有关的类,工程中没有直接跳过

具体怎么写混淆规则,最好还是看郭神的博客。

混淆的文本

#-------------------------------------------基本不变区域-------------------------------------------
#---------------------------------  基本指令区----------------------------------
#指定代码的压缩级别 0 - 7
-optimizationpasses 7
#不使用大小写混合
-dontusemixedcaseclassnames
#表示不跳过library中的非public的类。
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
#表示不进行优化,建议使用此选项,因为根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险
-dontoptimize
# 表示不进行预校验。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。
-dontpreverify

 # 混淆时所采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#表示对注解(内部类?)中的参数进行保留。
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

#----------------------  记录生成的日志数据,gradle build时在本项目根目录输出----------------------
 #混淆时是否记录日志
-verbose
#apk 包内所有 class 的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射,热更新时比较重要的数据
-printmapping proguardMapping.txt
#---------------------  记录生成的日志数据,gradle build时 在本项目根目录输出-end-----------------

#--------------------------------- 默认保留区---------------------------------
#不混淆四大组件,Fragment,V4,V7,注解 等相关类
-keep public class * extends android.view.View
-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.preference.Preference
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.annotation.**
-keep public class * extends android.support.v7.**

-keep class android.support.** {*;}
-keepattributes *Annotation*

#表示不混淆下面的两个类,这两个类我们基本也用不上,是接入Google原生的一些服务时使用的。
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

#表示不混淆任何包含native方法的类的类名以及native方法名
-keepclasseswithmembernames class * {
    native <methods>;
}
# onClick方法不能被混淆,保证在XML中的onClick=XXXX正常 
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
}
#枚举不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
#表示不混淆任何一个View中的set和get方法,因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。
#同样不混淆自定义的View,
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
# Parcelable和Serializable序列化数据不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-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();
}
# 不混淆R文件
-keep class **.R$* {
 *;
}
-keepclassmembers class * {
    void *(**On*Event);
}
#----------------------------------------------------------------------------

#--------------------------------- webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, jav.lang.String);
}
#----------------------------------------------------------------------------


#-------------------------------------------定制化区域----------------------------------------------
#========================= 1.实体类,涉及到与服务端的交互等,也就是Bean类或者Model相关类 ===========================
# 本文件中放到了Gson的混淆规则中

#============================================ 2.第三方包    =========================================
#--------------------------------------  Gson   -------------------- -------------------------------
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson 下面替换成自己的实体类
#-keep class xx.xx.xx.bean.** { *; }

#-----------------------------------  ButterKnife--------------------------------------------------
#-keep class butterknife.** { *; }
#-dontwarn butterknife.internal.**
#-keep class **$$ViewBinder { *; }
#-keepclasseswithmembernames class * {
#    @butterknife.* <fields>;
#}
#-keepclasseswithmembernames class * {
#    @butterknife.* <methods>;
#}
#------------------------------------ Retrofit 2 ---------------------------------------------------
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

#-------------------------------------RxJava2  RxAndroid--------------------------------------------
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-dontnote rx.internal.util.PlatformDependent

#-------------------------------------RxJava2 与 Retrofit 的适配-------------------------------------
#-keep class com.jakewharton.retrofit2.adapter.rxjava2.** {*;}


#--------------------------------------- OKHttp3----------------------------------------------------
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

#----------------------------------------Fresco-----------------------------------------------------
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
    @com.facebook.common.internal.DoNotStrip *;
}
-keepclassmembers class * {
    native <methods>;
}
-dontwarn okio.**
-dontwarn com.squareup.okhttp.**
-dontwarn okhttp3.**
-dontwarn javax.annotation.**
-dontwarn com.android.volley.toolbox.**
-dontwarn com.facebook.infer.**

#----------------------------------------配合Fresco使用的PhotoView  不用添加-------------------------

#----------------------------------------二维码扫描使用的框架   --------------------------------------
-keep class com.google.zxing.{ *;}
-dontwarn com.google.zxing.**

-dontwarn cn.bingoogolapple.**
-keep class cn.bingoogolapple.*{ *;}

#----------------------------------------数据库框架Litepal  -----------------------------------------
-keep class org.litepal.** {*;}



#---------------------------------------- Log框架  已经在Gradle中设置release不使用,不用添加规则-------
#---------------------------------------- MPermission 混淆规则------------------------
-dontwarn com.zhy.m.**
-keep class com.zhy.m.** {*;}
-keep interface com.zhy.m.** { *; }
-keep class **$$PermissionProxy { *; }
#----------------------------------------LeakCanary-----------------------------------------




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

#------------------------------------------------------JPush  --------------------------------------

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }


#======================================= 3.与js互相调用的类 =========================================
#---TODO 接口
#-keep class com.burning.iplay.ui.detail.** {*;}


#======================================= 4.反射相关的类和方法 =======================================

#---- TODO 自己使用反射用到的类和方法

#--------------------------------------------------------------------------------------------------

第三方包的混淆规则

  • 一般官网或者GitHub都会有

  • 若没有,去GitHub的Issues(问题)中去找

Issues.png
  • Issues也没有,自己看第三方的包名,然后添加

    找到三方包

         compile 'com.google.zxing:core:3.2.1'
    

    根据冒号之后的jar包名在Preject视图下的External Libraries中找到对应的jar包

​ core:3.2.1---->core-3.2.1

packageName.png

​ 下面就是添加混淆规则

    -keep class com.google.zxing.** {*;}

这样就大功告成了

后续会将常用的第三方框架的混淆规则添加上来,方便查找

推荐阅读更多精彩内容