【问题标题】:Obfuscation of Kotlin Data Class' toString MethodKotlin 数据类的 toString 方法的混淆
【发布时间】:2020-11-23 23:58:27
【问题描述】:

我在我的应用中到处使用 Kotlin 数据类。

我在编译时使用 R8。

我有一个安全要求,生成的toString 方法不能包含原始属性名称。目前,生成的方法包含整个类的纯文本属性名称及其混淆值名称。

public String toString() {
    return "MyClass(id="+this.f1231msd+", password="+this.fj92313+")");
}

我有几个选项,但我想看看是否还有其他我没有找到的选项。

  1. 我检查了 Proguard 的源代码,发现 this classtoString 方法中使用了混淆名称。如果 R8 这样做但似乎没有这样做,这将是完美的。
  2. 使用空白字符串手动覆盖每个数据类的toString 方法。
  3. 为我写一个 R8 规则到第 2 步
  4. 创建一个编译时注释以返回一个空白字符串 toString

还有其他选择吗?

【问题讨论】:

  • 5.摆脱toString() 调用,然后查看R8 是否将实现删除为未使用。 6. 提交功能请求让 R8 处理此问题。 7. 为“override toString() with blank output”场景写一个Kotlin编译器插件。
  • 5.好点子。我认为你是对的。我使用 Timber 进行日志记录,所以 R8 可能没有剥离这些类 toString() 方法的隐式使用。 6. 可以这样做 7. 目前正在考虑实现一个编校编译器插件 - github.com/ZacSweers/redacted-compiler-plugin 谢谢你回到我身边

标签: android kotlin android-r8


【解决方案1】:

在寻找其他选项和解决方案后,我决定修改一个现有的编译器插件,以便为我自动执行此操作。

这样做的目的是让我在开发期间仍然可以从 Kotlin 自动生成的 toString() 方法中受益,但随后会在发布编译时编辑 toString() 的内容。

它输出这样的方法:

public String toString() {
    return "██";
}

目前这只是在分支redact-all-and-class-names 中的my fork,但它可能会包含在主库中。

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2010-12-10
    • 2012-02-24
    • 1970-01-01
    • 2016-07-04
    • 2017-04-13
    • 2014-01-13
    • 2021-07-02
    相关资源
    最近更新 更多