为什么当minify为true时我才遇到Parcelable问题?

时间:2019-07-18 15:21:18

标签: android proguard parcelable

我的应用程序在调试版本上运行良好,但是当我发布时,唯一的区别是混淆,该应用程序不能很好地运行

 fun upsertPatient(patient: Patient, onCompletion: (Patient) -> Unit) {
        val px = PatSecHelper.patToN(patient, SecHelper.genKey())
        if (px != null) {
            val subscription = Single.fromCallable {
                val id = patientDao?.insertPatient(px)
                px.id = id
                px
            }
                    ?.subscribeOn(Schedulers.io())
                    ?.subscribe({
                        onCompletion(it!!)
                    }, {
                        BleLogHelper.writeError("Error inserting patient into database", it)
                    })
            subscriptions.add(subscription)
        }
    }

在调试模式下可以正常工作,但在发布时会在上面的此方法上引发异常。

Unable to find generated Parcelable class for io.b4c.myapp.a.f, verify that your class is configured properly and that the Parcelable class io.b4c.myapp.a.f$$Parcelable is generated by Parceler.

2 个答案:

答案 0 :(得分:3)

当minify为true时,还将使用proguard重写名称。要将其保留为原始版本,请将其添加到proguard.cfg文件中,例如:

public static void LoadComboBoxFromFind(ref CustomStuff.Controls.CustomComboBox sender)
{
    KryptonComboBox temp = (KryptonComboBox)sender;
    LoadComboBoxFromFind(ref temp);
}

您还可以按照以下规则使其更容易:

-keep class com.example.Patient.** { *; }

它使所有实现Parcelable的类都保持不混淆其CREATOR字段。看到这里:Node.appendChild() on MDN

答案 1 :(得分:2)

尽管文档说您必须将这些行放在Gradle中:

compile 'org.parceler:parceler-api:1.1.6'
annotationProcessor 'org.parceler:parceler:1.1.6'

将其更改为:

compile 'org.parceler:parceler-api:1.1.6'
kapt 'org.parceler:parceler:1.1.6'

确保要使用的所有文件都用@Parcel批注。

我有一个First类和一个Second变量的类,却忘记了对Second类的注释。这就是为什么从annotationProcessor更改为apt会导致构建错误的原因。

另外,别忘了在您的proguard文件中添加-keep class com.example.Patient.** { *; }