【问题标题】:Kotlin disable metadata annotationKotlin 禁用元数据注释
【发布时间】:2019-10-25 05:02:04
【问题描述】:

有什么方法可以禁用 Kotlin 元数据或只是混淆它们?它是在编译期间添加的。 整个代码都被很好地混淆了,但名为“kotlin-reflect.jar”的 Kotlin 库留下了方法细节,如类名、方法和带有类型的参数。

@Metadata(mv = {1, 1, 13}, bv = {1, 0, 3}, k = 1, d1 = {"\000\022\n\002\030\002\n\002\030\002\n\000\n\002\020\016\n\002\b\002\030\0002\0020\001B \r\022\006\020\002\032\0020\003?\006\002\020\004R\016\020\002\032\0020\003X?\004?\006\002\n\000 \006\005"}, d2 = {"Lcom/test/SomeException;", "Lcom/test/SomeException;", "errorMessage", "", "(Ljava/lang/String;)V", "build"}) 公共最终类 SomeException 扩展异常 { public SomeException(@NotNull String paramString) { super(paramString); this.errorMessage = 参数字符串; } 私有最终字符串错误消息; }

【问题讨论】:

  • 我认为任何 Java .jar/.class 混淆器都应该可以工作。但是,您应该注意,这可能会破坏或显着影响依赖于方法、字段和(如果您也混淆了这些)类名的任何内容,包括反射、依赖注入、日志、堆栈跟踪等。而且它不能阻止人们反编译代码本身。
  • 最后使用 R8 代替 Proguard 具有相同的规则,它在 dexing 步骤上工作,但相同的类仍然有这个带有类、方法和参数详细信息的注释。我认为这是 Kotlin 语言中的巨大安全漏洞,应该以某种方式修复。不确定此元数据是否仍在使用,因为代码中不再使用真实姓名。
  • 我们不知道您的 R8/ProGuard 规则是什么,例如如果您的 keep 规则过于宽泛。
  • @Michael 这绝对不是keep 规则。如上所述 - 元数据在 dexing 步骤中被删除(apk 构建的一部分)。

标签: kotlin proguard obfuscation decompiling


【解决方案1】:

我创建了“unmeta”,这是一个 Android Gradle 插件,它删除了发布版本的所有 Kotlin @Metadata@DebugMetadata 注释。

你可以在这里找到它:https://github.com/oliver-jonas/unmeta

它使用 ASM 并直接对编译后的字节码进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2017-10-24
    • 2017-05-22
    • 2020-01-22
    相关资源
    最近更新 更多