混淆
关于混淆的概念请移步郭霖大神博客:Android安全攻防战,反编译与混淆技术完全解析(下)。小白必看,全面易懂。
使用
这里就直接说怎么使用了。
简单总结了下,我们项目中的混淆规则基本分为两类:固定不变的和会改变的(这不是废话)。
因此在查了网上的资料后就整理出了下面的proguard文件。复制到项目中,稍微修改就OK了。
基本不变区域:顾名思义,绝大多数情况都不会变,Copy就OK了,注释也加上了
-
定制化区域:根据不同的项目会有不同的混淆规则
实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的。将你项目中实体类都拎出来。
第三方包要添加的混淆规则,具体请看你自己用了什么,再去官网或者GitHub找相关混淆规则。没有的话最好要根据包名自己写。具体怎么写,放到最后说
与js互相调用的类
-
与反射有关的类,工程中没有直接跳过
具体怎么写混淆规则,最好还是看郭神的博客。
混淆的文本
#-------------------------------------------基本不变区域-------------------------------------------
#--------------------------------- 基本指令区----------------------------------
#指定代码的压缩级别 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 ;
}
# 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 (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
public (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.* ;
#}
#-keepclasseswithmembernames class * {
# @butterknife.* ;
#}
#------------------------------------ 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 ;
}
-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也没有,自己看第三方的包名,然后添加
找到三方包
compile 'com.google.zxing:core:3.2.1'
根据冒号之后的jar包名在Preject视图下的External Libraries中找到对应的jar包
core:3.2.1---->core-3.2.1
下面就是添加混淆规则
-keep class com.google.zxing.** {*;}
这样就大功告成了
后续会将常用的第三方框架的混淆规则添加上来,方便查找