android - "can' t find referenced class"with Proguard and Kotlin

标签 android proguard kotlin android-proguard

我在使用 proguard 和 kotlin 时遇到了一个奇怪的问题。我正在逐渐将一个 proguarded 项目转换为 kotlin - 到目前为止效果很好,但是在转换某些类时我遇到了 proguard 错误。我还不能分离出这些类的特殊属性是什么,所以它坏了——它们似乎与其他类没有什么不同。例如 InputStreamWithSource 只是:

package org.ligi.passandroid.model

import java.io.InputStream

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

它完全可以在 IDE 中运行——我可以部署到设备上——而且所有 UI 测试都运行良好。就在尝试 assembleRelease 项目时,我遇到了我不明白的 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

最佳答案

我会确保我在 proguard 中定义了自己的包 - 如下所示:

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

关于android - "can' t find referenced class"with Proguard and Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37431372/

相关文章:

android - 资源xml文件中的数组是否有序?

android - 带有口味配置的Gradle

Android Studio 北极狐 | 2020.3.1 Canary 14 找不到参数的方法 dependencyResolutionManagement()

Android Studio Assets 文件夹丢失

java - 注意 : android. support.v4.app.NotificationCompat Jellybean 调用 'Field.getType'

proguard - 如何抑制来自 ProGuard 的 'Maybe this is program method' 警告

android - java.lang.IllegalStateException : DataBindingUtil. inflate<ViewDataBinding>(...) 在尝试使用 DataBindingUtil 膨胀时不能为 null

android - 下载管理器 android 出错

android - Proguard 与应用内购买 "Duplicate zip entry"错误

java - 使用 android fragment backstack 的最佳方法是什么?