【问题标题】:Proguard generating notes for all INSTANCE fields with kotlin-reflectProguard 使用 kotlin-reflect 为所有 INSTANCE 字段生成注释
【发布时间】:2018-07-10 17:41:16
【问题描述】:

我已将 kotlin-reflect 库添加到我的 Android 项目中,现在 Proguard 正在生成数百行注释,列出所有具有名为 INSTANCE 的字段的类,其中当然包括每个 Kotlin object .

这只是 Proguard 输出的一小部分:

Note: kotlin.reflect.jvm.internal.KClassImpl$Data$objectInstance$2 accesses a declared field 'INSTANCE' dynamically
      Maybe this is program field 'co.zsmb.example.proguardkttest.MySingleton { co.zsmb.example.proguardkttest.MySingleton INSTANCE; }'
      Maybe this is program field 'kotlin.UNINITIALIZED_VALUE { kotlin.UNINITIALIZED_VALUE INSTANCE; }'
      Maybe this is program field 'kotlin.Unit { kotlin.Unit INSTANCE; }'
      Maybe this is program field 'kotlin._Assertions { kotlin._Assertions INSTANCE; }'
      Maybe this is program field 'kotlin.collections.EmptyIterator { kotlin.collections.EmptyIterator INSTANCE; }'
      Maybe this is program field 'kotlin.collections.EmptyList { kotlin.collections.EmptyList INSTANCE; }'
      Maybe this is program field 'kotlin.collections.EmptyMap { kotlin.collections.EmptyMap INSTANCE; }'
      Maybe this is program field 'kotlin.collections.EmptySet { kotlin.collections.EmptySet INSTANCE; }'
      Maybe this is program field 'kotlin.comparisons.NaturalOrderComparator { kotlin.comparisons.NaturalOrderComparator INSTANCE; }'

如您所见,它既包括我自己的 MySingleton 类,也包括 Kotlin 标准库中的许多类,并且它也可以在任何其他库中找到这些字段(如果存在)。

【问题讨论】:

    标签: android kotlin singleton proguard kotlin-reflect


    【解决方案1】:

    错误的第一行告诉我们这里出了什么问题,它发现无论kotlin.reflect.jvm.internal.KClassImpl$Data$objectInstance$2是什么,它正在通过反射访问一个名为INSTANCE的字段。 Proguard 无法判断此代码​​访问的 INSTANCE 字段是哪个类,因此它会警告我们每个具有此字段的类,以防万一。

    如果我们查看source of KClassImpl,我们会很快找到culprit:它包含一个名为objectInstance 的属性,它在某些情况下调用Class#getDeclaredField 方法,传入一个值为@ 的常量987654330@ 作为参数。这就是 Proguard 正在检测的内容。

    所以,除非你有一个单例类,并且你通过它的KClass 访问它的实例,像这样:

    val instance = MySingleton::class.objectInstance
    

    您可以忽略 Proguard 注释,并将以下规则添加到您的 proguard-rules.pro 文件中:

    -dontnote kotlin.reflect.jvm.internal.KClassImpl$Data$objectInstance**
    

    您也可以用objectInstance$2 精确结束它,但是库中的实现更改可能会在将来更改该位置编号。这样一来,您将忽略出现的所有关于 objectInstance 属性及其实现的注释。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2019-04-01
      • 2020-02-29
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多