我有一个具有外部 API 的服务。 在某些情况下我必须抛出 SecurityException。 奇怪的事情如下: 在某些 API 中,当我抛出异常时,绑定(bind)器成功完成此事务 并且该异常被服务的经理捕获。 然而,在其他 API 中,异常不会到达管理器,因为 Binder 吞噬了 它。 Binder日志消息如下: “11 月 6 日 06:04:05.766 3632 W Binder Binder 调用失败。” 从 Binder 代码可以看出,异常被吞掉了,因为事务是单向的:
if ((flags & FLAG_ONEWAY) != 0) {
737 if (e instanceof RemoteException) {
738 Log.w(TAG, "Binder call failed.", e);
739 } else {
740 Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e);
741 }
742 } else {
743 // Clear the parcel before writing the exception
744 reply.setDataSize(0);
745 reply.setDataPosition(0);
746 reply.writeException(e);
747 }
我需要转发异常。我不明白为什么在某些情况下会转发异常,而在其他情况下则不会。我没有看到这两种类型的 API 之间有任何差异。如果可能的话,我怎样才能使我的异常不是单一的? 请帮忙。 提前致谢。 问候,斯维塔
最佳答案
我找到了问题的答案。出现该问题的原因是“有问题的”API 在 AIDL 中被定义为单向。所以它们是异步的。这就是为什么从这些 API 中发送异常是错误的,因为在单向 API 中,到应用程序进程(在管理器运行的上下文中)的链接丢失了。
关于java - SecurityException 不会从服务转发到其管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58730029/