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