Язык определения интерфейсов Android (AIDL) — это инструмент, позволяющий пользователям абстрагироваться от межпроцессного взаимодействия. При наличии интерфейса (указанного в файле .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 использует драйвер ядра Binder для выполнения вызовов. При выполнении вызова идентификатор метода и все объекты упаковываются в буфер и копируются в удалённый процесс, где поток Binder ожидает чтения данных. Получив данные для транзакции, поток ищет собственный объект-заглушку в локальном процессе, и этот класс распаковывает данные и выполняет вызов локального объекта интерфейса. Этот локальный объект интерфейса создаётся и регистрируется серверным процессом. При выполнении вызовов в том же процессе и с тем же бэкендом прокси-объекты отсутствуют, поэтому вызовы выполняются напрямую, без упаковки или распаковки. Подробнее см. в обзоре Binder .
Взаимодействие со службами на устройстве
В Android есть несколько команд для взаимодействия со службами на устройстве. Попробуйте:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing