Kotlin,Proguard和lambdas

ssu*_*ukk 6 lambda android proguard kotlin

我有一个简洁的功能,可以在视图上执行某些操作:

fun<T : View> Activity.withView(nr : Int, fn : T.()->Unit) {
    (findViewById(nr) as T?)?.fn()
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在我的活动中使用此功能时:

    withView<Spinner>(R.id.spinner_toolbar) {
        adapter = AdapterIndeksuDlaSpinnera(this@NewMainActivity, PlaylistIndex)
Run Code Online (Sandbox Code Playgroud)

......在使用ProGuard之前一切正常.我可以看到AdapterIndeksuDlaSpinnera被破坏,正如预期的那样,但是当使用"无法加载类AdapterIndeksuDlaSpinnera"进行编程时应用程序失败(同时它应该抱怨错误的适配器名称).

我能够通过禁用可以在我的内部使用的所有适配器的修改来创建临时的解决方法 withView

-keep class pl.qus.xenoamp.adapter.** { *; }
Run Code Online (Sandbox Code Playgroud)

但我觉得这不是一个好的解决方案(我不知道其他类可以通过这种方式失败!).所以任何人都可以解释什么是问题,我应该添加什么ProGuard行来潜在地修复内部使用的其他类的类似事件withView

use*_*723 1

这是困难的一个。简而言之,Proguard 不了解 Kotlin。它使用简单的代码分析来检测类似的事情Class.forName()并解决它们,但对于更复杂的事情可能会失败。您需要查看子目录.class中生成的文件build(您可以发布相关文件吗?)以了解到底发生了什么。

现在你可以做两件事:

  • 要求 Kotlin 开发人员为 Kotlin 编译器添加适当的混淆/优化支持:这确实是正确的做法,正如现有的每个非 java 编译器所证明的那样;
  • 将您自己的源排除在混淆之外(无论如何,大多数活动和视图都不会被很好地混淆)。