Android AIDL:将代码从 java 更改为 kotlin 后项目崩溃

Android AIDL: Project crash after change code to kotlin from java

这些是我项目的link AIDL-Client, AIDL-Server。 步骤:

  1. 请安装这两个 apk。

  2. 然后点击“绑定设备按钮”

  3. "IBindDeviceCallback: deviceName: tpd deviceBrand: loop" is print in client project

  4. 在 AIDL-Server 项目中将“AIDLService.java”更改为“AIDLService.kt”然后安装 apk。

  5. 然后点击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 跨越进程边界,编译器无法捕获此问题。