android混淆技巧与反混淆,安卓混淆后反编译,详解Android代码混淆实战
本文主要介绍实战中Android代码混乱的详细解释边肖认为这很好现在分享给大家,给大家一个参考来和边肖一起看看吧
什么是代码混淆:
Android SDK自带混淆工具Proguard它位于SDK根目录\tools\proguard下如果开启混淆,默认情况下,Proguard会对所有代码进行混淆,包括第三方包,但有些代码或第三方包是不能混淆的,这就需要我们手动编写混淆规则,保留不能混淆的部分
为什么要混淆:
java的优化字节码
减小apk文件的大小将会删除混淆过程中未使用的类和成员
代码安全,它使得类、函数和变量的名字随机变成了无意义的代码名如:a、b、c.诸如此类防止app被反编译,能够轻松理解代码
怎样使用混淆
在app下的build.gradle添加混淆
构建类型{
发布{
//打开混淆,删除无用代码
minifyEnabled true
//打开删除无用资源
shrinkResources true
proguardFiles getDefaultProguardFile(' proguard-Android . txt '),' proguard-rules.pro '
}
调试{
//在调试环境中使用模糊处理,以便于调试
签名配置签名配置. debug
minifyEnabled false
proguardFiles getDefaultProguardFile(' proguard-Android . txt '),' proguard-rules.pro '
清单占位符=[
//UAT测试环境
GETUI _ APP _ ID:' fzi 793 fjp 9654 lfedpcr 29 ',
GETUI _ APP _ KEY:' yrvmzt 4 KTP 65 hqatzbcj 79 ',
GETUI _ APP _ SECRET:' alf 186 Rb 617 uj 7 jennub 89 '
]
}
}
}
在调试环境中使用签名文件可以方便地调试混乱的代码
混淆文件 proguard-rules.pro
常规混淆配置(应用常规)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#代码混淆压缩比,0到7之间,默认值为5,一般不修改
-优化通过5次
#混合时不要使用大小写混合,混合类名小写
-dontusemixedcaseclassnames
#指定不忽略非公共库的类
-dontskipnoppubliclibraryclasses
#这句话可以混淆我们的项目,生成映射文件
#包含类名和混淆类名之间的映射关系
-冗长
#指定不忽略非公共库的类成员
-dontskipnoppubliclibraryclassmembers
#没有预验证,预验证是proguard的四个步骤之一Android不需要preverify去掉这一步会加速混乱
-不要预验证
-不要优化
#在混淆的情况下是否登录
-冗长
-忽略警告
#保持注释不混乱
-keep attributes *批注*
#避免混淆泛型
-keepattributes签名
-keepattributes异常,内部类
-don tnote com . Google . vending . licensing . ilicensingservice
-don tnote com . Android . vending . licensing . ilicensingservice
#抛出异常时保留代码行号
-keepattributes源文件,行号表
-keepattributes已弃用,合成,封闭方法
#在引发异常时重命名文件名
-renamesourcefileattribute源文件
#指定用于模糊处理的算法,以下参数是过滤器
#这个滤镜是Google推荐的算法,一般不变
-优化!编码/简化/转换!field/*,类别/合并/*
需要保留的APP公共部分(通用)
四个主要组成部分和子类;
自定义应用程序;
以下继承了support的子类
r以下资源
本地方法
活动中参数是视图的方法
列举
自定义视图
序列化(可打包、可序列化)
具有回调函数(on*监听器,On事件)
网络视图
#############################################
#
# Android开发中需要保留的一些公共部分
#
#############################################
#保留我们使用的四个组件、自定义应用程序等这些类不混淆
#因为这些子类都可以从外部调用
-保持公共类*扩展android.app.Activity
-保留公共类*扩展android.app.Application
-保留公共类*扩展android.app.Service
-保持公共类*扩展安卓内容广播收音机
-保持公共类*扩展安卓内容内容提供商
-保持公开课*扩展安卓app后援backupagenthelper
-保持公共类*扩展安卓.偏好.偏好
-保持公共类*扩展android.view.View
#-保留公共类com安卓售货许可伊利森服务公司
# 保留支持下的所有类及其内部类
——保持类安卓支持* * { *;}
# 保留继承的
-保持公共类*扩展android.support.v4.**
-保持公共类*扩展android.support.v7.**
-保持公共类*扩展android.support.annotation.**
# 保留稀有下面的资源
——保持阶级**R $ * { *}
# 保留本地当地的方法不被混淆
-使用membernames class * {
本机方法;
}
# 保留在活动中的方法参数是视角的方法,
# 这样以来我们在布局中写的onClick就不会被影响
-keepclassmembers类*扩展android.app.Activity{
public void *(安卓查看查看);
}
# 保留枚举类不被混淆
-保留类成员枚举* {
公共静态* *[]values();
(Java的公共静态* *值郎字符串);
}
# 保留我们自定义控件(继承自查看)不被混淆
-保持公共类*扩展android.view.View{
* * * get *();
void set *(* * *);
公共init(安卓内容语境);
公共初始化(Android内容语境,安卓utilattributeset);
公共初始化(Android内容context,android.util.AttributeSet,int);
}
# 保留可包装的序列化类不被混淆
-继续上课*实现android.os.Parcelable {
公共静态最终安卓OSparcelable $ Creator *;
}
# 保留可序列化序列化的类不被混淆
-keepclassmembers类*实现java.io.Serializable {
静态最终长serialVersionUID
私有静态最终Javaioobjectstreamfield[]serialPersistentFields;
!静电!瞬态场;
!私有字段;
!私有方法;
私有void writeObject(Javaio对象输出流);
私有void读取对象(Javaioobjectinputstream);
Java郎对象写替换();
Java郎对象读取解析();
}
# 对于带有回调函数的onXXEvent、* * On *侦听器的,不能被混淆
-保留类成员类* {
void *(* * On * Event);
void *(* * On * Listener);
}
#网络视图处理,项目中没有使用到网络视图忽略即可
-保留类成员类fqcn的JavaScript界面因为webview {
public *;
}
-keepclassmembers类*扩展android.webkit.webViewClient {
public void *(安卓WebKitwebview,java.lang.String,Android图形位图);
公共布尔*(安卓WebKitwebview,Java郎字符串);
}
-keepclassmembers类*扩展android.webkit.webViewClient {
public void *(安卓WebKitwebview,jav郎字符串);
保留自己的项目部分代码不能被混淆(需要更具自己项目)
网络请求(如果混淆,就会发生字段的错乱,无法正常解析)
加密类
数据库实体类
工具类
项目中应用到的第三方工具类(如okhttp,eventbus,rxjava等),需要根据具体的工具介绍进行操作
保留解放运动和编制引用的第三方冲突包不被混淆的方法:
java -keep类包名** { *;}
如:保留引用的科大讯飞的第三方冲突包不被混淆
Java-keep类com科大讯飞* * { *;}
#网络请求等与外界通信不能混淆
-保持班级通讯xxxxx
。功能。* * .net. * * { *}
-保持班级通讯。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。