繁体   English   中英

Kotlin,Proguard和lambdas

[英]Kotlin, Proguard and lambdas

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

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

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

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

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

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

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

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

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

现在你可以做两件事:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM