使用Proguard和Kotlin时出现“找不到引用类”的问题

12

我在使用Proguard和Kotlin时遇到了一个奇怪的问题。我正在逐步将一个已经经过混淆的项目转换为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-config中为这些类添加keep class / enum来解决此问题-但问题是为什么需要这些类-我认为不应该需要。
有人有什么想法可能是什么原因导致这种情况或如何最好地调查这个问题吗?完整的源代码在这里:https://github.com/ligi/PassAndroid
1个回答

1

我会确保在proguard中定义了自己的软件包 - 就像这样:

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

3
如果你这样做,那么运行 Proguard 就没有任何意义了。 - Greg Ennis
1
@GregEnnis 对于你自己的代码,这是可以的,因为任何未使用的代码都应该从项目中删除。第三方代码则是另一回事。 - Ray Hunter
@GregEnnis是正确的。如果你想使用Proguard不仅仅是为了优化(你可能指的是这个),而且还想用它来混淆代码,那么你不应该这样做,因为这会使得你所有的代码都保持原样,对于任何获取你的APK的人来说都很容易阅读。 - ubuntudroid
1
@ubuntudroid -keep 表示您将保留包中的类,而不是让 Proguard 将它们删除。 指定要保留为代码入口点的类和类成员(字段和方法)。 https://www.guardsquare.com/en/products/proguard/manual/usage 与混淆代码无关。混淆选项 https://www.guardsquare.com/en/products/proguard/manual/usage#obfuscationoptions - Ray Hunter
1
@RayHunter 我错了 - 是我的错。谢谢你提供的参考! :) - ubuntudroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接