Android 实现代码混淆的实例
作者:lqh 发布时间:2023-06-01 22:13:48
Android 实现代码混淆的实例
1、简介
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。
混淆的目的是为了加大反编译的成本,但是并不能彻底防止反编译。
2、如何开启混淆
通常我们需要找到项目路径下app目录下的build.gradle文件,找到minifyEnabled这个配置,然后设置为true即可,如下:
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
3、proguard又是什么呢
这是java官网给出的定义:
ProGuard is a free Java Class file shrinker, optimizer, obfuscator,
and preverifier. It detects and removes unused classes, fields, methods,
and attributes. It optimizes bytecode and removes unused instructions.
It renames the remaining classes, fields, and methods using short meaningless names.
Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.
作用:
proguard是一个集文件压缩,优化,混淆和校验等功能的工具
检测并删除无用的类,变量,方法和属性
优化字节码并删除无用的指令
通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果
还校验处理后的代码
4、常见语句
-optimizationpasses 5
代码混淆压缩笔记,在0~7之间
-dontusemixedcaseclassnames
混淆后类名都小写
-dontskipnonpubliclibraryclasses
不去忽略非公共的库的类
-dontskipnonpubliclibraryclassmembers
不去忽略非公共的库的类的成员
-dontpreverify
不做预校验的操作
-verbose
-printmapping proguardMapping.txt
生成原类名和混淆后的类名的映射文件
-optimizations !code/simplification/cast,!field/*,!class/merging/*
指定混淆时采用的算法
-keepattributes *Annotation*,InnerClasses
注解不混淆
-keepattributes Signature
泛型不混淆
-keepattributes SourceFile,LineNumberTable
抛出异常时保留代码行号
用的最多的指令
-keep class XXXX
保留类名不变,也就是类名不混淆,而类中的成员名不保证。当然也可以是继承XXX类的所有类名不混淆
-keepclasseswithmembers class XXXX
保留类名和成员名,当然也可以是类 * 定方法
5、哪些不混淆
反射中使用的元素
与网络请求相关实体类
使用注解的元素
四大组件
WebView中与JS交互的类
枚举 等
6、混淆文件编写
按照以上的规则和基本语句,我们将混淆文件分为两个区域:
定制化区域:分为实体类、第三方、js相关、反射相关,应按项目真实情况进行编写,具体会在稍后提到;
基本不动区直接复制即可。
#-------------------------------------------定制化区域----------------------------------------------
#---------------------------------1.实体类---------------------------------
#---------------------------------2.第三方包-------------------------------
#---------------------------------3.与js互相调用的类------------------------
#---------------------------------4.反射相关的类和方法-----------------------
#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
#---------------------------------默认保留区---------------------------------
-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.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
-keep class android.support.** {*;}
-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);
}
-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();
}
-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);
}
#------------------------------------------------------------------------------------
实体类:
-keep class 你的实体类所在的包.* { ; }
实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的。将你项目中实体类都挑出来,用以上语法进行保留。
如果实体类都在同一一个包下,就和上面一样,很简单;如果实体类分布在各个包下,不好意思,挨个添加。
第三方包
需到项目的build.gradle文件中找到所有添的依赖,然后去官网或者github找到对应的混淆代码,添加到我们自己的混淆文件中。
如果是添的jar包的话,就像如下来写
#log4j
-libraryjars log4j-1.2.17.jar
-dontwarn org.apache.log4j.**
-keep class org.apache.log4j.** { *;}
大致意思就是不混淆,不报warn。如果gradle报错的话,可以考虑注释掉-libraryjars log4j-1.2.17.jar这句。
与JS交互相关
如果没有可跳过
-keep class 你的类所在的包.** { *; }
如果是内部类的话这样写:
-keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; }
反射相关
没有可跳过
-keep class 你的类所在的包.** { *; }
ok,这样就可以了,其实混淆很简单!
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/jiashuai94/article/details/77991077


猜你喜欢
- @ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的
- 最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用J
- 引言其实对于分库分表这块的场景,目前市场上有很多成熟的开源中间件,eg:MyCAT,Cobar,sharding-JDBC等。本文主要是介绍
- 1、IDEA右键没有创建新的package选项2、在Idea中创建XML文件,发现"URI is not registered&q
- 在springboot中,默认继承好了一套完好的redis包,可以直接使用,但是如果使用中出了错不容易找到错误的原因,因此这里使用自己配置的
- 用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍。通过设计编写程序找到蓝色小球达到蓝色旗子的路线思路:构建一个迷宫(用二维数组)
- (1)编写接口Animal (Animal.java)public interface Animal{ public abstr
- 本文实例讲述了C#获取文件创建时间的方法。分享给大家供大家参考。具体如下:C#获取文件创建时间,主要用到了FileInfo的Creattio
- 说明compose中我们的所有ui操作,包括一些行为,例如:点击、手势等都需要使用Modifier来进行操作。因此对Modifier的理解可
- 想要在Ubuntu上运行java程序,可以将java程序编译成功后打包,然后在Ubuntu上用命令执行jar文件具体操作如下:1、Windo
- 接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。接口是公开的,不能有私有的方法或变量,接口中的
- 引言Netty作为高性能的网络通信框架,它是IO模型演变过程中的产物。Netty以Java NIO为基础,是一种基于异步事件驱动的网络通信应
- 二叉排序树,又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:若它的左子树不为空。则左子树上所有的结点的值均小于跟的结点值若它
- 前言图文并茂的内容往往让人看起来更加舒服,如果只是文字内容的累加,往往会使读者产生视觉疲劳。搭配精美的文章配图则会使文章内容更加丰富,增加文
- 疑问都知道C#有装箱和拆箱的操作,听闻也都是讲int类型转换成object类型就是装箱,将object类型再转回int类型就是拆箱。描述的通
- 前言众所周知,在多个项目中可能会相同的模块,如果每个项目都去创建一遍的话,这样开发效率会很低。比如在开发一个APP应用的时候,有供APP使用
- 内部类的介绍定义在另外一个类中的类,叫内部类成员内部类1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象
- 本文实例讲述了Android编程判断当前应用是否在后台运行的方法。分享给大家供大家参考,具体如下:/** 判断程序是否在后台运行 */pub
- 前言在引入 fl_chart 绘制图表的时候,看到插件有下面这样的动效,随机散乱的圆点最后组合成了 Flutter 的 Logo,挺酷炫的。
- Android安全加密专题文章索引Android安全加密:对称加密Android安全加密:非对称加密Android安全加密:消息摘要Mess