Android 混淆配置

前言

为什么要混淆呢? Android最大的乐趣就是可以反编译看代码,一边用一边骂对方代码写的low.本人为了防止被骂,所以总结一下混淆的基本配置.废话不说直接上配置

1 .在app的build,gradle 文加下开启混淆
     release {                      minifyEnabled true // 混淆            zipAlignEnabled true // Zipalign优化          shrinkResources true  // 移除无用的resource文件           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  // 加载默认混淆配置文件signingConfig signingConfigs.relealse  // 签名}
2 混淆的规则
  1. 四大组件不能混淆,activity service 等

  2. 自定义View不能混淆,因为在xml里面引用需要根据View的名字去找

  3. menu不能混淆

  4. native方法不能混淆

  5. js调用java方法不能混淆

  6. 反射类不能混淆

  7. 实体类不能混淆

  8. 序列化类不能混淆

  9. 注解不能混淆

3 配置模板
  1. 基本配置
#基本配置
# 设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的成员
-dontskipnonpubliclibraryclassmembers
# 混淆时不做预校验
-dontpreverify
# 混淆时不记录日志
-verbose
# 忽略警告
-ignorewarning
# 代码优化
-dontshrink
# 不优化输入的类文件
-dontoptimize
# 保留注解不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 保留代码行号,方便异常信息的追踪
-keepattributes SourceFile,LineNumberTable
# 混淆采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*# dump.txt文件列出apk包内所有class的内部结构
-dump class_files.txt
# seeds.txt文件列出未混淆的类和成员
-printseeds seeds.txt
# usage.txt文件列出从apk中删除的代码
-printusage unused.txt
# mapping.txt文件列出混淆前后的映射
-printmapping mapping.txt

2 不需要混淆的Android类

-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService

3 support下的所有类以及内部类,以及

#support
-keep class android.support.** {*;}
-dontwarn android.support.**
-keep interface android.support.** { *; }#adnroidX
-keep class androidx.** {*;}
-keep interface androidx.** {*;}
-keep public class * extends androidx.**
-dontwarn androidx.**

4 suppor V4和V7库

-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**

5 support design库

#support
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
#adnroidX
-keep class com.google.android.material.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**

6 避免混淆自定义控件的set和get方法

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

7 关闭log日志,这个是实际测试无法取消掉所有的log打印,一般我们都是自定义log类,这样就是你的包名+你自定义的log方法.这个还要注意 dontoptimize不要配置,不然将会关闭优化,导致日志语句不会被优化掉。

-assumenosideeffects class android.util.Log {public static boolean isLoggable(java.lang.String, int);public static int v(...);public static int i(...);public static int w(...);public static int d(...);public static int e(...);
}
-assumenosideeffects class 包名.LogUtils{public static *** d(...);public static *** v(...);public static *** i(...);public static *** e(...);public static *** w(...);}

8 避免R文件混淆

-keep class **.R$* {*;}

9 避免layout文件里面给设置的onclick属性

-keepclassmembers class * extends android.app.Activity{public void *(android.view.View);
}

10 避免回调函数 onxxevent方法混淆

-keepclassmembers class * {void *(*Event);
}

11 避免混淆枚举

-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}

12 Native方法混淆

-keepclasseswithmembernames class * {native <methods>;
}

13 避免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;!static !transient <fields>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}

14 避免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);
}
-keep public class [包名.类名]$[内部类]{public *;
}
-keepattributes JavascriptInterface
4 常用第三方库混淆配置,这个要根据你使用给的版本去官网找
  1. butterKnife混淆

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

    -dontwarn com.squareup.okhttp3.**
    -keep class com.squareup.okhttp3.** { *;}
    -dontwarn okio.**
    
  3. Retrofit2混淆

    -dontwarn retrofit2.**
    -keep class retrofit2.** { *; }
    -keepattributes Signature
    -keepattributes Exceptions
    
  4. Rxjava,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;
    }
    
  5. Glide混淆

    #Glide 3
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {**[] $VALUES;public *;
    }
    #Glide 4
    -keep public class * implements com.bumptech.glide.module.AppGlideModule
    -keep public class * implements com.bumptech.glide.module.LibraryGlideModule
    -keep public enum com.bumptech.glide.load.ImageHeaderParser$** {**[] $VALUES;public *;
    }
    
  6. json混淆

    # fastjson
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.fastjson.**{*; }
    #Gson
    -keep class com.google.gson.** {*;}
    -keep class com.google.**{*;}
    -keep class sun.misc.Unsafe { *; }
    -keep class com.google.gson.stream.** { *; }
    -keep class com.google.gson.examples.android.model.** { *; }
    
  7. picasso fresco 混淆

    # picasso
    -keep class com.parse.*{ *; }
    -dontwarn com.parse.**
    -dontwarn com.squareup.picasso.**
    -keepclasseswithmembernames class * {native <methods>;
    }
    #fresco
    # Keep our interfaces so they can be used by other ProGuard rules.
    # See http://sourceforge.net/p/proguard/bugs/466/
    -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
    -keep,allowobfuscation @interface com.facebook.soloader.DoNotOptimize# Do not strip any method/class that is annotated with @DoNotStrip
    -keep @com.facebook.common.internal.DoNotStrip class *
    -keepclassmembers class * {@com.facebook.common.internal.DoNotStrip *;
    }# Do not strip any method/class that is annotated with @DoNotOptimize
    -keep @com.facebook.soloader.DoNotOptimize class *
    -keepclassmembers class * {@com.facebook.soloader.DoNotOptimize *;
    }# Keep native methods
    -keepclassmembers class * {native <methods>;
    }-dontwarn okio.**
    -dontwarn com.squareup.okhttp.**
    -dontwarn okhttp3.**
    -dontwarn javax.annotation.**
    -dontwarn com.android.volley.toolbox.**
    -dontwarn com.facebook.infer.**
  8. Banner

    -keep class com.youth.banner.** {*;}
    
  9. 映射数据库

    #GreenDao2
    -keep class de.greenrobot.dao.** {*;}
    -keepclassmembers class * extends de.greenrobot.dao.AbstractDao {public static Java.lang.String TABLENAME;
    }
    -keep class **$Properties
    #GreenDao 3-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {public static java.lang.String TABLENAME;
    }
    -keep class **$Properties# If you do not use SQLCipher:
    -dontwarn org.greenrobot.greendao.database.**
    # If you do not use Rx:
    -dontwarn rx.**
    
  10. 百度定位百度地图高德地图混淆

    #百度定位
    -keep class vi.com.gdi.** { *; }
    -keep public class com.baidu.** {*;}
    -keep public class com.mobclick.** {*;}
    -dontwarn com.baidu.mapapi.utils.*
    -dontwarn com.baidu.platform.comapi.b.*
    -dontwarn com.baidu.platform.comapi.map.*
    #百度地图
    -keep class com.baidu.** {*;}
    -keep class vi.com.** {*;}
    -dontwarn com.baidu.**
    #高德地图
    -dontwarn com.amap.api.**
    -dontwarn com.a.a.**
    -dontwarn com.autonavi.**
    -keep class com.amap.api.**  {*;}
    -keep class com.autonavi.**  {*;}
    -keep class com.a.a.**  {*;}
  11. bugly混淆

    -dontwarn com.tencent.bugly.**
    -keep public class com.tencent.bugly.**{*;}
    
  12. EventBus混淆

    #Event2
    -keepclassmembers class ** {public void onEvent*(***);
    }# Only required if you use AsyncExecutor
    -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {<init>(java.lang.Throwable);
    }
    #Event3
    -keepattributes *Annotation*
    -keepclassmembers class ** {@org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {<init>(java.lang.Throwable);
    }
  13. 友盟分享 推送

    #友盟分享
    -dontshrink
    -dontoptimize
    -dontwarn com.google.android.maps.**
    -dontwarn android.webkit.WebView
    -dontwarn com.umeng.**
    -dontwarn com.tencent.weibo.sdk.**
    -dontwarn com.facebook.**
    -keep public class javax.**
    -keep public class android.webkit.**
    -dontwarn android.support.v4.**
    -keep enum com.facebook.**
    -keepattributes Exceptions,InnerClasses,Signature
    -keepattributes *Annotation*
    -keepattributes SourceFile,LineNumberTable-keep public interface com.facebook.**
    -keep public interface com.tencent.**
    -keep public interface com.umeng.socialize.**
    -keep public interface com.umeng.socialize.sensor.**
    -keep public interface com.umeng.scrshot.**-keep public class com.umeng.socialize.* {*;}-keep class com.facebook.**
    -keep class com.facebook.** { *; }
    -keep class com.umeng.scrshot.**
    -keep public class com.tencent.** {*;}
    -keep class com.umeng.socialize.sensor.**
    -keep class com.umeng.socialize.handler.**
    -keep class com.umeng.socialize.handler.*
    -keep class com.umeng.weixin.handler.**
    -keep class com.umeng.weixin.handler.*
    -keep class com.umeng.qq.handler.**
    -keep class com.umeng.qq.handler.*
    -keep class UMMoreHandler{*;}
    -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
    -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
    -keep class im.yixin.sdk.api.YXMessage {*;}
    -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
    -keep class com.tencent.mm.sdk.** {*;
    }
    -keep class com.tencent.mm.opensdk.** {*;
    }
    -keep class com.tencent.wxop.** {*;
    }
    -keep class com.tencent.mm.sdk.** {*;
    }
    -dontwarn twitter4j.**
    -keep class twitter4j.** { *; }-keep class com.tencent.** {*;}
    -dontwarn com.tencent.**
    -keep class com.kakao.** {*;}
    -dontwarn com.kakao.**
    -keep public class com.umeng.com.umeng.soexample.R$*{public static final int *;
    }
    -keep public class com.linkedin.android.mobilesdk.R$*{public static final int *;
    }
    -keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
    }-keep class com.tencent.open.TDialog$*
    -keep class com.tencent.open.TDialog$* {*;}
    -keep class com.tencent.open.PKDialog
    -keep class com.tencent.open.PKDialog {*;}
    -keep class com.tencent.open.PKDialog$*
    -keep class com.tencent.open.PKDialog$* {*;}
    -keep class com.umeng.socialize.impl.ImageImpl {*;}
    -keep class com.sina.** {*;}
    -dontwarn com.sina.**
    -keep class  com.alipay.share.sdk.** {*;
    }-keepnames class * implements android.os.Parcelable {public static final ** CREATOR;
    }-keep class com.linkedin.** { *; }
    -keep class com.android.dingtalk.share.ddsharemodule.** { *; }
    -keepattributes Signature
    #友盟推送
    -dontwarn com.umeng.**
    -dontwarn com.taobao.**
    -dontwarn anet.channel.**
    -dontwarn anetwork.channel.**
    -dontwarn org.android.**
    -dontwarn org.apache.thrift.**
    -dontwarn com.xiaomi.**
    -dontwarn com.huawei.**
    -dontwarn com.meizu.**-keepattributes *Annotation*-keep class com.taobao.** {*;}
    -keep class org.android.** {*;}
    -keep class anet.channel.** {*;}
    -keep class com.umeng.** {*;}
    -keep class com.xiaomi.** {*;}
    -keep class com.huawei.** {*;}
    -keep class com.meizu.** {*;}
    -keep class org.apache.thrift.** {*;}-keep class com.alibaba.sdk.android.**{*;}
    -keep class com.ut.**{*;}
    -keep class com.ta.**{*;}-keep public class **.R$*{public static final int *;
    }
    
5 混淆碰到的问题
    java.lang.NoSuchMethodError: No interface method g()I in class Landroid/content/res/XmlResourceParser; or its super classes (declaration of 'android.content.res.XmlResourceParser' appears in /system/framework/framework.jar)at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:613)at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:579)at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:392)at android.app.ActivityThread.installProvider(ActivityThread.java:7750)at android.app.ActivityThread.installContentProviders(ActivityThread.java:7291)at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7187)at android.app.ActivityThread.access$2200(ActivityThread.java:296)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2208)

这个是文件里面有xml 需要增加配置如下原因具体原因

   -keep class org.xmlpull.** {*;}-keep public class * extends org.xmlpull.**-keep interface org.xmlpull.** {*;}
参考博客

参考文档

Android 混淆配置相关推荐

  1. Android混淆配置

    项目到了快发布的时候,我们必然会对项目打包进行混淆,这样做可以提高别人对我们项目反编译的难度,其实Android的混淆在Android studio中已经帮我们做了一些基本的配置,看了网上了一些讲关于 ...

  2. android混淆保留内部类,混淆jar包总结

    首先是android混淆配置: http://blog.csdn.net/dianyueneo/article/details/7212012 proguard命令行: 首先定位到proguard.j ...

  3. Android项目:proguard混淆之常见开源项目混淆配置

    1.Gson混淆 ## ---------------------------------- ## ########## Gson混淆 ########## ## ------------------ ...

  4. 【Android 安全】DEX 加密 ( Proguard 简介 | Proguard 相关网址 | Proguard 混淆配置 )

    文章目录 一.Proguard 简介 二.Proguard 相关网址 三.Proguard 混淆配置 一.Proguard 简介 Android 开发中 Proguard 主要作用是对 Java 代码 ...

  5. Android项目混淆配置

    安卓混淆配置demo #android 官方混淆配置 ###########优化精简代码########### -optimizations !code/simplification/arithmet ...

  6. android php 项目代码混淆,Android Studio配置反混淆的实现

    Android Studio如何混淆 为什么要混淆 了解安卓程序编译的会知道 其实我们的apk并不是很安全,从apk从可以解包出,步骤: 将apk文件改成zip结尾 然后解压zip 然后就会发现里面有 ...

  7. 【我的Android进阶之旅】Android混淆踩坑之各模块各自单独配置混淆,但是将minifyEnabled设置为true导致的编译错误

    一.背景描述 在之前的两篇文章中 [我的Android进阶之旅]Android 混淆文件资源分类整理 [我的Android进阶之旅]Android 混淆文件资源分类整理之二:将混淆文件拆分成更小粒度的 ...

  8. android sdk 混淆 修改,Android-SDK默认混淆配置ProGuard

    一.介绍 通常情况下编译后的字节码包含了大量调试信息(如源类名/行号等) 混淆代码就能删除这些调试信息,并用无意义字符替换所有名字,增加反编译难度! ProGuard是一个混淆Java代码的开源项目, ...

  9. android命令行工具 混淆,Android 混淆代码学习以及Android加密工具--APKProtect的使用ZZ...

    一:情景分析 有时候看到其他应用App的一些效果很炫,或者是功能实现很好就想着参考参考,于是乎,下载APK----反编译APK---查看源码....,但是悲剧来了....源码都是些a,b,c...等等 ...

  10. Android Studio配置统一管理依赖版本号引用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo采用的是其中一个方案,其他方案请阅读参考资料<Android Studio中统一管理版本号引用配置> 使用步骤 ...

最新文章

  1. dell笔记本耳机怎么设置_win10笔记本怎么设置合上盖子不休眠
  2. iOS之自定义封装tabBar
  3. 塔罗牌第五张是什么牌_塔罗牌四季牌阵:冬至将至,快来看看未来这三个月运势如何?...
  4. C# 如何 保存对config文件的修改
  5. C++ 二维数组作为形参传递使用实例
  6. 个人用户可以向运营商申请短信接口吗?
  7. 服务器的原理,服务器原理
  8. 【算法设计与分析】如何分析一个算法
  9. 当马队遭遇狼群,阿里华为长篇竞合剧基情开幕
  10. 万字讲述如何通过Doris构建数据中台
  11. 星期一到星期日的英文_缩写_读音_巧记方法
  12. 光猫和路由器上网详解
  13. 数据中台当前与未来-数字化架构设计(1)
  14. 中国程序员VS美国程序员,太形象了...
  15. 数通基础-TCPIP参考模型
  16. PDF电子书如何一键添加书签
  17. IO Active将工业机器人变为“杀手”,以警示各大机器人公司
  18. python 安装 pymssql 库时报错
  19. 16进制编码与字符编码的相互转化
  20. HTML5与CSS3总结

热门文章

  1. 中国网络借贷行业现状分析及未来前瞻报告2021-2027年
  2. Swagger注解生成插件
  3. 汇编----正确区分LJMP、AJMP、SJMP、JMP跳转指令
  4. FPGA纯逻辑资源解码CameraLink视频,附带工程源码并详解
  5. CUDA核心数直接腰斩,老黄40系「花式命名」被骂上知乎热搜!
  6. 计算机技术为我们带来的影响,计算机技术对社会发展的影响探析
  7. OA系统中的会议管理
  8. 杰理AD142A AD145A系列芯片的功能简介
  9. 迅雷,暴风影音,QQ这些软件是什么工具和语言编的?
  10. Ember Model