نظرة عامة على AIDL

لغة تعريف واجهة Android (AIDL) هي أداة تتيح للمستخدمين تجريد IPC بعيدًا. نظرًا للواجهة (المحددة في ملف .aidl ) ، تستخدم أنظمة البناء المختلفة aidl binary لإنشاء روابط C ++ أو Java بحيث يمكن استخدام هذه الواجهة عبر العمليات ، بغض النظر عن وقت التشغيل أو الشاهد هناك.

يمكن استخدام AIDL بين أي عملية في Android: بين مكونات النظام الأساسي أو بين التطبيقات. ومع ذلك ، لا يتم استخدامه أبدًا كواجهة برمجة تطبيقات للتطبيقات. يمكن استخدام AIDL لتنفيذ SDK API في النظام الأساسي ، على سبيل المثال ، ولكن سطح واجهة برمجة تطبيقات SDK لا يحتوي أبدًا على واجهات برمجة تطبيقات AIDL مباشرة. للحصول على وثائق حول كيفية استخدام AIDL بين التطبيقات مباشرة ، راجع وثائق مطوري Android المقابلة. عند استخدام AIDL بين مكونات النظام الأساسي التي يتم تحديثها بشكل منفصل ، مثل APEXes (بدءًا من Android 10) أو HALs (بدءًا من 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
    }

يدعم Android 10 والإصدارات الأحدث الإعلانات القابلة للتجزئة. فمثلا:

    package my.package;

    import my.package.Boo;

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

Android 11 والإصدارات الأحدث من إعلانات تعداد الدعم. فمثلا:

    package my.package;

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

Android 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
    }

تسجل عملية الخادم الواجهة وتقدم مكالمات إليها ، وتقوم عملية العميل بإجراء مكالمات إلى تلك الواجهات. في كثير من الحالات ، تعمل العملية كعميل وخادم نظرًا لأنها قد تشير إلى واجهات متعددة. لمزيد من التفاصيل حول أوقات التشغيل المختلفة المتاحة لاستخدام هذه الواجهات ، راجع AIDL الخلفية . تعتبر إعلانات النوع هذه تمامًا مثل إعلان الفئة بلغة معينة ، لكنها تعمل عبر العمليات.

كيف تعمل

يستخدم AIDL برنامج تشغيل kernel Binder لإجراء المكالمات. عند إجراء مكالمة ، يتم حزم معرف الأسلوب وجميع الكائنات في مخزن مؤقت ونسخها إلى عملية بعيدة حيث ينتظر مؤشر ترابط رابط لقراءة البيانات. بمجرد أن يتلقى مؤشر ترابط Binder بيانات لمعاملة ما ، يبحث مؤشر الترابط عن كائن كعب روتين أصلي في العملية المحلية ، وتقوم هذه الفئة بفك حزم البيانات وإجراء مكالمة على كائن واجهة محلية. كائن الواجهة المحلية هذا هو الكائن الذي تقوم عملية الخادم بإنشائه وتسجيله. عندما يتم إجراء المكالمات في نفس العملية ونفس الخلفية ، لا توجد كائنات وكيل ، وبالتالي تكون المكالمات مباشرة دون أي تعبئة أو تفريغ.

التفاعل مع الخدمات الموجودة على الجهاز

يأتي Android مع بعض الأوامر للسماح بالتفاعل مع الخدمات الموجودة على الجهاز. يحاول:

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