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

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

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

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

【问题讨论】:

    标签: kotlin proguard android-proguard dexguard


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2019-04-02
      • 2018-02-16
      • 2016-05-31
      相关资源
      最近更新 更多