এআইডিএল ওভারভিউ

অ্যান্ড্রয়েড ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (এআইডিএল) এমন একটি টুল যা ব্যবহারকারীদের আইপিসিকে বিমূর্ত করতে দেয়। একটি ইন্টারফেস দেওয়া হয়েছে (একটি .aidl ফাইলে নির্দিষ্ট করা হয়েছে), বিভিন্ন বিল্ড সিস্টেম aidl বাইনারি ব্যবহার করে C++ বা জাভা বাইন্ডিং তৈরি করে যাতে এই ইন্টারফেসটি প্রক্রিয়া জুড়ে ব্যবহার করা যায়, সেখানে রানটাইম বা বিটনেস নির্বিশেষে।

এআইডিএল অ্যান্ড্রয়েডের যেকোনো প্রক্রিয়ার মধ্যে ব্যবহার করা যেতে পারে: প্ল্যাটফর্ম উপাদানগুলির মধ্যে বা অ্যাপগুলির মধ্যে। যাইহোক, এটি কখনই অ্যাপের জন্য API হিসাবে ব্যবহার করা হয় না। উদাহরণস্বরূপ, প্ল্যাটফর্মে একটি SDK API প্রয়োগ করতে AIDL ব্যবহার করা যেতে পারে, কিন্তু SDK API পৃষ্ঠে কখনও সরাসরি AIDL API গুলি থাকে না। সরাসরি অ্যাপগুলির মধ্যে AIDL কীভাবে ব্যবহার করবেন সে সম্পর্কে ডকুমেন্টেশনের জন্য, সংশ্লিষ্ট Android বিকাশকারীদের ডকুমেন্টেশন দেখুন। যখন AIDL আলাদাভাবে আপডেট করা প্ল্যাটফর্মের উপাদানগুলির মধ্যে ব্যবহার করা হয়, যেমন APEXes (Android 10 এ শুরু হয়) বা HALs (Android 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
    }

অ্যান্ড্রয়েড 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,
    }

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 ব্যাকএন্ড দেখুন। এই ধরনের ঘোষণা একটি প্রদত্ত ভাষায় একটি ক্লাস ঘোষণার মত, কিন্তু তারা প্রক্রিয়া জুড়ে কাজ করে।

কিভাবে এটা কাজ করে

এআইডিএল কল করার জন্য বাইন্ডার কার্নেল ড্রাইভার ব্যবহার করে। যখন আপনি একটি কল করেন, একটি পদ্ধতি শনাক্তকারী এবং সমস্ত বস্তু একটি বাফারে প্যাক করা হয় এবং একটি দূরবর্তী প্রক্রিয়াতে অনুলিপি করা হয় যেখানে একটি বাইন্ডার থ্রেড ডেটা পড়ার জন্য অপেক্ষা করে। একবার একটি বাইন্ডার থ্রেড একটি লেনদেনের জন্য ডেটা গ্রহণ করলে, থ্রেডটি স্থানীয় প্রক্রিয়ায় একটি নেটিভ স্টাব অবজেক্টের সন্ধান করে এবং এই ক্লাসটি ডেটা আনপ্যাক করে এবং একটি স্থানীয় ইন্টারফেস অবজেক্টে কল করে। এই স্থানীয় ইন্টারফেস বস্তুটি একটি সার্ভার প্রক্রিয়া তৈরি করে এবং নিবন্ধন করে। যখন একই প্রক্রিয়ায় এবং একই ব্যাকএন্ডে কল করা হয়, তখন কোনো প্রক্সি অবজেক্টের অস্তিত্ব থাকে না এবং তাই কলগুলি কোনো প্যাকিং বা আনপ্যাকিং ছাড়াই সরাসরি হয়।

ডিভাইসে পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করা

ডিভাইসে পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেওয়ার জন্য অ্যান্ড্রয়েড কয়েকটি কমান্ডের সাথে আসে। চেষ্টা করুন:

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