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编译器所展现的;
- 从混淆中排除自己的来源(大多数活动和视图不会被模糊处理)。