Android 混淆问题

news2024/12/1 2:48:06

我的安卓混淆只需要在gradle里面开启就行了。

 buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

minifyEnabled true 这个就是开启方法,但是在一个新的项目上反编译后发现混淆无效。

能看到方法说明混淆失败或者无效,按理说应该能成功啊,为了验证我把

proguard-rules.pro里面的所有代码都注释掉

最后验证情况:

如果成功应该显示这样才是,为了排除问题,用了二分方法排查发现有个混淆影响了

-keepclasseswithmembers @kotlin.Metadata class * { *; }

把这个去掉之后就成功了。

这个百度后的解释:

-keepclasseswithmembers @kotlin.Metadata class * { *; }‌ 这条规则在 Kotlin 混淆配置中起着重要的作用。它的主要目的是保护 Kotlin 编译生成的元数据类不被混淆。

背景信息

在 Kotlin 中,编译器会生成一些元数据类(Metadata),这些类包含了关于 Kotlin 代码的额外信息,例如函数签名、属性等。这些元数据类对于 Kotlin 的反射功能非常重要,如果它们被混淆,可能会导致反射调用失败,从而影响程序的正常运行。

具体作用

  • 保护元数据类‌:这条规则确保了 Kotlin 生成的元数据类不会被混淆,从而保证了反射功能的正常使用。
  • 避免运行时错误‌:如果这些元数据类被混淆,可能会导致 java.lang.AbstractMethodError 等运行时错误,因为混淆会改变类的名称和方法签名,导致反射调用失败。

使用场景

这条规则通常在以下场景中使用:

  • 开发中的项目‌:在开发过程中,保护元数据类可以避免因混淆导致的编译或运行时错误。
  • 使用反射的场景‌:如果项目中使用了反射,这条规则可以确保反射调用不会因为类的名称或方法签名的变化而失败。

示例代码

在 ProGuard 配置文件中添加以下内容:

-keepclasseswithmembers @kotlin.Metadata class * { *; }

这行代码确保了所有由 Kotlin 编译器生成的元数据类不会被混淆,从而保护了 Kotlin 的反射功能。

通过使用这条规则,可以确保 Kotlin 项目的稳定性和兼容性,特别是在使用反射和开发中的项目中尤为重要。

来解释下Metadata 这个是什么意思,这个是kotlin的元数据。

元数据解释

Kotlin元数据的定义和用途

Kotlin的元数据是通过Kotlin编译器在编译过程中生成的,包含了关于Kotlin特性的信息。这些信息在Java环境中通常是不可见的,因此开发者很难直接访问这些信息。Kotlin Metadata库的出现解决了这一问题,它通过定义清晰的API,确保开发者在使用元数据时不会遇到类型转换错误,并且支持多种Kotlin版本,确保在不同版本的Kotlin编译器下都能正常工作‌1。

Kotlin元数据的具体内容

Kotlin元数据主要包括以下内容:

  • 类信息‌:如类的名称、属性、方法等。
  • 函数信息‌:包括函数的名称、参数、返回值等。
  • 属性信息‌:如属性的名称、类型等。

Kotlin元数据的应用场景

Kotlin Metadata库的应用场景非常广泛,特别是在以下几个方面:

  1. 注解处理器‌:在开发Kotlin注解处理器时,元数据信息是不可或缺的。通过Kotlin Metadata库,开发者可以轻松获取注解处理器所需的Kotlin特性信息。
  2. 反射库‌:对于需要深入了解Kotlin类和方法的反射库来说,Kotlin Metadata提供了必要的元数据支持,使得反射操作更加精确和高效。
  3. 代码生成工具‌:在构建代码生成工具时,了解Kotlin的特定特性(如扩展函数、内联函数等)是至关重要的。Kotlin Metadata库可以帮助工具准确地生成符合Kotlin语义的代码‌

kotlin的元数据包括类 函数 属性 这包括了需要混淆的大部分代码,到这里就能大概明白了。

所以把这个注释掉就好了,只要不影响后面运行

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《硬件架构的艺术》笔记(九):电磁兼容性能设计指南

简介 电子线路易于接收来自其他发射器的辐射信号,这些EMI(电磁干扰)使得设备内毗邻的元件不能同时工作。这就有必要进行电磁兼容设计以避免系统内有害的电磁干扰。 确保设备不产生多余的辐射,设备也不易受到射频辐射的干扰&…

MR30分布式 IO 模块在冷却水泵系统中的卓越应用

在当今各类工业生产以及大型设施运行的场景中,冷却水泵系统起着至关重要的作用,它犹如保障整个运转体系顺畅运行的 “血液循环系统”,维持着设备适宜的温度环境,确保其稳定、高效地工作。而随着科技的不断发展,明达技术…

【数据分析】布朗运动(维纳过程)

文章目录 一、概述二、数学布朗运动2.1 数学定义2.2 布朗运动的数学模型2.21 标准布朗运动2.22 布朗运动的路径2.23 布朗运动的方程 三、布朗运动在金融学中的应用四、数学构造(以傅里叶级数为例)4.1 傅里叶级数的基本思想4.2 构造布朗运动 一、概述 布…

3.22【机器学习】决策树作业代码实现

4.1由于决策树只在样本同属于一类或者所有特征值都用完或缺失时生成叶节点,同一节点的样本,在路径上的特征值都相同,而训练集中又没有冲突数据,所以必定存在训练误差为0的决策树 4.2使用最小训练误差会导致过拟合,使得…

数字IC后端实现之PR工具中如何避免出现一倍filler的缝隙?

在数字IC后端实现中,由于有的工艺foundary不提供Filler1,所以PR工具Innovus和ICC2在做标准单元摆放时需要避免出现两个标准单元之间的缝隙间距是Filler1。为了实现这个目的,我们需要给PR工具施加一些特殊的placement constraint(典…

群控系统服务端开发模式-应用开发-前端短信配置开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下sms文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;"><el…

111.有效单词

class Solution {public boolean isValid(String word) {if(word.length()<3){return false;}int countV0,countC0;//分别统计原音和辅音for(int i0;i<word.length();i){if(Character.isLetterOrDigit(word.charAt(i))){if(word.charAt(i)a||word.charAt(i)e||word.charA…

python图像彩色数字化

效果展示&#xff1a; 目录结构&#xff1a; alphabets.py GENERAL {"simple": "%#*-:. ","complex": "$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. " } # Full list could be found here…

欧科云链研究院:比特币还能“燃”多久?

出品&#xff5c; OKG Research 作者&#xff5c;Hedy Bi 本周二&#xff0c;隔夜“特朗普交易” 的逆转趋势波及到比特币市场。比特币价格一度冲高至约99,000美元后迅速回落至93,000美元以下&#xff0c;最大跌幅超6%。这是由于有关以色列和黎巴嫩有望达成停火协议的传闻引发…

Unity之一键创建自定义Package包

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; …

E2、UML类图顺序图状态图实训

一、实验目的 在面向对象的设计里面&#xff0c;可维护性复用都是以面向对象设计原则为基础的&#xff0c;这些设计原则首先都是复用的原则&#xff0c;遵循这些设计原则可以有效地提高系统的复用性&#xff0c;同时提高系统的可维护性。在掌握面向对象七个设计原则基础上&…

【Java基础入门篇】一、变量、数据类型和运算符

Java基础入门篇 一、变量、数据类型和运算符 1.1 变量 计算机中的数据表示方式是&#xff1a;“二进制(0/1)”&#xff0c;但是同时也可以兼容其他进制&#xff0c;例如八进制、十进制、十六进制等。 Java变量的本质是&#xff1a;存储在固定空间的内容&#xff0c;变量名是…

前端学习笔记之文件下载(1.0)

因为要用到这样一个场景&#xff0c;需要下载系统的使用教程&#xff0c;所以在前端项目中就提供了一个能够下载系统教程的一个按钮&#xff0c;供使用者进行下载。 所以就试着写一下这个功能&#xff0c;以一个demo的形式进行演示&#xff0c;在学习的过程中也发现了中文路径…

【力扣】387.字符串中的第一个唯一字符

问题描述 思路解析 对于这种个数有限的问题&#xff0c;我的第一想法是使用桶排序来解决因为s中只有小写英文单词&#xff0c;所以我只需要一个26个单位的数组就好了通过 charAt() 来提取单个字符&#xff0c;然后通过 -‘a’ 来将其映射到 0~25&#xff0c;不然数组长度就被超…

数据采集中,除了IP池的IP被封,还有哪些常见问题?

在数据采集的过程中&#xff0c;代理IP池的使用无疑为我们打开了一扇通往信息宝库的大门。然而&#xff0c;除了IP被封禁这一常见问题外&#xff0c;还有许多其他问题可能影响数据采集的效果。本文将探讨在数据采集中&#xff0c;除了IP被封之外&#xff0c;还可能遇到的一些常…

【笔记】自动驾驶预测与决策规划_Part8_数据驱动的规划方法

文章目录 0. 前言1.生成模型1.1 Diffusion-ES1. Diffusion-ES算法介绍2. Diffusion-ES算法具体流程Diffusion Model 是什么&#xff1f;Diffusion-ES: Evolutionary StrategiesDiffusion-ES MethodDiffusion-ES Mapping Language instructions to reward functions with LLM pr…

里氏替换原则:Java面向对象设计的基石

在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;继承是一个强大的工具&#xff0c;它允许我们创建新的类&#xff08;子类&#xff09;来复用和扩展现有类&#xff08;父类&#xff09;的功能。然而&#xff0c;继承也带来了复杂性&#xff0c;特别是在确保子类能够正…

C++笔记之单例模式与静态方法的使用辨析及代码规范

C++笔记之单例模式与静态方法的使用辨析及代码规范 code review! 文章目录 C++笔记之单例模式与静态方法的使用辨析及代码规范一.示例代码二.讲解2.1.代码规范2.1.1.单例模式实现2.1.2.静态方法实现2.1.3.单例模式结合静态方法2.2.总结一.示例代码 // 使用 set 方法设置值(通…

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…

加载不同本地gltf模型,模型内容不更新的解决方案

相关链接 http://mars3d.cn/editor-vue.html?keyex_6_2_2&idlayer-graphic/draw/draw-model 问题内容 加载本地gltf模型的时候&#xff0c;不clear图层&#xff0c;再打开其他本地gltf&#xff0c;gltf的内容就不更新 重现步骤 进入官网示例&#xff0c;贴入以下代码…