【问题标题】:Android AIDL: Project crash after change code to kotlin from javaAndroid AIDL:将代码从 java 更改为 kotlin 后项目崩溃
【发布时间】:2018-01-26 16:34:37
【问题描述】:

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

  1. 请安装两个 apk。

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

  3. IBindDeviceCallback: deviceName: tpd deviceBrand: loop”在客户端项目中打印

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

  5. 然后点击 AIDL-server 项目的“BIND Device button”

你会发现崩溃的。

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 crash kotlin aidl


    【解决方案1】:

    异常看起来像是来自 Android 的原因是它正在进程之间传递。

    在您的客户端代码的第 53 行 MainActivity.kt 上,您将 null 传递给 bindDevice 以获得 deviceCertificate byte[]。例外是告诉您这不能为空。

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

    欲了解更多信息,请参阅the Kotlin docs on Null-Safety.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2019-07-25
      • 2019-01-19
      • 1970-01-01
      • 2018-04-16
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多