2016-05-25 14 views
8

Ich habe ein seltsames Problem mit Proguard und Kotlin. Ich wandle ein proguartiertes Projekt nach und nach in Kotlin um - was bis jetzt sehr gut gelaufen ist, aber ich bekomme Fehler beim Konvertieren bestimmter Klassen. Ich konnte noch nicht isolieren, was die besondere Eigenschaft dieser Klassen ist, also bricht sie - sie scheinen sich nicht von den anderen zu unterscheiden. InputStreamWithSource Als Beispiel ist nur:"kann keine referenzierte Klasse finden" mit Proguard und Kotlin

package org.ligi.passandroid.model 

import java.io.InputStream 

class InputStreamWithSource(val source: String, val inputStream: InputStream) 

und es funktioniert vollständig in der IDE - ich zu einem Gerät bereitstellen kann - auch alle UI-Tests laufen gut. Nur wenn das Projekt zu assembleRelease versuche ich proguard Fehler bekomme ich nicht verstehen:

Warning: org.ligi.passandroid.ui.FileUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.FileUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.InputStreamProvider: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassImportActivity$ImportAndShowAsyncTask: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.PassViewActivityBase$UpdateAsync: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.SearchPassesIntentService: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassController$InputStreamUnzipControllerSpec: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassDialog: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassDialog: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassDialog$1AlertDialogUpdater: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 
Warning: org.ligi.passandroid.ui.UnzipPassDialog$1AlertDialogUpdater: can't find referenced class org.ligi.passandroid.model.InputStreamWithSource 

, wenn ich eine dontwarn für diese Klassen in der proguard Konfiguration hinzuzufügen, als es zur Laufzeit stürzt ab - so diese Klassen wirklich entfernt werden - aber Sie sollten nicht entfernt werden, wenn sie verwendet werden.

Ich kann dieses Problem umgehen, durch Klasse/Enum für diese Klassen in der proguard-config halten Zugabe - aber die Frage ist, warum dies für diese Klassen benötigt wird - IMHO sollte es nicht

Jeder benötigt einige hat Idee, was könnte dies verursachen oder wie kann dieses Problem am besten untersucht werden? Die vollständige Quelle ist hier: https://github.com/ligi/PassAndroid

Antwort

1

Ich würde sicherstellen, dass ich mein eigenes Paket in proguard definiert haben - etwa so:

-dontwarn org.ligi.passandroid.** 
-keep class org.ligi.passandroid.** { *; } 
+0

Wenn Sie das tun, dann hat es keinen Sinn proguard überhaupt in Laufen –

+0

@GregEnnis für Ihren eigenen Code, der in Ordnung wäre, da jeder Code, der nicht verwendet wird, aus dem Projekt gelöscht werden sollte. Der Code von Drittanbietern ist eine andere Geschichte. –