مروری بر AIDL

زبان تعریف رابط اندروید (AIDL) ابزاری است که به کاربران اجازه می‌دهد IPC را انتزاعی کنند. با توجه به یک رابط (مشخص شده در یک فایل .aidl )، سیستم‌های ساخت مختلف از باینری aidl برای ساخت پیوندهای C++ یا جاوا استفاده می‌کنند تا این رابط بدون در نظر گرفتن زمان اجرا یا بیتی در آن‌جا، در سراسر فرآیندها قابل استفاده باشد.

AIDL را می توان بین هر فرآیندی در اندروید استفاده کرد: بین اجزای پلتفرم یا بین برنامه ها. با این حال، هرگز به عنوان یک 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 مراجعه کنید. برای جزئیات بیشتر در مورد زمان‌های اجرا مختلف موجود برای استفاده از این رابط‌ها، به Backends AIDL مراجعه کنید. این نوع اعلان‌ها دقیقاً مانند یک اعلان کلاس در یک زبان خاص هستند، اما در سراسر فرآیندها کار می‌کنند.

چگونه کار می کند

AIDL از درایور هسته بایندر برای برقراری تماس استفاده می کند. هنگامی که تماس برقرار می کنید، یک شناسه متد و همه اشیاء در یک بافر بسته بندی می شوند و در یک فرآیند راه دور کپی می شوند، جایی که یک رشته بایندر برای خواندن داده ها منتظر می ماند. هنگامی که یک رشته بایندر داده‌ها را برای یک تراکنش دریافت می‌کند، رشته یک شیء خرد بومی را در فرآیند محلی جستجو می‌کند و این کلاس داده‌ها را باز می‌کند و با یک شی رابط محلی تماس برقرار می‌کند. این شیء رابط محلی همان چیزی است که یک فرآیند سرور ایجاد و ثبت می کند. هنگامی که تماس‌ها در همان فرآیند و باطن یکسان انجام می‌شوند، هیچ شیء پروکسی وجود ندارد، و بنابراین تماس‌ها مستقیم و بدون بسته‌بندی یا باز کردن بسته‌بندی می‌شوند.

با خدمات موجود در دستگاه تعامل داشته باشید

اندروید با چند دستور ارائه می شود که امکان تعامل با سرویس های دستگاه را فراهم می کند. امتحان کنید:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing