Android平台Android.bp下使用Kotlin @Parcelize实现AIDL Parcelable报错如何解决
问题原因与修复方案
1. 编译配置未开启Parcelize代码生成能力
你当前只引入了kotlin-android-extensions的依赖,但Android.bp中没有给Kotlin编译器传递开启Parcelize功能的参数,编译器不会自动生成Parcelable接口的相关实现方法,因此会抛出类未实现抽象方法的报错。
需要在你的my_module对应的java_library配置块中新增kotlincflags字段,添加相关开启参数:
java_library { name: "my_module", srcs: ["src/main/java/**/*.java", "src/main/java/**/*.kt", "src/main/aidl/**/I*.aidl"], java_version: "1.8", // 新增Kotlin编译器参数 kotlincflags: [ "-P", "android.extensions=true", "-P", "android.extensions.parcelize=true", // 适配1.3.72版本的实验性注解要求 "-Xuse-experimental=kotlinx.android.parcel.Parcelize", ], aidl: { local_include_dirs: ["src/main/aidl"], }, static_libs: [ "kotlin-android-extensions" ], }
2. 类属性定义不符合Parcelize的序列化规则
Kotlin 1.3.72版本的Parcelize默认仅序列化主构造函数中声明的属性,你当前的四个属性都定义在类体内,可能导致生成的实现逻辑异常。建议调整类的写法,将属性放在主构造中声明:
import kotlinx.android.parcel.Parcelize import android.os.Parcelable @Parcelize data class Rect( var left: Int = 0, var top: Int = 0, var right: Int = 0, var bottom: Int = 0 ) : Parcelable
修改完成后重新编译即可解决报错,编译器会自动生成所有Parcelable接口要求的实现方法,不需要手动编写。
内容的提问来源于stack exchange,提问作者Sebastien Delaherche
相关产品推荐
相关产品推荐

