android 混淆

前沿

很久没用过混淆功能了,因为之前的包都使用第三方加固了,而且项目开发好几年了,突然要混淆也很麻烦。换了家公司后,感觉还是得混淆代码才行,不然直接暴露源码也太不行了。

启动混淆功能

isMinifyEnabled = true
#添加
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)

getDefaultProguardFile(“proguard-android-optimize.txt”) 是系统默认的配置,而 proguard-rules.pro 才是我们自身的混淆配置

混淆

第三方库混淆

第三方一般都会自带混淆文件,或者是会提供混淆内容,如:

-keep class com.iflytek.**{*;}
-keepattributes Signature-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**-keep class com.tencent.smtt.** {*;
}-keep class com.tencent.tbs.** {*;
}

App 自身混淆

最需要注意的是我们的数据模型的混淆。
本来以为直接 -keep class com.xx.xx.model.** { *; } 就万事大吉了,结果发现还是不行。

-keep @kotlinx.serialization.Serializable class com.xx.android.netlib.model.** { *; }

各种 gson ,泛型类,枚举类,Parcelable ,Serializable ,serialization等相关的都需要 keep住。
特别是如果遇到了需要通过 Gson.toJson POST 数据到服务器的,注意字段名别被混淆了,需要一个个字段注解上:

@SerializedName("id")
val id: Int? = null

不然上传的就是 a: 23 / b: 32 这样的了。

最后,发现还是死活不行。最后看到有人说要禁止全混淆模式,
在 gradle.properties 中:

android.enableR8.fullMode=false

此时,一万匹草尼玛奔腾而过。

android.enableR8.fullMode=false 是 Android Gradle 插件中的一个配置项,作用是 关闭 R8 的完整模式。完整模式会严格应用代码优化规则和检查,关闭它可以在某些情况下避免兼容性或构建问题。

具体作用
当设置为 false 时:

禁用 R8 的一些激进优化:

关闭某些潜在可能影响运行时行为的优化。
比如,不会删除那些可能看似未使用但实际被反射调用的代码。
保留更宽松的代码压缩策略:

避免因为未正确配置 ProGuard/R8 规则而导致代码、类、或资源被误删除。
对兼容性更友好,尤其是对于依赖于动态加载(如反射或动态代理)的代码。
减少一些潜在的构建时间开销:

构建过程更快,特别是在调试模式下。
更安全的过渡到 R8:

如果项目从 ProGuard 迁移到 R8,设置 android.enableR8.fullMode=false 可以让开发者逐步调整 R8 配置文件。

注意事项
此配置在 Android Gradle Plugin 4.0 之后已经被废弃: 如果你使用的 Android Gradle Plugin 版本是 4.0 及以上,android.enableR8.fullMode 的设置将被忽略,R8 会默认启用完整模式。

完整混淆配置

网络库:

-dontoptimize-keepattributes Signature-printmapping mapping.txt-verbose# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).-keep,allowobfuscation,allowshrinking interface retrofit2.Call-keep,allowobfuscation,allowshrinking class retrofit2.Response# With R8 full mode generic signatures are stripped for classes that are not# kept. Suspend functions are wrapped in continuations where the type argument# is used.-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation# App 的 model
-keepattributes Signature
# 保留带有 @Serializable 注解的类
-keep @kotlinx.serialization.Serializable class com.xx.android.netlib.model.** { *; }# 保留带有 @Parcelize 注解的类
-keep @kotlinx.parcelize.Parcelize class com.xx.android.netlib.model.** { *; }# 防止字段名被混淆
-keepclassmembers class com.xx.android.netlib.model.** {<fields>;
}-keepclassmembers class com.xx.android.netlib.model.InputAnswerModel {java.lang.String text;java.lang.String url;java.lang.String uuid;java.lang.String audio_text;
}-keepclassmembers class com.xx.android.netlib.model.EvaluationAnswerModel {int id;java.lang.String single;java.util.List<com.xx.android.netlib.model.InputAnswerModel> input;
}# 保留 Kotlin 元数据(支持反射和序列化)
-keep class kotlin.Metadata { *; }# 不混淆 Kotlin 内部的序列化类
-keepnames class kotlinx.** { *; }
-dontwarn kotlinx.**-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-keep class com.xx.android.netlib.model.** { <fields>; }-keepattributes Annotation-keep class * extends java.lang.Enum { *; }#
-keep class com.xx.android.netlib.core.RetrofitClient { *; }# Retrofit
-dontwarn retrofit2.**
-dontwarn org.codehaus.mojo.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*
-keepattributes RuntimeInvisibleAnnotations
-keepattributes RuntimeVisibleParameterAnnotations
-keepattributes RuntimeInvisibleParameterAnnotations
-keepattributes EnclosingMethod
-keepclasseswithmembers class * {
@retrofit2.* <methods>;
}
-keepclasseswithmembers interface * {
@retrofit2.* <methods>;
}# 保护特定生成类(R8 或 Kotlin 编译器)
-keep class com.xx.android.netlib.interceptor.InterceptorUtil$$ExternalSyntheticLambda* { *; }
-keep class com.xx.android.netlib.model.*$$serializer { *; }# 保留需要序列化/反射使用的字段
-keep class * {<fields>;
}# 保留 Gson 中使用的泛型类
-keepclassmembers class * {@com.google.gson.annotations.SerializedName <fields>;public static final ** CREATOR;
}# Gson 混淆规则
-keep class com.google.gson.** { *; }# OkHttp
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-keep class javax.net.ssl.** { *; }# 保留 TypeToken 信息
-keep class com.google.gson.reflect.TypeToken { *; }
-keepclassmembers class com.google.gson.reflect.TypeToken {<fields>;
}# 保护所有可能被反射调用的类
-keepclassmembers class * {void *(...);
}
# 保留所有使用泛型的方法(安全配置)
-keepclassmembers class * {public *;
}# 保留 Parcelable 的实现类
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}# 保留 kotlinx.parcelize 注解
-keep @kotlinx.parcelize.* class *
-keepclassmembers class * {@kotlinx.parcelize.* <fields>;
}# 保留反射所需的类信息
-keep class * implements java.io.Serializable { *; }-dontwarn com.franmontiel.persistentcookiejar.**
-keep class com.franmontiel.persistentcookiejar.**-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}# 保留所有需要通过反射访问的泛型参数
-keepclassmembers class * {java.lang.reflect.Type *;java.lang.reflect.ParameterizedType *;
}# 保留 kotlinx.serialization 注解
-keep @kotlinx.serialization.* class *
-keepclassmembers class * {@kotlinx.serialization.* <fields>;
}# 保留需要序列化的类
-keep class kotlinx.serialization.** { *; }
-keepnames class kotlinx.serialization.** { *; }
# 避免警告
-dontwarn kotlinx.serialization.**-keepclassmembers class kotlinx.serialization.** { *; }# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation-keep,allowoptimization,allowshrinking,allowobfuscation class <3>-keepclassmembers class * {java.lang.reflect.Type *;java.lang.reflect.ParameterizedType *;
}-keep @kotlinx.serialization.Serializable class * { *; }
-keepclassmembers class * {@kotlinx.serialization.Serializable <fields>;
}
-keep class kotlinx.serialization.** { *; }
-dontwarn kotlinx.serialization.**-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}-keep class kotlin.jvm.internal.* { *; }# 保留所有带有泛型的类的类型信息(更通用的规则)
-keepclassmembers class * {java.lang.reflect.Type getGenericSuperclass();java.lang.reflect.Type[] getGenericInterfaces();
}-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation-dontwarn java.lang.invoke.StringConcatFactory

app module :

# 保留泛型信息,避免运行时类型擦除导致异常
-keepattributes Signature
-keepattributes Exceptions-printmapping mapping.txt# app 包下的model需要keep 
-keep class com.xx.xx.model.** { *; }-dontwarn com.umeng.**
-dontwarn com.mobile.auth.**
-dontwarn com.cmic.sso.sdk.**
-dontwarn com.unicom.online.account.**
-dontwarn com.nirvana.**
-dontwarn com.ali.security.**-keep class com.umeng.** {*;}
-keep class com.mobile.auth.** {*;}
-keep class com.cmic.sso.sdk.** {*;}
-keep class com.unicom.online.account.** {*;}
-keep class com.nirvana.** {*;}
-keep class com.ali.security.** {*;}-keep class com.iflytek.**{*;}-keepclassmembers enum * {                                                      # 保持枚举 enum 类不被混淆public static **[] values();public static ** valueOf(java.lang.String);
}-dontwarn com.tencent.bugly.**-keep class com.tencent.bugly.** {*;}-keep public class * extends android.app.Fragment
-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.preference.Preference
-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 * 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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492192.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接

介绍 Redis 哨兵模式&#xff08;Sentinel&#xff09;是 Redis 集群的高可用解决方案&#xff0c;它主要用于监控 Redis 主从复制架构中的主节点和从节点的状态&#xff0c;并提供故障转移和通知功能。通过 Redis 哨兵模式&#xff0c;可以保证 Redis 服务的高可用性和自动故…

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中&#xff0c;Wireshark 凭借其强大的捕获和显示功能&#xff0c;成为协议分析不可或缺的工具。然而&#xff0c;面对众多未被内置支持的协议或需要扩展解析的场景&#xff0c;Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…

宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)

刚安装宝塔申请SSL就报错&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign 面板、插件版本&#xff1a;9.2.0 系统版本&#xff1a;Alibaba Cloud Linux 3.2104 LTS 问题&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu&#xff0c;…

双内核架构 Xenomai 4 安装教程

Xenomai 4是一种双内核架构, 继承了Xenomai系列的特点&#xff0c;通过在Linux内核中嵌入一个辅助核心&#xff08;companion core&#xff09;&#xff0c;来提供实时能力。这个辅助核心专门处理那些需要极低且有界响应时间的任务。 本文将在官网教程(https://evlproject.org/…

MySQL学习之DML操作

目录 插入 删除 修改 数据库事务 事务的特征&#xff08;ACID原则&#xff09; 原子性 一致性 隔离性 持久性 事务隔离级别 读未提交 读已提交 可重复读 序列化 脏读 虚读 幻读 插入 insert into 表名 values(); 要求插入数据的数量&#xff0c;类型要和定义…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

linux打包qt程序

Linux下Qt程序打包_linuxdeployqt下载-CSDN博客 Linux/Ubuntu arm64下使用linuxdeployqt打包Qt程序_linuxdeployqt arm-CSDN博客 本篇文章的系统环境是 : 虚拟机ubuntu18.04 用下面这个qmake路径 进行编译 在 ~/.bashrc 文件末尾&#xff0c;qmake目录配置到文件末尾 将上图中…

qt-C++笔记之自定义类继承自 `QObject` 与 `QWidget` 及开发方式详解

qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式详解 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QW…

教师工作量管理系统

源代码地址&#xff1a;31、教师工作量管理系统 目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性…

LiveData源码研究

LiveData 源码分析 前言 用过MVVM的大概知道LiveData可以感知组件的生命周期&#xff0c;当页面活跃时&#xff0c;更新页面数据&#xff0c; 当页面处于非活跃状态&#xff0c;它又会暂停更新&#xff0c;还能自动注册和注销观测者&#xff0c;能有效避免内存泄漏和不必要的…

vscode+msys2+clang+xmake c++开发环境搭建

转载请标明出处&#xff1a;小帆的帆的专栏 安装msys2 下载msys2安装包&#xff1a;清华源下载地址安装msys2&#xff1a;安装目录&#xff0c;C:\Softwares\msys64 安装cling工具链&#xff0c;xmake &#xff01;&#xff01;&#xff01;在开始菜单中启动MSYS2 CLANG64,…

VMware ubuntu16.04怎么设置静态IP联网

1.将VMware桥接到当前电脑使用的网络上面&#xff1b; 2.点击网络符号&#xff0c;编辑连接&#xff1b; 3.双击有线连接1&#xff1b; 4.选择IPv4设置&#xff0c;将地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS服务器设置好&#xff0c;保存&#xff1b; 5.在终…

金蝶云苍穹踩过的坑(慢慢更新)

IDEA不能用最新版&#xff0c;不然搜不到金蝶的插件。 我用的是2024.1.7/2023.1.7 IDEA里增加金蝶插件库的地址也变了&#xff0c;现在是 https://tool.kingdee.com/kddt/idea-updatePlugins.xml 金蝶云苍穹部署在服务器 MAC本地IDEA调试的时候&#xff0c;登录N次能成功一次…

【人工智能学习之HDGCN训练自己的数据集】

【人工智能学习之HDGCN训练自己的数据集】 HD-GCN准备事项项目代码开源数据集第一行&#xff1a;帧数第二行&#xff1a;body数第三行&#xff1a;关节附加信息第四行&#xff1a;关节数5-29行&#xff1a;每个关节的数据之后的帧总结&#xff1a; 自定义2D数据集模型移植与修改…

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…

Unity A*算法实现+演示

注意&#xff1a; 本文是对基于下方文章链接的理论&#xff0c;并最终代码实现&#xff0c;感谢作者大大的描述&#xff0c;非常详细&#xff0c;流程稍微做了些改动&#xff0c;文末有工程网盘链接&#xff0c;感兴趣的可以下载。 A*算法详解(个人认为最详细,最通俗易懂的一…

MoonBit 核心编译器正式开源!

由 IDEA研究院基础软件中心打造的 MoonBit &#xff08;月兔&#xff09;AI 原生开发平台&#xff0c;今日宣布正式开源其核心的编译器 WebAssembly&#xff08;简称“Wasm”&#xff09; 后端。开发者现在可以利用 MoonBit 的能力做性能优化&#xff0c;且直接参与 MoonBit 的…

JS使用random随机数实现简单的四则算数验证

1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

linux0.11源码分析第一弹——bootset.s内容

&#x1f680;前言 本系列主要参考的《linux源码趣读》&#xff0c;也结合之前《一个64位操作系统的设计与实现》的内容结合起来进行整理成本系列博客。在这一篇博客对应的是《linux源码趣读》第一~四回 目录 &#x1f680;前言&#x1f3c6;启动后的第一步&#x1f4c3;启动区…