Android AIDL:从java更改代码到kotlin之后项目崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android AIDL:从java更改代码到kotlin之后项目崩溃相关的知识,希望对你有一定的参考价值。

这些是我的项目AIDL-ClientAIDL-Server的链接。脚步:

  1. 请安装两个apks。
  2. 然后单击“BIND设备按钮”
  3. “IBindDeviceCallback:deviceName:tpd deviceBrand:loop”在客户端项目中打印
  4. 在AIDL-Server项目中将“AIDLService.java”更改为“AIDLService.kt”,然后安装apk。
  5. 然后单击AIDL-server项目的“BIND设备按钮”

你会发现崩溃。

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$1.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行,您将bindDevice deviceCertificate传递给byte[]。例外情况是告诉您这不能为空。

将服务从Java转换为Kotlin时,默认情况下将方法参数视为非null,deviceCertifcate: ByteArray。如果你告诉Kotlin这个参数可以为null,它就不会崩溃。这是通过用?(即deviceCertifcate: ByteArray?)声明类型来实现的。

有关更多信息,请参阅the Kotlin docs on Null-Safety.

在普通的Kotlin应用程序中,这甚至不会编译,但由于这通过AIDL跨越进程边界,编译器无法捕获此问题。

以上是关于Android AIDL:从java更改代码到kotlin之后项目崩溃的主要内容,如果未能解决你的问题,请参考以下文章

多个 AIDL 版本

将数据从 Android AIDL 发送到多个客户端

Android进阶笔记:AIDL内部实现详解

Android中AIDL的使用

Android AIDL使用详解_Android IPC 机制详解

Android Studio开发环境建立aidl文件,怎么生成相应的java文件