博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 混淆简单入门
阅读量:6915 次
发布时间:2019-06-27

本文共 3414 字,大约阅读时间需要 11 分钟。

为什么要进行混淆

混淆是一种安全措施,防止在App发布以后被人反编译出来直接看到源码。做了混淆处理以后即使反编译出来一些类名也变成了Class a,Class b之类的,增加了阅读难度。

混淆以后就一定安全了嘛?

答案显然是否定的。混淆只是增加了反编译App的难度和成本,人家还是能看出你用了哪些开源库,甚至一些业务逻辑。所以,其他的安全措施还是不能少,比如加密与服务端之前的数据请求等

用Android Studio怎么设置混淆

  • Android Studio已经集成了ProGuard作为混淆优化工具,只需要在gradle简单设置即可开启混淆
buildTypes {    release {        //开启混淆        minifyEnabled true        //Zipalign优化        zipAlignEnabled true        // 移除无用的resource文件        shrinkResources true        //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    }    debug {        minifyEnabled false        zipAlignEnabled true        shrinkResources false    }}复制代码
  • 上面的release版本设置minifyEnabled为true即表示开启混淆,我们可以在proguard-rules.pro文件中编辑混淆规则
  • ProGuard有默认的混淆规则,而我们编辑的proguard-rules.pro文件里面除了一些ProGuard的设置,比如压缩等级啊,输出log啊,更多的是设置哪些东西不被混淆
  • zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。所以打包正式版最好也开启。

哪些情况需要添加混淆规则

1.添加了一些有混淆规则要求的三方库

  • 比如图片加载框架,就需要添加以下规则,这些在官网的ProGuard标签下可以找到
#Glide-keep public class * implements com.bumptech.glide.module.GlideModule-keep public class * extends com.bumptech.glide.AppGlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {  **[] $VALUES;  public *;}复制代码
  • 网络库
#okhttp-dontwarn okhttp3.**-dontwarn okio.**-dontwarn javax.annotation.**复制代码
  • 一个比较好的习惯是,每添加一个第三方库到项目中,就在proguard-rules.pro文件中添加对应的混淆规则

2.实现Parcelable和Serializable接口的类,比如一些需要持久化的实体类,不能混淆,需要添加混淆规则

  • Parcelable的子类和Creator静态成员变量不混淆
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆                public static final Android.os.Parcelable$Creator *;}复制代码
  • 实现Serializable接口的类成员不能混淆
#保持所有实现 Serializable 接口的类成员-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();    public 
;}复制代码

3.与服务端交互,利用Gson、fastjson等框架解析所用的实体数据类不能混淆

-keep class com.myApp.test.bean.** { *; }复制代码

这里需要解释一下上面的命令,*表示该包下面的类,**表示该包下面的类和子类,{ *; }表示类里面的内容。所以上面的命令的意思就是保持com.myApp.test.bean包下面的类和子类不混淆,且类里面的方法和变量也不混淆

4.jni方法不能混淆

-keepclasseswithmembernames class * { # 保持native方法不被混淆        native 
;}复制代码

keepclasseswithmembernames命令的意思是如果拥有某成员,保留类和类成员。以上的命令的意思就是说保留拥有native方法的类和类里面的native方法不混淆

5.WebView的JS调用也需要保证写的接口方法不混淆

  • JS的接口方法可能是内部类,要保持内部类不被混淆,就需要用到符号$
# 保持MyWebView的内部类MyJavaScriptInterface不被混淆-keep public class com..xxx.activity.MyWebView$MyJavaScriptInterface# 保持MyWebView的内部类MyJavaScriptInterface中的所有public内容不被混淆 -keep public class com..xxx.activity.MyWebView$MyJavaScriptInterface {    public *;}复制代码

6.enum类型的2个特殊方法不能被混淆

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

7.反射用的类不能被混淆


ProGuard常用的一些设置选项

#指定压缩级别-optimizationpasses 5复制代码
#不跳过非公共的库的类成员-dontskipnonpubliclibraryclassmembers复制代码
#输出详细日志-verbose复制代码
#保留一些属性,如行号LineNumberTable-keepattributes LineNumberTable复制代码
#优化时允许访问并修改有修饰符的类和类的成员-allowaccessmodification复制代码
#忽略警告,一般有警告会编译失败,如果是一些无关紧要的警告可以忽略从而顺利打包,否则要修复那些有问题的地方,以免App不能正常使用-ignorewarnings复制代码
#混淆时采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*复制代码
#优化时允许访问并修改有修饰符的类和类的成员-allowaccessmodification复制代码

其他的一些设置及信息,可以参考官网---


欢迎关注我的微信公众号,期待与你一起学习,一起交流,一起成长!

转载地址:http://ssacl.baihongyu.com/

你可能感兴趣的文章
每天多一点
查看>>
SpringMVC统一异常处理
查看>>
到底什么是自动化运维
查看>>
Linux下给mysql创建用户分配权限
查看>>
python学习笔记
查看>>
rm 命令
查看>>
FTP上传下载shell脚本
查看>>
CentOS 6.3下vsftpd虚拟用户架设
查看>>
ActiveMQ之虚拟主题
查看>>
白话理解JVM工作原理
查看>>
automak语法
查看>>
vue+eltree
查看>>
《阿里专有云等保合规白皮书》发布,阿里云实现首个一体化云原生安全架构...
查看>>
宁宇:我来谈谈去IOE
查看>>
Redis持久化及数据恢复
查看>>
常用的位运算:int与byte[]互相转换
查看>>
SQLServer学习视频系列
查看>>
maven仓库及镜像
查看>>
PHP中include()与require()的区别说明
查看>>
elasticsearch相关资料
查看>>