gpt4 book ai didi

android - Proguard 使用 kotlin-reflect 为所有 INSTANCE 字段生成注释

转载 作者:行者123 更新时间:2023-11-29 23:46:39 26 4
gpt4 key购买 nike

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

这只是 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 标准库中的许多类,并且它还能在任何其他库中找到这些字段,如果它们存在的话.

最佳答案

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

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

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

val instance = MySingleton::class.objectInstance

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

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

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

关于android - Proguard 使用 kotlin-reflect 为所有 INSTANCE 字段生成注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com