如何使用 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 库:如何只保留类和方法名?