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

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

يمكن استخدام AIDL بين أي عملية في Android: بين مكونات النظام الأساسي أو بين التطبيقات. ومع ذلك ، لا يتم استخدامه أبدًا كواجهة برمجة تطبيقات للتطبيقات. يمكن استخدام AIDL لتنفيذ SDK API في النظام الأساسي ، على سبيل المثال ، ولكن سطح SDK API لا يحتوي أبدًا على واجهات برمجة تطبيقات AIDL مباشرة. للحصول على الوثائق حول كيفية استخدام AIDL بين التطبيقات مباشرة، انظر المقابلة الروبوت وثائق المطورين . عند استخدام AIDL بين مكونات النظام الأساسي التي يتم تحديثها بشكل منفصل، مثل والحصان (ابتداء من الروبوت 10) أو طبقة تجريد (ابتداء من الروبوت 11)، وإصدار النظام المعروف باسم 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 my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

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

كيف تعمل

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

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

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

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