2016-02-19 18 views
5

Mam schludny funkcji, która robi coś na widoku:Kotlin, Proguard i lambdas

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

Teraz, kiedy korzystać z tej funkcji w mojej działalności:

withView<Spinner>(R.id.spinner_toolbar) { 
     adapter = AdapterIndeksuDlaSpinnera([email protected], PlaylistIndex) 

... wszystko jest OK, dopóki nie skorzystam z ProGuard. Widzę, że AdapterIndeksuDlaSpinnera zostaje zmanipulowany zgodnie z oczekiwaniami, ale aplikacja kończy się niepowodzeniem, gdy jest wyświetlana z napisem "Nie można załadować klasy AdapterIndeksuDlaSpinnera" (podczas gdy powinna narzekać na zniekształconą nazwę adaptera).

udało mi się stworzyć temporaty obejścia poprzez wyłączenie maglowania wszystkich adapterów, które można wykorzystać w moim withView

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

ale nie czuję, że to dobre rozwiązanie (i nie mam pojęcia, co innych klas może zawieść w ten sposób!). Czy ktoś może wyjaśnić, na czym polega problem i jaką linię ProGuard powinienem dodać, aby potencjalnie naprawić podobne wystąpienia innych klas używanych w withView?

+1

Czy możesz napisać plik '.class' dla adaptera, jak również plik zawierający zamknięcie? Można je znaleźć w 'build/intermediates/classes /' projektu Android. – user1643723

+0

Pozwól nam [kontynuować tę dyskusję na czacie] (http://chat.stackoverflow.com/rooms/103964/discussion-between-user1643723-and-ssuukk). – user1643723

Odpowiedz

1

To jest trudne. W skrócie, Proguard nie wie o Kotlin. Używa prostej analizy kodu do wykrycia rzeczy takich jak Class.forName() i obejścia ich, ale może zawieść dla czegoś bardziej złożonego. Musisz spojrzeć na wygenerowane pliki .class z podkatalogów build (czy możesz zamieścić odpowiednie?), Aby dowiedzieć się, co naprawdę się dzieje.

Na razie można zrobić dwie rzeczy:

  • Zapytaj Devs Kotlin dodać odpowiednie wsparcie zaciemniania/optymalizacji kompilator Kotlin: to jest naprawdę właściwa droga robić rzeczy, o czym świadczy każdy zakaz -java kompilator w istnieniu;
  • Wyklucz własne źródła z zaciemniania (większość działań i widoków i tak nie będzie dobrze zaciemniona).
+1

Możesz dodać prośbę o dodanie czegoś takiego jak zaciemnianie na https://youtrack.jetbrains.com ... pamiętaj o tym, aby uwzględnić obskurność po kompilacji, wiedząc, co jest bezpieczne, czy nie, biorąc pod uwagę tylko plik klasy. (ale z drugiej strony trudno jest zaciemnić, nie znając zastosowań poza bieżącym modułem kompilacji, więc wersja kompilująca może mieć również problemy, po prostu inne) –