2016-02-19 19 views
5

Ho una funzione pulito che fa qualcosa su una visione:Kotlin, Proguard e lambda

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

Ora, quando uso questa funzione nella mia attività:

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

... tutto è OK fino a quando non uso ProGuard. Vedo che AdapterIndeksuDlaSpinnera viene manomesso, come previsto, ma l'applicazione non riesce quando proguardato con "Impossibile caricare la classe AdapterIndeksuDlaSpinnera" (mentre dovrebbe lamentarsi del nome dell'adattatore manomesso).

sono stato in grado di creare temporanee soluzione disabilitando storpiatura di tutti gli adattatori che possono essere utilizzati all'interno del mio withView

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

ma non mi sento che è una buona soluzione (e non ho idea di quello che le altre classi può fallire in questo modo!). Quindi qualcuno può spiegare qual è il problema e quale linea ProGuard dovrei aggiungere per correggere potenzialmente occorrenze simili di altre classi utilizzate all'interno di withView?

+1

Potresti inserire il file '.class' per l'adattatore e il file, contenente la chiusura? Possono essere trovati in 'build/intermediates/classes /' del progetto Android. – user1643723

+0

Lasciaci [continuare questa discussione in chat] (http://chat.stackoverflow.com/rooms/103964/discussion-between-user1643723-and-ssuukk). – user1643723

risposta

1

Questo è un duro. In breve, Proguard non conosce Kotlin. Sta usando una semplice analisi del codice per rilevare cose come Class.forName() e aggirarle, ma potrebbe fallire per qualcosa di più complesso. Hai bisogno di guardare i file .class generati dalle sottodirectory build (puoi pubblicare quelli rilevanti?) Per scoprire cosa succede veramente.

Per ora si possono fare due cose:

  • Chiedi sviluppatori Kotlin aggiungere adeguato sostegno offuscamento/ottimizzazione al compilatore Kotlin: questo è davvero il modo giusto di fare le cose, come dimostrato da ogni non -java compilatore in esistenza;
  • Escludere le proprie fonti dall'offuscamento (la maggior parte delle attività e dei punti di vista non saranno comunque ben nascosti).
+1

È possibile aggiungere una richiesta di funzionalità per cose come l'offuscamento su https://youtrack.jetbrains.com ... assicurarsi di includere la difficoltà degli obfuscaters di post-compilazione nel sapere cosa è sicuro o non è dato solo il file di classe. (ma poi ancora, è difficile offuscare senza conoscere gli usi al di fuori di un modulo di compilazione corrente, quindi una versione in fase di compilazione potrebbe avere anche problemi, solo diversi) –