زبان تعریف رابط اندروید (AIDL) ابزاری است که به کاربران اجازه میدهد IPC را به صورت انتزاعی (abstract) حذف کنند. با توجه به یک رابط (که در یک فایل .aidl مشخص شده است)، سیستمهای ساخت مختلف از فایل باینری aidl برای ساخت اتصالات C++ یا جاوا استفاده میکنند تا این رابط بتواند در سراسر فرآیندها، صرف نظر از زمان اجرا یا بیتبندی آن، مورد استفاده قرار گیرد.
AIDL میتواند بین هر فرآیندی در اندروید استفاده شود: بین اجزای پلتفرم یا بین برنامهها. با این حال، هرگز به عنوان یک API برای برنامهها استفاده نمیشود. به عنوان مثال، AIDL ممکن است برای پیادهسازی یک API SDK در پلتفرم استفاده شود، اما سطح API SDK هرگز شامل APIهای AIDL به طور مستقیم نیست. برای مستندسازی در مورد نحوه استفاده مستقیم از AIDL بین برنامهها، به مستندات مربوط به توسعهدهندگان اندروید مراجعه کنید. هنگامی که AIDL بین اجزای پلتفرمی که به طور جداگانه بهروزرسانی میشوند، مانند APEXها (از اندروید 10 شروع میشوند) یا HALها (از اندروید 11 شروع میشوند)، استفاده میشود، باید از سیستم نسخهبندی معروف به Stable AIDL استفاده شود.
مثال
در اینجا یک مثال از رابط AIDL آورده شده است:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
یک فرآیند سرور ، یک رابط را ثبت میکند و فراخوانیهایی را به آن انجام میدهد و یک فرآیند کلاینت، فراخوانیهایی را به آن رابطها انجام میدهد. در بسیاری از موارد، یک فرآیند هم به عنوان کلاینت و هم به عنوان سرور عمل میکند، زیرا ممکن است به چندین رابط ارجاع دهد. برای جزئیات بیشتر در مورد زبان AIDL، به زبان AIDL مراجعه کنید. برای جزئیات بیشتر در مورد زمانهای اجرای مختلف موجود برای استفاده از این رابطها، به backendهای AIDL مراجعه کنید. این اعلانهای نوع دقیقاً مانند اعلان کلاس در یک زبان معین هستند، اما در بین فرآیندها کار میکنند.
چگونه کار میکند؟
AIDL از درایور هسته binder برای برقراری تماسها استفاده میکند. وقتی فراخوانی انجام میدهید، یک شناسه متد و تمام اشیاء روی یک بافر بستهبندی شده و در یک فرآیند از راه دور کپی میشوند که در آن یک نخ binder منتظر خواندن دادهها میماند. هنگامی که یک نخ binder دادهها را برای یک تراکنش دریافت میکند، نخ به دنبال یک شیء stub بومی در فرآیند محلی میگردد و این کلاس دادهها را از حالت فشرده خارج کرده و یک فراخوانی روی یک شیء رابط محلی انجام میدهد. این شیء رابط محلی، شیءای است که یک فرآیند سرور ایجاد و ثبت میکند. هنگامی که فراخوانیها در همان فرآیند و همان backend انجام میشوند، هیچ شیء پروکسی وجود ندارد و بنابراین فراخوانیها مستقیم و بدون هیچ گونه بستهبندی یا باز کردن بستهبندی هستند. برای اطلاعات بیشتر، به نمای کلی Binder مراجعه کنید.
تعامل با سرویسهای موجود در دستگاه
اندروید چند دستور برای تعامل با سرویسهای روی دستگاه ارائه میدهد. موارد زیر را امتحان کنید:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing