Kể từ ngày 27 tháng 3 năm 2025, bạn nên sử dụng android-latest-release
thay vì aosp-main
để xây dựng và đóng góp cho AOSP. Để biết thêm thông tin, hãy xem phần Thay đổi đối với AOSP.
Tổng quan về AIDL
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Ngôn ngữ định nghĩa giao diện Android (AIDL) là một công cụ cho phép người dùng trừu tượng hoá IPC. Với một giao diện (được chỉ định trong tệp .aidl
), nhiều hệ thống xây dựng sử dụng tệp nhị phân aidl
để tạo các liên kết C++ hoặc Java để giao diện này có thể được dùng trên các quy trình, bất kể thời gian chạy hoặc độ rộng bit ở đó.
Bạn có thể dùng AIDL giữa mọi quy trình trong Android: giữa các thành phần nền tảng hoặc giữa các ứng dụng. Tuy nhiên, nó không bao giờ được dùng làm API cho các ứng dụng. Bạn có thể dùng AIDL để triển khai một API SDK trong nền tảng, chẳng hạn như vậy, nhưng giao diện API SDK không bao giờ chứa trực tiếp các API AIDL. Để biết tài liệu về cách sử dụng AIDL trực tiếp giữa các ứng dụng, hãy xem tài liệu dành cho nhà phát triển Android tương ứng.
Khi AIDL được dùng giữa các thành phần nền tảng được cập nhật riêng biệt, chẳng hạn như APEX (kể từ Android 10) hoặc HAL (kể từ Android 11), bạn phải dùng hệ thống kiểm soát phiên bản có tên là AIDL ổn định.
Ví dụ
Sau đây là ví dụ về giao diện AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
Một quy trình máy chủ đăng ký một giao diện và xử lý các lệnh gọi đến giao diện đó, còn một quy trình máy khách thực hiện các lệnh gọi đến những giao diện đó. Trong nhiều trường hợp, một quy trình đóng vai trò vừa là máy khách vừa là máy chủ vì quy trình đó có thể tham chiếu nhiều giao diện. Để biết thêm thông tin về ngôn ngữ AIDL, hãy xem phần Ngôn ngữ AIDL. Để biết thêm thông tin về nhiều thời gian chạy có thể dùng các giao diện này, hãy xem phần Các chương trình phụ trợ AIDL. Các khai báo kiểu này giống hệt như khai báo lớp trong một ngôn ngữ nhất định, nhưng chúng hoạt động trên nhiều quy trình.
Cách hoạt động
AIDL sử dụng trình điều khiển nhân liên kết để thực hiện các lệnh gọi. Khi bạn thực hiện một lệnh gọi, một giá trị nhận dạng phương thức và tất cả các đối tượng sẽ được đóng gói vào một vùng đệm và sao chép vào một quy trình từ xa, nơi một luồng liên kết chờ đọc dữ liệu. Sau khi một luồng liên kết nhận được dữ liệu cho một giao dịch, luồng đó sẽ tra cứu một đối tượng gốc trong quy trình cục bộ và lớp này sẽ giải nén dữ liệu và thực hiện một lệnh gọi trên một đối tượng giao diện cục bộ. Đối tượng giao diện cục bộ này là đối tượng mà một quy trình máy chủ tạo và đăng ký. Khi các lệnh gọi được thực hiện trong cùng một quy trình và cùng một chương trình phụ trợ, sẽ không có đối tượng proxy nào tồn tại, do đó, các lệnh gọi sẽ trực tiếp mà không cần đóng gói hoặc giải nén. Để biết thêm thông tin, hãy xem bài viết Tổng quan về Binder.
Tương tác với các dịch vụ trên thiết bị
Android có một số lệnh cho phép tương tác với các dịch vụ trên thiết bị. Hãy thử:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-30 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 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"]]