Kotlin,Proguard和lambda

我有一个整洁的function,在视图上做一些事情:

fun Activity.withView(nr : Int, fn : T.()->Unit) { (findViewById(nr) as T?)?.fn() } 

现在,当我在我的活动中使用这个函数时:

  withView(R.id.spinner_toolbar) { adapter = AdapterIndeksuDlaSpinnera(this@NewMainActivity, PlaylistIndex) 

…一切正常,直到我使用ProGuard。 我可以看到AdapterIndeksuDlaSpinnera正如预期的AdapterIndeksuDlaSpinnera受到了损坏,但是当程序用“无法加载类AdapterIndeksuDlaSpinnera”(同时它应该抱怨损坏的适配器名称)进行编程时失败。

我能够通过禁用所有可以在我的withView使用的适配器来创建速度解决方法

 -keep class pl.qus.xenoamp.adapter.** { *; } 

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

这是困难的一个。 简而言之,Proguard并不知道Kotlin。 它正在使用一个简单的代码分析来检测类似Class.forName()东西,并绕过它们,但是可能会失败的更复杂。 你需要从build子目录中查看生成的.class文件(你可以发布相关的文件吗?)来找出真正发生的事情。

现在你可以做两件事情:

  • 要求Kotlin开发人员为Kotlin编译器添加适当的模糊/优化支持:这是真正做事情的正确方法 ,正如每个非java编译器所展现的;
  • 从混淆中排除自己的来源(大多数活动和视图不会被模糊处理)。