Android &引用;can';“找不到引用的类”;和Proguard和Kotlin在一起

Android &引用;can';“找不到引用的类”;和Proguard和Kotlin在一起,android,proguard,kotlin,android-proguard,Android,Proguard,Kotlin,Android Proguard,我对proguard和kotlin有一个奇怪的问题。我正在逐渐地将一个proguard项目转换为kotlin——到目前为止进展得非常顺利,但在转换某些类时,我遇到了proguard错误。我还不能分离出这些类的特殊属性是什么,所以它会断裂——它们似乎与其他类没有什么不同。例如,InputStreamWithSource就是: package org.ligi.passandroid.model import java.io.InputStream class InputStreamWithSo

我对proguard和kotlin有一个奇怪的问题。我正在逐渐地将一个proguard项目转换为kotlin——到目前为止进展得非常顺利,但在转换某些类时,我遇到了proguard错误。我还不能分离出这些类的特殊属性是什么,所以它会断裂——它们似乎与其他类没有什么不同。例如,InputStreamWithSource就是:

package org.ligi.passandroid.model

import java.io.InputStream

class InputStreamWithSource(val source: String, val inputStream: InputStream)
它完全可以在IDE中工作——我可以部署到设备上——而且所有的UI测试都运行良好。就在试图简化项目时,我遇到了proguard错误,我不明白:

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
当我在proguard配置中为这些类添加dontwarn时,它会在运行时崩溃——因此这些类确实被删除了——但它们不应该在使用时被删除

我可以通过在proguard配置中为这些类添加keep class/enum来解决这个问题,但问题是为什么这些类需要keep class/enum,为什么不需要它


有人知道是什么导致了这一问题,或者知道如何最好地调查这一问题吗?完整的源代码如下:

我会确保在proguard中定义了我自己的包-类似于以下内容:

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

如果你这么做了,那么运行proguard就没有意义了all@GregEnnis对于您自己的代码来说,这很好,因为任何未使用的代码都应该从项目中删除。第三方代码是另一回事。@GregEnnis是对的。如果您希望使用proguard不仅用于优化(您可能会提到的),还用于模糊处理,那么您不应该这样做,因为它将保留您自己的所有代码,任何获得APK的人都可以阅读。@ubuntudroid
-keep
表示您将类保留在包下,而不是让proguard删除它们<代码>指定要保留作为代码入口点的类和类成员(字段和方法)。与混淆代码无关。模糊处理选项@RayHunter我被纠正了-我的错。谢谢你的参考资料!:)