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编译器所展现的;
- 从混淆中排除自己的来源(大多数活动和视图不会被模糊处理)。
- “with”功能的用法
- 命名条件if-value用于if块
- 实例删除RecyclerView中的两个项目,最后一个项目出现重复
- 动画(滚动)一个ViewGroup阻止来自动画的无关视图,直到完成
- 父级保证金更改后,Android子级宽度错误
- Kotlin,Java,multidex,Dagger 2,Butterknife和Realm:transformClassesWithMargingForDebug:重复条目:org / jetbrains / annotations / NotNull.class
- 代码覆盖内联函数
- TextView Null膨胀父布局后
- 将插件升级到3.0.0时出现Gradle构建错误(manifestOutputFile)