AIDL ভাষা

AIDL ভাষা মোটামুটিভাবে জাভা ভাষার উপর ভিত্তি করে তৈরি। ফাইলগুলি একটি ইন্টারফেস কন্ট্র্যাক্ট এবং এই কন্ট্র্যাক্টে ব্যবহৃত বিভিন্ন ডেটা টাইপ ও কনস্ট্যান্ট নির্দিষ্ট করে।

প্যাকেজ

প্রতিটি AIDL ফাইল একটি ঐচ্ছিক প্যাকেজ দিয়ে শুরু হয় যা বিভিন্ন ব্যাকএন্ডে প্যাকেজের নামের সাথে সম্পর্কিত। প্যাকেজ ডিক্লারেশন দেখতে এইরকম হয়:

    package my.package;

Java-এর মতো, AIDL ফাইলগুলি অবশ্যই তাদের প্যাকেজের সাথে মেলে এমন একটি ফোল্ডার স্ট্রাকচারে থাকতে হবে। my.package প্যাকেজ সহ ফাইল my/package/ ফোল্ডারে থাকতে হবে।

ধরন

AIDL ফাইলে, এমন অনেক জায়গা আছে যেখানে ধরন নির্দিষ্ট করা যেতে পারে। AIDL ভাষায় কাজ করে এমন ধরনের সঠিক তালিকা পেতে, AIDL ব্যাকএন্ডের ধরন দেখুন।

টিকা

AIDL ভাষার বিভিন্ন অংশে অ্যানোটেশন কাজ করে। অ্যানোটেশনের তালিকা এবং সেগুলি কোথায় প্রয়োগ করা যেতে পারে তা জানতে, AIDL অ্যানোটেশন দেখুন।

ইমপোর্ট

অন্য ইন্টারফেসে সংজ্ঞায়িত ধরন ব্যবহার করতে, আপনাকে প্রথমে বিল্ড সিস্টেমে নির্ভরতা যোগ করতে হবে। cc_* ও java_* Soong মডিউলে, যেখানে .aidl ফাইলগুলি Android প্ল্যাটফর্ম বিল্ডে srcs-এর অধীনে সরাসরি ব্যবহার করা হয়, সেখানে আপনি aidl: { include_dirs: ... } ফিল্ড ব্যবহার করে ডিরেক্টরি যোগ করতে পারবেন। aidl_interfaceব্যবহার করে ইমপোর্ট করার জন্য, এখানে দেখুন।

ইমপোর্ট করা ফাইলটি দেখতে এইরকম হয়:

    import some.package.Foo;  // explicit import

একই প্যাকেজে কোনও টাইপ ইমপোর্ট করার সময়, প্যাকেজটি বাদ দেওয়া যেতে পারে। তবে, প্যাকেজ বাদ দিলে অস্পষ্ট ইমপোর্ট সংক্রান্ত সমস্যা হতে পারে, যখন কোনও প্যাকেজ ছাড়াই টাইপ নির্দিষ্ট করা হয় এবং গ্লোবাল নেমস্পেসে রাখা হয় (সাধারণত সব টাইপ নেমস্পেস করা উচিত):

    import Foo;  // same as my.package.Foo

প্রকারভেদ সম্পর্কে সংজ্ঞা দাও

AIDL ফাইল সাধারণত এমন ধরনকে সংজ্ঞায়িত করে যা ইন্টারফেস হিসেবে ব্যবহার করা হয়।

ইন্টারফেস

এখানে AIDL ইন্টারফেসের একটি উদাহরণ দেওয়া হল:

    interface ITeleport {
        // Location defined elsewhere
        void teleport(Location baz, float speed);
        String getName();

        // ITeleportCallback defined elsewhere
        void methodWithCallback(ITeleportCallback callback);

        // ITeleportSession defined elsewhere
        ITeleportSession getASubInterface();
    }

ইন্টারফেস হল এমন একটি অবজেক্ট যা একাধিক পদ্ধতির মাধ্যমে সংজ্ঞায়িত করা হয়। মেথড oneway (oneway void doFoo()) বা সিঙ্ক্রোনাস হতে পারে। কোনও ইন্টারফেসকে oneway (oneway interface ITeleport {...}) হিসেবে সংজ্ঞায়িত করা হলে, এটির সব পদ্ধতি অন্তর্নিহিতভাবে oneway হয়। ওয়ানওয়ে পদ্ধতি অ্যাসিঙ্ক্রোনাসভাবে ডিসপ্যাচ করা হয় এবং কোনও ফলাফল রিটার্ন করতে পারে না। একই থ্রেড থেকে একই বাইন্ডারে একমুখী পদ্ধতিগুলিও ক্রমিক ক্রমে এক্সিকিউট হয় (যদিও সম্ভাব্যভাবে আলাদা থ্রেডে)। থ্রেড কীভাবে সেট-আপ করতে হয় সেই বিষয়ে আলোচনা করতে, AIDL ব্যাকএন্ড থ্রেড ম্যানেজমেন্ট দেখুন।

Binder ইন্টারফেসের মাধ্যমে Binder অনেক ইন্টারফেস ও Binder অবজেক্ট শেয়ার করার অনুমতি দেয়। AIDL ইন্টারফেস প্রায়ই মেথড কলের অংশ হিসেবে কলব্যাক ব্যবহার করে, যেমন আগের উদাহরণে ITeleportCallback-এর ক্ষেত্রে করা হয়েছে। একই পদ্ধতি বা আলাদা আলাদা পদ্ধতি কল করার সময় আপনি কলব্যাক অবজেক্ট আবার ব্যবহার করতে পারবেন। ইন্টারফেস টাইপের আরেকটি সাধারণ ব্যবহার হল সাব-ইন্টারফেস বা সেশন অবজেক্টকে মেথড থেকে রিটার্ন করা, যেমন আগের উদাহরণে ITeleportSession-এর ক্ষেত্রে করা হয়েছে। এই নেস্টিং, API বা রানটাইম স্টেটের উপর ভিত্তি করে বিভিন্ন API-কে এনক্যাপসুলেট করার অনুমতি দেয়। যেমন, কোনও সেশন নির্দিষ্ট রিসোর্সের মালিকানা প্রতিনিধিত্ব করতে পারে। ইন্টারফেস একাধিকবার পাস করা হলে বা যে ক্লায়েন্ট বা সার্ভার থেকে এসেছে সেখানে ফেরত পাঠানো হলে, সেগুলি সবসময় অন্তর্নিহিত বাইন্ডার অবজেক্টের পয়েন্টার ইকুয়ালিটি সংরক্ষণ করে।

মেথডে কোনও আর্গুমেন্ট নাও থাকতে পারে অথবা একাধিক আর্গুমেন্ট থাকতে পারে। মেথডের আর্গুমেন্ট in, out বা inout হতে পারে। এটি কীভাবে আর্গুমেন্টের ধরনকে প্রভাবিত করে সেই বিষয়ে আলোচনা পেতে, AIDL ব্যাকএন্ডের দিকনির্দেশ দেখুন।

পার্সেল করা যায় এমন

ব্যাকএন্ড-নির্দিষ্ট পার্সেলযোগ্য আইটেম কীভাবে তৈরি করতে হয় তার বিবরণ পেতে, AIDL ব্যাকএন্ড কাস্টম পার্সেলযোগ্য আইটেম দেখুন।

Android 10 ও এর পরবর্তী যেকোনও ভার্সনে AIDL-এ সরাসরি পার্সেলযোগ্য সংজ্ঞা কাজ করে। এই ধরনের পার্সেলযোগ্যকে স্ট্রাকচার্ড পার্সেলযোগ্য বলা হয়। AIDL কম্পাইলার এবং আমাদের বিল্ড সিস্টেমে কীভাবে স্ট্রাকচার্ড ও স্টেবল AIDL সম্পর্কিত, সেই বিষয়ে আরও তথ্য পেতে, স্ট্রাকচার্ড বনাম স্টেবল AIDL দেখুন।

যেমন:

    package my.package;

    import my.package.Boo;

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

ইউনিয়ন

Android 12 ও তার পরবর্তী যেকোনও ভার্সনে ট্যাগ করা ইউনিয়ন ঘোষণা কাজ করে। যেমন:

    package my.package;

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

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

ব্যাকএন্ড-নির্দিষ্ট বিবরণের জন্য AIDL ব্যাকএন্ড ইউনিয়ন দেখুন।

Enums

Android 11 এবং তার পরবর্তী ভার্সন enum ডিক্লারেশন সাপোর্ট করে। যেমন:

    package my.package;

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

নেস্ট করা টাইপ ডিক্লারেশন

Android 13 ও এর পরের যেকোনও ভার্সনে নেস্টেড টাইপ ডিক্লারেশন কাজ করে। যেমন:

    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 ইন্টারফেস, পার্সেল করা যায় এমন আইটেম এবং ইউনিয়নেও ইন্টিজার ও স্ট্রিং কনস্ট্যান্ট থাকতে পারে, যেমন:

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

কনস্ট্যান্ট এক্সপ্রেশন

AIDL কনস্ট্যান্ট, অ্যারের সাইজ এবং এনুমেরেটরকে কনস্ট্যান্ট এক্সপ্রেশন ব্যবহার করে নির্দিষ্ট করা যেতে পারে। এক্সপ্রেশন নেস্ট অপারেশন করার জন্য বন্ধনী ব্যবহার করতে পারে। কনস্ট্যান্ট এক্সপ্রেশন ভ্যালু ইন্টিগ্রাল বা ফ্লোট ভ্যালুর সাথে ব্যবহার করা যেতে পারে।

true ও false লিটেরাল বুলিয়ান ভ্যালু বোঝায়। . সহ কিন্তু প্রত্যয় ছাড়া মান, যেমন 3.8, ডবল ভ্যালু হিসেবে বিবেচনা করা হয়। Float ভ্যালুতে f সাফিক্স থাকে, যেমন 2.4f। l বা L প্রত্যয় সহ একটি পূর্ণসংখ্যা মান ৬৪-বিট দীর্ঘ মান নির্দেশ করে। অন্যথায়, ইন্টিগ্রাল ভ্যালু ৮-বিট (বাইট), ৩২-বিট (int) এবং ৬৪-বিট (long)-এর মধ্যে সবচেয়ে ছোট ভ্যালু-প্রিজার্ভিং সাইনড টাইপ পায়। তাই 256-কে int হিসেবে বিবেচনা করা হয়, কিন্তু 255 + 1 ওভারফ্লো হয়ে byte 0 হয়ে যায়। 0x3-এর মতো হেক্স ভ্যালুকে প্রথমে ৩২-বিট ও ৬৪-বিটের মধ্যে সবচেয়ে ছোট ভ্যালু-প্রিজার্ভিং আনসাইনড টাইপ হিসেবে ব্যাখ্যা করা হয় এবং তারপরে আনসাইনড ভ্যালু হিসেবে পুনর্ব্যাখ্যা করা হয়। তাই, 0xffffffff-এর int ভ্যালু আছে -1। Android 13 থেকে শুরু করে, byte ভ্যালু বোঝাতে, u8 সাফিক্সটি 3u8-এর মতো কনস্ট্যান্টে যোগ করা যেতে পারে। এই সাফিক্সটি গুরুত্বপূর্ণ যাতে 0xffu8 * 3-এর মতো গণনাকে byte টাইপ সহ -3 হিসেবে ব্যাখ্যা করা হয়, যেখানে 0xff * 3 হল int টাইপ সহ 765।

কাজ করে এমন অপারেটরে C++ এবং Java সিম্যান্টিকস আছে। সবচেয়ে কম থেকে সবচেয়ে বেশি অগ্রাধিকারের ক্রমে, বাইনারি অপারেটরগুলি হল || && | ^ & == != < > <= >= << >> + - * / %। একক অপারেটর হল + - ! ~।