Android 13调用isInterface()触发空指针异常求助
问题排查与解决方案
崩溃原因分析
这个NullPointerException是因为Android 13(TIRAMISU)环境下调用bundle.getParcelable(ARG_TAG, Tab::class.java)时,系统内部尝试对null的Class对象调用isInterface()方法。大概率和以下几点有关:
@Parcelize生成的Parcelable实现与Android 13系统API存在兼容性问题- Tab类被代码混淆破坏,导致反射时无法正确获取Class对象
- Bundle中
ARG_TAG对应条目本身为null,但系统API处理null值时触发异常
解决步骤
1. 先判断Bundle中是否存在目标条目
调用getParcelable前先检查Bundle是否包含ARG_TAG,避免读取不存在的条目:
val temp = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (bundle.containsKey(ARG_TAG)) { bundle.getParcelable(ARG_TAG, Tab::class.java) } else { null } } else { bundle.getParcelable(ARG_TAG) }
2. 确认Parcelize插件配置正确
确保Module级build.gradle中已正确引入kotlin-parcelize插件:
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-parcelize' // 必须添加该插件 }
3. 检查混淆规则(若开启混淆)
如果项目开启了代码混淆,需在proguard-rules.pro中添加规则保留Parcelable相关类:
# 保留Parcelable实现类及其CREATOR -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留@Parcelize注解的类及相关成员 -keep @kotlinx.parcelize.Parcelize class * -keepclassmembers class * { @kotlinx.parcelize.WriteWith <fields>; }
4. 改用兼容的Parcelable读取方式
如果上述方法无效,可尝试以下两种兼容方案:
方式一:使用AndroidX的BundleCompat
该工具类会自动适配不同Android版本,无需手动判断SDK_INT:
import androidx.core.os.BundleCompat val temp = BundleCompat.getParcelable(bundle, ARG_TAG, Tab::class.java)
方式二:手动实现Parcelable(替代@Parcelize)
若@Parcelize生成的代码存在问题,可手动编写Parcelable实现:
@Keep data class Tab( val data: List<String>? = null, val icon: String? = null, val provider: String? = null, val subtype: String? = null, val title: String, val items: Int = 0 ) : Parcelable { constructor(parcel: Parcel) : this( parcel.createStringArrayList(), parcel.readString(), parcel.readString(), parcel.readString(), parcel.readString()!!, parcel.readInt() ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeStringList(data) parcel.writeString(icon) parcel.writeString(provider) parcel.writeString(subtype) parcel.writeString(title) parcel.writeInt(items) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Tab> { override fun createFromParcel(parcel: Parcel): Tab { return Tab(parcel) } override fun newArray(size: Int): Array<Tab?> { return arrayOfNulls(size) } } }
内容的提问来源于stack exchange,提问作者Sohaib Ahmed
相关产品推荐
相关产品推荐

