SecurityException не пересылается с сервиса на его менеджера - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть сервис, который имеет внешние API. В некоторых случаях я должен бросить SecurityException. Странная вещь заключается в следующем: в некоторых API, когда я генерирую исключение, связыватель успешно выполняет эту транзакцию, и исключение перехватывается менеджером службы. Однако в других API исключение не достигает менеджера, потому что Binder его проглатывает. Сообщение журнала Binder выглядит следующим образом: "06-Nov 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. Как я могу сделать так, чтобы мое исключение не было ОДНОМ, если это возможно? Пожалуйста помоги. Заранее спасибо. С уважением, Света

1 Ответ

0 голосов
/ 07 ноября 2019

Я нашел ответ на свой вопрос. Проблема возникла из-за того, что «проблемные» API определены в AIDL как односторонние. Так что они асинхронные. Вот почему было ошибкой посылать исключение из этих API, потому что в односторонних API связь с процессом приложения (в контексте которого запускается менеджер) теряется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...