如何使用 proguard 定位 kotlin `internal` 类?

Posted

技术标签:

【中文标题】如何使用 proguard 定位 kotlin `internal` 类?【英文标题】:How can I target kotlin `internal` classes with proguard? 【发布时间】:2018-09-12 22:00:07 【问题描述】:

我想保护(混淆)任何标有 kotlin internal 可见性修饰符的类。

Kotlin internal 类在 JVM 上是公共的,因此它们在 Java 源代码中是可见和可用的。我不希望这些类被使用或出现在自动完成中,所以我想混淆它们以阻止它们的使用。

我可以对目标internal 类应用什么保护规则?

【问题讨论】:

【参考方案1】:

如Kotlin reference guide中所述:

内部声明在 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。

【讨论】:

以上是关于如何使用 proguard 定位 kotlin `internal` 类?的主要内容,如果未能解决你的问题,请参考以下文章

带有 proguard 的 Kotlin AAR 库:如何只保留类和方法名?

启用 proguard 后无法访问 kotlin 类中使用的伴随对象

Proguard 和 Kotlin 的“找不到引用的类”

Kotlin、Proguard 和 lambdas

带有 Proguard 的 Kotlin 反射失败

启用 Proguard 时未找到 kotlin.Any