我的安卓混淆只需要在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库的应用场景非常广泛,特别是在以下几个方面:
- 注解处理器:在开发Kotlin注解处理器时,元数据信息是不可或缺的。通过Kotlin Metadata库,开发者可以轻松获取注解处理器所需的Kotlin特性信息。
- 反射库:对于需要深入了解Kotlin类和方法的反射库来说,Kotlin Metadata提供了必要的元数据支持,使得反射操作更加精确和高效。
- 代码生成工具:在构建代码生成工具时,了解Kotlin的特定特性(如扩展函数、内联函数等)是至关重要的。Kotlin Metadata库可以帮助工具准确地生成符合Kotlin语义的代码
kotlin的元数据包括类 函数 属性 这包括了需要混淆的大部分代码,到这里就能大概明白了。
所以把这个注释掉就好了,只要不影响后面运行