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

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

相关推荐
fatiaozhang95271 分钟前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
2501_915918411 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
lichong9511 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海1 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿1 小时前
毕业三年后,我离职了
android·面试
编程乐学2 小时前
安卓非原创--基于Android Studio 实现的新闻App
android·ide·android studio·移动端开发·安卓大作业·新闻app
雅雅姐3 小时前
Android14 init.rc中on boot阶段操作4
android
fatiaozhang95273 小时前
中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
android·xml·电脑·电视盒子·刷机固件·机顶盒刷机
Android出海5 小时前
Google Play账户与App突遭封禁?紧急应对与快速重构上架策略
android·网络·重构·新媒体运营·产品运营·内容运营
恋猫de小郭6 小时前
Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI
android·前端·flutter