【问题标题】:Kotlin abstract generic with ProGuard带有 ProGuard 的 Kotlin 抽象泛型
【发布时间】:2018-09-18 07:00:15
【问题描述】:

我有以下基类:

abstract class BaseFragment<T : BaseViewModel> : Fragment(), JobHolder {
    protected lateinit var viewModel: T
        private set

    protected fun provideViewModel(type: Class<T>) {
        viewModel = ViewModelProviders.of(this).get(type)
    }
}

还有以下类:

class SubjectEditor : BaseFragment<SubjectEditorViewModel>() {
    override fun onAttach(context: Context?) {
        super.onAttach(context)
        provideViewModel(SubjectEditorViewModel::class.java)
    }
}

但 ProGuard 抱怨:

Warning: cz.x.ui.subjects.SubjectEditor: can't find referenced method 'void setViewModel(cz.x.ui.BaseViewModel)' in program class cz.x.ui.subjects.SubjectEditor

我为 ProGuard 尝试了一些 -keep 规则,但没有任何效果。正确的解决方案是什么?

【问题讨论】:

    标签: android kotlin proguard


    【解决方案1】:

    我猜你不希望它被混淆,所以在这种情况下你应该将方法保留在抽象类中:

    -keep public class {path to your class}.BaseFragment{
       private <methods>;
    }
    

    this link 中有一个非常有用的 ProguardGuide 阅读后,您应该对应该使用哪些规则更有信心。

    希望对你有帮助,否则请告诉我!

    【讨论】:

    • 不是这样的。即使我这样做-keep class cz.x.ui.BaseFragment { *; },我也会收到警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多