Android Interface Definition Language (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