Android 实现代码混淆的实例
发布时间 - 2026-01-11 03:21:52 点击率:次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,这样就可以了,其实混淆很简单!
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 代码混淆
# 代码混淆的实现方法
# 代码混淆如何实现
# 详解Android代码混淆实战
# Android代码混淆的写法总结
# 详解Android的反编译和代码混淆
# Android Studio多渠道批量打包及代码混淆
# android app进行代码混淆实例详解
# Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发
# Android应用开发之代码混淆
# Android使用插件实现代码混淆
# 实体类
# 第三方
# 不去
# 很简单
# 行号
# 跳过
# 官网
# 自己的
# 类中
# 是一个
# 这是
# 反编译
# 就像
# 又是
# 子类
# 最多
# 如有
# 会在
# 希望能
# 不动
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel怎么清理缓存_Laravel optimize clear命令详解
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel如何使用Sanctum进行API认证?(SPA实战)
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel如何实现本地化和多语言支持?(i18n教程)
使用豆包 AI 辅助进行简单网页 HTML 结构设计
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
网站制作免费,什么网站能看正片电影?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何在云主机快速搭建网站站点?
浅析上传头像示例及其注意事项
如何在IIS中配置站点IP、端口及主机头?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
如何制作一个表白网站视频,关于勇敢表白的小标题?
简单实现Android文件上传
Thinkphp 中 distinct 的用法解析
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Laravel如何实现多对多模型关联?(Eloquent教程)
在centOS 7安装mysql 5.7的详细教程
JS碰撞运动实现方法详解
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
jQuery validate插件功能与用法详解
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel如何处理文件下载请求?(Response示例)
怎样使用JSON进行数据交换_它有什么限制
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
iOS UIView常见属性方法小结
高防服务器如何保障网站安全无虞?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
php 三元运算符实例详细介绍
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
Laravel如何发送系统通知?(Notification渠道示例)
如何彻底删除建站之星生成的Banner?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
网站建设保证美观性,需要考虑的几点问题!
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
音响网站制作视频教程,隆霸音响官方网站?
如何在服务器上配置二级域名建站?
lovemo网页版地址 lovemo官网手机登录
如何用腾讯建站主机快速创建免费网站?

