一、前言

今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆。

二、Android Studio 代码混淆基本配置

在工程目录下,找到 proguard-rules.pro 文件,它就是你要进行编写混淆配置的文件,在这个文件中编写混淆规则

当然,在这之前,还需要在你 module 的 build.gradle 文件中引用该混淆文件:

上面中的 proguard-android.txt 文件,这是系统默认的混淆文件,具体在../sdk/tools/proguard/ 目录下,其中包含了 android 最基本的混淆,一般不需要改动,我们需要配置的是项目中 app 下的 proguard-rules.pro 文件

三、混淆规则

1.基本规则

两个常用的混淆命令,注意一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;两颗星表示把本包和所含子包下的类名都保持;

-keep class cn.hadcn.test.** -keep class cn.hadcn.test.* 

用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,这时如果既想保持类名,又想保持里面的内容不被混淆,我们就需要以下方法了

-keep class com.example.bean.** { *; } 

在此基础上,我们也可以使用Java的基本规则来保护特定类不被混淆,比如我们可以用extend,implement等这些Java规则。如下例子就避免所有继承Activity的类被混淆


# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆
# 因为这些子类都有可能被外部调用
-keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -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 * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService 

2.什么时候不被混淆

一般以下情况都会不混淆:
1.使用了自定义控件那么要保证它们不参与混淆
2.使用了枚举要保证枚举不被混淆
3.对第三方库中的类不进行混淆
4.运用了反射的类也不进行混淆
5.使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
6.在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
7.有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
8.Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常

三、基本的混淆模板

最后提供一份基本的混淆模板,当然第三方库,或者上面提到的地方,根据自己的实际需求进行混淆


############################################# # # 对于一些基本指令的添加 # ############################################# # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 -dontpreverify # 保留Annotation不混淆 -keepattributes *Annotation*,InnerClasses # 避免混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable # 指定混淆是采用的算法,后面的参数是一个过滤器 # 这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* ############################################# # # Android开发中一些需要保留的公共部分 # ############################################# # 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -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 * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留support下的所有类及其内部类 -keep class android.support.** {*;} # 保留继承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留R下面的资源 -keep class **.R$* {*;} # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保留在Activity中的方法参数是view的方法, # 这样以来我们在layout中写的onClick就不会被影响 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我们自定义控件(继承自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); } # 保留Parcelable序列化类不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的类不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } # webView处理,项目中没有使用到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); } 

转载于:https://www.cnblogs.com/Free-Thinker/p/9395436.html

Android Studio 代码混淆(你真的会混淆吗)相关推荐

  1. Android Studio 代码自动提示无效

    Android Studio代码自动提示无效(not available in Power Save mode)的解决办法 问题描述: 今天用Android studio敲代码,突然间就没有代码提示了 ...

  2. git 命令详解和Android Studio代码管理工具

    目录 前言 git命令上传项目 一.核心操作 二.解决冲突 三.情景举例 四.查看ssh密钥 五.克隆远程项目 六.回退某个操作 七.和远程分支建立关联 八.删除文件 九.远程仓储 十.多人协作 十一 ...

  3. android studio光标变成黑块,解决Android Studio 代码无提示无颜色区分问题

    解决Android Studio 代码无提示无颜色区分问题 一.问题 ①java代码没有颜色区分,统一黑色 ②代码不会联想提示,原来打前几个字母便会联想到后面的内容 二.解决 打开File,将Powe ...

  4. Android Studio 代码混淆

    2019独角兽企业重金招聘Python工程师标准>>> 在Android studio 进行代码混淆配置. proguard 配置 -keepclasseswithmembers 指 ...

  5. android 混淆过滤,android studio 代码混淆如何忽略第三方jar包

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近在打包混淆时,遇到一个问题,混淆编译都不出错,运行出错,一般遇到这种问题,肯定是在运行的地方有代码被混淆了,经过错误 ...

  6. android studio 代码缩略图,android studio 设置模板

    本文记录了自己是如何建立一个模板的,其实过程很简单. ·1.查看android studio 本身自带的模板: 2.模仿android studio 模板写一个自己的模板: android studi ...

  7. android studio linux 字体,Android Studio代码字体模糊解决方法

    HDU3394:Railway 传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双, ...

  8. android studio代码教程,史上最详细的Android Studio系列教程三

    Android Studio 1.0正式版发布啦 今天是个大日子,Android Studio 1.0 终于发布了正式版, 这对于Android开发者来说简直是喜大普奔的大消息啊,那么就果断来下载使用 ...

  9. Android Studio代码检查lint使用

    使用 lint 检查改进您的代码 Android Studio 提供了一个名为 lint 的代码扫描工具,可帮助发现并更正代码结构质量的问题. 有两种使用方式: 使用命令行运行lint 在Androi ...

最新文章

  1. 深刻剖析与实战BCELoss详解(主)和BCEWithLogitsLoss(次)以及与普通CrossEntropyLoss的区别(次)
  2. 《软件设计精要与模式》第二版源代码
  3. 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)
  4. 捉虫记 单步跟踪 条件断点 变量查看实践
  5. mysql配置向导文件_Mysql的安全配置向导命令mysql_secure_installation
  6. github代码_GitHub启动代码空间
  7. 解决Oracle 11gR2 空闲连接过多,导致连接数满的问题
  8. obs噪音抑制调多少合适_TVS瞬态抑制二极管的特性及应用
  9. 浏览器解析html全过程详解
  10. 学习hadoop需要什么基础
  11. mongodb的java驱动包_mongodb的java驱动包
  12. Key/Value之王Memcached初探:一、掀起Memcached的盖头来
  13. WPF连接WF4的问题
  14. PHP语言中global和$GLOBALS[]的分析(转)
  15. 网络模型介绍、数据网络传输过程与网络传输速率
  16. 足球机器人比赛3V3
  17. 计算机图形学及CAD技术 微盘,计算机图形学及cad技术讲义——曲线曲面基本理论.pdf...
  18. yolov5导出onnx用netron.app可视化搜索
  19. mac打开网页速度特别慢
  20. 教你如何把软件转移到另一台电脑?

热门文章

  1. Android涂鸦技术及刮刮乐示例分析
  2. 使用VScode开发C语言程序,环境安装配置,保姆级教程
  3. cmw500综合测试仪使用_综合布线中手持式测试仪
  4. java七大_Java 7七大新功能
  5. java length()函数_小猿圈介绍java函数式编码结构及优势
  6. 各种网络监控拓扑图,十分齐全!
  7. 阿里云加入 OCI,共建容器开放标准
  8. c语言回收字符串空间,C语言基础知识(字符串,函数,内存空间)
  9. 字符串反转python_Python 反转字符串(reverse)的方法小结
  10. java匿名启动线程_用java实现匿名内部类启动线程