Язык определения интерфейса Android (AIDL) — это инструмент, который позволяет пользователям абстрагироваться от IPC. Учитывая интерфейс (указанный в файле .aidl
), различные системы сборки используют двоичный файл aidl
для создания привязок C++ или Java, чтобы этот интерфейс можно было использовать во всех процессах, независимо от времени выполнения или разрядности.
AIDL можно использовать между любыми процессами в Android: между компонентами платформы или между приложениями. Однако он никогда не используется в качестве API для приложений. Например, AIDL можно использовать для реализации API SDK на платформе, но поверхность API SDK никогда не содержит API AIDL напрямую. Документацию о том, как напрямую использовать AIDL между приложениями, см. в соответствующей документации для разработчиков Android . Когда AIDL используется между компонентами платформы, которые обновляются отдельно, такими как APEX (начиная с Android 10) или HAL (начиная с Android 11), необходимо использовать систему управления версиями, известную как Stable AIDL .
Пример
Вот пример интерфейса AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Серверный процесс регистрирует интерфейс и обслуживает к нему вызовы, а клиентский процесс выполняет вызовы к этим интерфейсам. Во многих случаях процесс действует как клиент и сервер, поскольку он может ссылаться на несколько интерфейсов. Дополнительные сведения о языке AIDL см. в разделе Язык AIDL . Дополнительные сведения о различных средах выполнения, доступных для использования этих интерфейсов, см. в разделе Серверные части AIDL . Эти объявления типов точно такие же, как объявления классов в данном языке, но они работают во всех процессах.
Как это работает
AIDL использует драйвер ядра связывателя для выполнения вызовов. Когда вы делаете вызов, идентификатор метода и все объекты упаковываются в буфер и копируются в удаленный процесс, где поток связывания ожидает чтения данных. Как только поток связывания получает данные для транзакции, он ищет собственный объект-заглушку в локальном процессе, а этот класс распаковывает данные и выполняет вызов объекта локального интерфейса. Этот объект локального интерфейса создается и регистрируется серверным процессом. Когда вызовы выполняются в одном и том же процессе и в одном и том же бэкэнде, прокси-объекты не существуют, поэтому вызовы являются прямыми, без какой-либо упаковки или распаковки.
Взаимодействие со службами на устройстве
Android поставляется с несколькими командами, позволяющими взаимодействовать со службами на устройстве. Пытаться:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing