簡體   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