Начиная с 27 марта 2025 г. мы рекомендуем использовать android-latest-release
вместо aosp-main
для создания и участия в AOSP. Дополнительные сведения см. в разделе Изменения в AOSP .
Обзор AIDL
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Язык определения интерфейсов 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
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-07-30 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2025-07-30 UTC."],[],[],null,["# AIDL overview\n\nThe Android Interface Definition Language (AIDL) is a tool that lets users\nabstract away IPC. Given an interface (specified in a `.aidl`\nfile), various build systems use the `aidl` binary to construct C++ or Java\nbindings so that this interface can be used across processes, regardless of the\nruntime or bitness there.\n\nAIDL can be used between any process in Android: between platform components\nor between apps. However, it is never used as an API for apps. AIDL may be used\nto implement an SDK API in the platform, for example, but the SDK API surface\nnever contains AIDL APIs directly. For documentation about how to use AIDL\nbetween apps directly, see corresponding\n[Android developers\ndocumentation](https://developer.android.com/guide/components/aidl).\nWhen AIDL is used between platform components that are updated separately, such\nas APEXes (starting in Android 10) or HALs (starting in\nAndroid 11), the versioning system known as\n[Stable AIDL](/docs/core/architecture/aidl/stable-aidl) must be used.\n\nExample\n-------\n\nHere is an example AIDL interface: \n\n package my.package;\n\n import my.package.Baz; // defined elsewhere\n\n interface IFoo {\n void doFoo(Baz baz);\n }\n\nA *server* process registers an interface and serves calls to it, and a *client*\nprocess makes calls to those interfaces. In many cases, a process acts as both a\nclient and a server since it may be referencing multiple interfaces. For more\ndetails about the AIDL language, see\n[AIDL language](/docs/core/architecture/aidl/aidl-language). For more details\nabout the various runtimes available to use these interfaces, see\n[AIDL backends](/docs/core/architecture/aidl/aidl-backends). These type\ndeclarations are exactly like a class declaration in a given language, but they\nwork across processes.\n\nHow it works\n------------\n\nAIDL uses the binder kernel driver to make calls. When you make a call, a\nmethod identifier and all of the objects are packed onto a buffer and copied to\na remote process where a binder thread waits to read the data. Once a binder\nthread receives data for a transaction, the thread looks up a native stub object\nin the local process, and this class unpacks the data and makes a call on a\nlocal interface object. This local interface object is the one a server process\ncreates and registers. When calls are made in the same process and the same\nbackend, no proxy objects exist, and so calls are direct without any\npacking or unpacking. For further information, see the\n[Binder overview](/docs/core/architecture/ipc/binder-overview).\n\nInteract with services on the device\n------------------------------------\n\nAndroid comes with a few commands to allow interacting with services on the\ndevice. Try: \n\n adb shell dumpsys --help # listing and dumping services\n adb shell service --help # sending commands to services for testing"]]