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.** {*;}

这样就大功告成了

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容