【发布时间】:2018-09-12 22:00:07
【问题描述】:
我想保护(混淆)任何标有 kotlin internal 可见性修饰符的类。
Kotlin internal 类在 JVM 上是公共的,因此它们在 Java 源代码中是可见和可用的。我不希望这些类被使用或出现在自动完成中,所以我想混淆它们以阻止它们的使用。
我可以对目标internal 类应用什么保护规则?
【问题讨论】:
标签: kotlin proguard android-proguard dexguard
我想保护(混淆)任何标有 kotlin internal 可见性修饰符的类。
Kotlin internal 类在 JVM 上是公共的,因此它们在 Java 源代码中是可见和可用的。我不希望这些类被使用或出现在自动完成中,所以我想混淆它们以阻止它们的使用。
我可以对目标internal 类应用什么保护规则?
【问题讨论】:
标签: kotlin proguard android-proguard dexguard
内部声明在 Java 中是公开的。内部类的成员去 通过名称修改,使从 Java 中意外使用它们变得更加困难,并允许根据 Kotlin 规则看不到彼此的具有相同签名的成员重载;
查看生成的内部类字节码(com.example.Test 带有内部字段 c)显示如下:
Compile from "Test.kt"
public final class com.example.Test
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
private final int c;
descriptor: I
flags: ACC_PRIVATE, ACC_FINAL
ConstantValue: int 3
public final int getC$Kotlin_debug();
descriptor: ()I
flags: ACC_PUBLIC, ACC_FINAL
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #11 // Field c:I
4: ireturn
内部字段有一个名称损坏的 getter,可用于使用 ProGuard 规则对其进行定位,但内部类本身只是 Java 字节码中的普通公共类,似乎无法专门针对它使用 ProGuard。
【讨论】: