2013-12-03 2 views
2

Я создаю новую службу помощи, которая будет использоваться сторонней стороной и столкнется с одной проблемой при обновлении файла AIDL на стороне сервера. предположим. сервер AIDL файл rivison 1: один API есть 1. Add (Int А, внутр б)Ошибка при обновлении AIDL до следующей версии

Клиент AIDL файл Rivision 1: один апи есть 1. Add (Int А, внутр б)

сейчас я обновил сервер AIDL Сервер AIDL файл rivision 2: есть два API-интерфейса 1. Вычесть (int a, int b); 2. Добавить (int a, int b);

Когда я запускаю свой второй сервер rivision с клиентом первой ревизии вместо вызова add, он вызывает метод вычитания .. есть ли какое-либо решение этой проблемы? это ограничение от android, что и порядок функций AIDL для сервера и клиента должен быть таким же.

ответ

1

Да, интерфейсы AIDL на сервере и на сторонах Клинта должны быть синхронизированы. AIDL-файл - это просто интерфейс, реализация которого на стороне клиента и сервера создается во время компиляции вашего кода клиента и сервера. Этот интерфейс определяет, как маршировать вызовы с клиента на сервер, таким образом, если ваши интерфейсы не синхронизируются на клиенте и на сервере, вы получите проблемы с сортировкой вызовов (это проблема, которую вы видите в своем случае).

Лучше создать библиотеку, содержащую интерфейс AIDL, в качестве отдельного проекта и прикрепить его к проектам клиента и сервера. Таким образом, у вас будет один и тот же интерфейс AIDL для обоих проектов.

0

В моем тестировании я обнаружил, что вы добавляете методы в конце AIDL, тогда старые методы продолжают работать без обновления AIDL. (Я бы не рекомендовал вам это делать, если нет другого варианта)

Если вы вставляете новый метод между ними, он заканчивает вызов неправильного метода.

0

Да, вы должны держать функции в том же порядке декларации.

AIDL будет генерировать надлежащий файл java для связи связующего. Это зависит от разных идентификаторов сообщений, чтобы отличить, какую функцию вызывать.

Идентификатор базового сообщения равен нулю, идентификатор сообщения 1-й объявленной функции будет (0 + 1), идентификатором сообщения 2-й объявленной функции будет (0 + 2).

Таким образом, если вы попытаетесь сохранить совместимость между различными версиями файла AIDL. Пожалуйста, сохраняйте порядок функций одинаковым и просто добавьте функцию в хвост.