Flutter集成RFID安卓手持终端Release版本Parcelable转换崩溃求助
解决Flutter Pigeon通信Release版本Parcelable类型转换崩溃问题
问题原因
Release版本默认开启代码混淆(R8/ProGuard),导致实现Parcelable接口的TagInfo类的类型信息被混淆或篡改,当执行val results = msg.obj as Array<Parcelable>时,因类型匹配失败抛出ClassCastException;而Debug版本关闭了混淆,类的完整类型信息被保留,因此无此问题。
解决方案
1. 给TagInfo类添加@Keep注解
使用AndroidX的@Keep注解标记TagInfo类,阻止混淆工具修改该类的类型信息:
import androidx.annotation.Keep import android.os.Parcelable import android.os.Parcel @Keep data class TagInfo(/* 你的字段定义 */) : Parcelable { constructor(parcel: Parcel) : this( // 从parcel读取字段的逻辑 ) override fun writeToParcel(parcel: Parcel, flags: Int) { // 写入字段到parcel的逻辑 } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<TagInfo> { override fun createFromParcel(parcel: Parcel): TagInfo { return TagInfo(parcel) } override fun newArray(size: Int): Array<TagInfo?> { return arrayOfNulls(size) } } }
2. 添加ProGuard混淆规则(备用)
如果@Keep注解未生效,直接在app模块的proguard-rules.pro文件中添加规则,保留TagInfo类及其Parcelable相关组件:
# 保留TagInfo类的所有成员 -keep class com.your.package.path.TagInfo { *; } # 保留Parcelable的CREATOR实例 -keepclassmembers class com.your.package.path.TagInfo implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; }
注意替换com.your.package.path为TagInfo实际所在的包路径。
3. 保留Pigeon生成的通信类
确保Pigeon生成的跨语言通信类不被混淆,同样在proguard-rules.pro中添加:
-keep class com.your.package.path.pigeon.** { *; }
替换为你项目中Pigeon代码生成的包路径。
4. 增加类型安全检查
在强转前先判断对象类型,避免直接强转导致崩溃,同时添加日志便于排查:
val obj = msg.obj if (obj is Array<*>) { try { val results = obj as Array<Parcelable> // 处理RFID标签逻辑 } catch (e: ClassCastException) { Log.e("RFID", "Failed to cast object to Array<Parcelable>: ${e.message}") } } else { Log.e("RFID", "Received unexpected object type: ${obj?.javaClass?.name}") }
内容的提问来源于stack exchange,提问作者S. Aziz Kazdal
相关产品推荐
相关产品推荐

