Android 混淆问题

我的安卓混淆只需要在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的元数据包括类 函数 属性 这包括了需要混淆的大部分代码,到这里就能大概明白了。

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

相关推荐
恋猫de小郭14 分钟前
AndroidX 新增 Security State ,支持可编程的系统安全状态查询
android·前端·flutter
AFinalStone34 分钟前
Android7 SystemUI 源码解析(六)QuickSettings快捷设置面板
android·systemui
Kapaseker39 分钟前
你有搞明白 Volatile 什么意思吗?
android·kotlin
美狐美颜SDK开放平台1 小时前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk
心平气和量大福大1 小时前
android-权限
android·java
2501_916008891 小时前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
智慧物业老杨4 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava
alexhilton10 小时前
藏在设备上的秘密,终究藏不住
android·kotlin·android jetpack
hai_android16 小时前
Kotlin / Android 常用函数使用示例手册
android·java·kotlin
hai_android17 小时前
Android MeasureSpec 详解
android·java·kotlin