نمای کلی 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); // synchronous method
        oneway void doFoo(int a); // async method
    }

اندروید 10 و بالاتر از اعلان‌های قابل حمل پشتیبانی می‌کند. مثلا:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 و بالاتر از اعلامیه های enum پشتیبانی می کند. مثلا:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

اعلامیه های اتحادیه پشتیبانی اندروید 12 و بالاتر. مثلا:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (AOSP تجربی) و اعلان‌های نوع تودرتو پشتیبانی بالاتر. مثلا:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined in my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // nested type definition
    }

یک فرآیند سرور یک رابط را ثبت می کند و تماس هایی را به آن ارائه می دهد، و یک فرآیند مشتری با آن واسط ها تماس می گیرد. در بسیاری از موارد، یک فرآیند هم به عنوان یک کلاینت و هم به عنوان یک سرور عمل می کند زیرا ممکن است به چندین رابط ارجاع دهد. برای جزئیات بیشتر در مورد زمان‌های اجرا مختلف موجود برای استفاده از این رابط‌ها، به Backends AIDL مراجعه کنید. این نوع اعلان‌ها دقیقاً مانند یک اعلان کلاس در یک زبان خاص هستند، اما در سراسر فرآیندها کار می‌کنند.

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

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

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

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

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