Android AIDL:将代码从 java 更改为 kotlin 后项目崩溃
Android AIDL: Project crash after change code to kotlin from java
这些是我项目的link
AIDL-Client, AIDL-Server。
步骤:
请安装这两个 apk。
然后点击“绑定设备按钮”
"IBindDeviceCallback: deviceName: tpd deviceBrand: loop" is print in client project
在 AIDL-Server 项目中将“AIDLService.java”更改为“AIDLService.kt”然后安装 apk。
然后点击AIDL-server项目的“绑定设备按钮”
你会发现崩溃。
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter deviceCertifcate
at android.os.Parcel.readException(Parcel.java:1697)
at android.os.Parcel.readException(Parcel.java:1646)
at com.loop.ILoopService$Stub$Proxy.bindDevice(ILoopService.java:88)
at com.client.MainActivity$mServiceConnection.onServiceConnected(MainActivity.kt:53)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1516)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1544)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
看起来像 android/kotlin 的问题,而不是我的。
关于这个崩溃有什么想法,如何在 kotlin 中修复它?
异常看起来像是来自 Android 的原因是因为它在进程之间传递。
在客户端代码的 MainActivity.kt
行 53 上,您将 null 传递给 bindDevice
deviceCertificate
byte[]
。异常告诉您这不能为空。
当您将服务从 Java 转换为 Kotlin 时,它默认将方法参数视为非空 deviceCertifcate: ByteArray
。如果你告诉 Kotlin 这个参数可以为 null,它就不会崩溃。这是通过使用 ?
声明类型来实现的,即 deviceCertifcate: ByteArray?
.
有关详细信息,请参阅 the Kotlin docs on Null-Safety.
在普通的 Kotlin 应用程序中,这甚至无法编译,但由于它通过 AIDL 跨越进程边界,编译器无法捕获此问题。
这些是我项目的link AIDL-Client, AIDL-Server。 步骤:
请安装这两个 apk。
然后点击“绑定设备按钮”
"IBindDeviceCallback: deviceName: tpd deviceBrand: loop" is print in client project
在 AIDL-Server 项目中将“AIDLService.java”更改为“AIDLService.kt”然后安装 apk。
然后点击AIDL-server项目的“绑定设备按钮”
你会发现崩溃。
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter deviceCertifcate
at android.os.Parcel.readException(Parcel.java:1697)
at android.os.Parcel.readException(Parcel.java:1646)
at com.loop.ILoopService$Stub$Proxy.bindDevice(ILoopService.java:88)
at com.client.MainActivity$mServiceConnection.onServiceConnected(MainActivity.kt:53)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1516)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1544)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
看起来像 android/kotlin 的问题,而不是我的。
关于这个崩溃有什么想法,如何在 kotlin 中修复它?
异常看起来像是来自 Android 的原因是因为它在进程之间传递。
在客户端代码的 MainActivity.kt
行 53 上,您将 null 传递给 bindDevice
deviceCertificate
byte[]
。异常告诉您这不能为空。
当您将服务从 Java 转换为 Kotlin 时,它默认将方法参数视为非空 deviceCertifcate: ByteArray
。如果你告诉 Kotlin 这个参数可以为 null,它就不会崩溃。这是通过使用 ?
声明类型来实现的,即 deviceCertifcate: ByteArray?
.
有关详细信息,请参阅 the Kotlin docs on Null-Safety.
在普通的 Kotlin 应用程序中,这甚至无法编译,但由于它通过 AIDL 跨越进程边界,编译器无法捕获此问题。