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

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

相关推荐
齊家治國平天下41 分钟前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir1 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007471 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴2 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭2 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
HLC++15 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼19 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼19 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon20 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138421 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端