AIDL ভাষাটি জাভা ভাষার ওপর ভিত্তি করে তৈরি। ফাইলগুলোতে একটি ইন্টারফেস চুক্তি এবং এই চুক্তিতে ব্যবহৃত বিভিন্ন ডেটা টাইপ ও ধ্রুবক নির্দিষ্ট করা থাকে।
প্যাকেজ
প্রতিটি AIDL ফাইল একটি ঐচ্ছিক প্যাকেজ দিয়ে শুরু হয়, যা বিভিন্ন ব্যাকএন্ডের প্যাকেজ নামগুলোর সাথে সঙ্গতিপূর্ণ। একটি প্যাকেজ ঘোষণা দেখতে এইরকম:
package my.package;
জাভার মতোই, AIDL ফাইলগুলোকে অবশ্যই তাদের প্যাকেজের সাথে সামঞ্জস্যপূর্ণ একটি ফোল্ডার কাঠামোতে রাখতে হবে। my.package প্যাকেজযুক্ত ফাইলগুলো অবশ্যই my/package/ ফোল্ডারে থাকতে হবে।
প্রকারভেদ
AIDL ফাইলগুলিতে এমন অনেক জায়গা আছে যেখানে টাইপ নির্দিষ্ট করা যায়। AIDL ভাষায় সমর্থিত টাইপগুলির একটি সঠিক তালিকার জন্য, AIDL ব্যাকএন্ড টাইপস দেখুন।
টীকা
AIDL ভাষার বেশ কিছু অংশ অ্যানোটেশন সমর্থন করে। অ্যানোটেশনগুলোর তালিকা এবং সেগুলো কোথায় প্রয়োগ করা যায়, তা জানতে AIDL অ্যানোটেশনস দেখুন।
আমদানি
অন্যান্য ইন্টারফেসে সংজ্ঞায়িত টাইপ ব্যবহার করতে হলে, আপনাকে প্রথমে বিল্ড সিস্টেমে ডিপেন্ডেন্সি যোগ করতে হবে। cc_* এবং java_* Soong মডিউলগুলিতে, যেখানে অ্যান্ড্রয়েড প্ল্যাটফর্ম বিল্ডে srcs অধীনে সরাসরি .aidl ফাইল ব্যবহৃত হয়, সেখানে আপনি 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 ব্যাকএন্ড থ্রেড ম্যানেজমেন্ট দেখুন।
বাইন্ডার ইন্টারফেসের মাধ্যমে অনেক ইন্টারফেস এবং বাইন্ডার অবজেক্ট শেয়ার করা যায়। AIDL ইন্টারফেসগুলো প্রায়শই মেথড কলের অংশ হিসেবে কলব্যাক ব্যবহার করে, যেমন পূর্ববর্তী উদাহরণে ITeleportCallback ক্ষেত্রে দেখা যায়। আপনি একই মেথড বা ভিন্ন ভিন্ন মেথডে কল করার সময় কলব্যাক অবজেক্টগুলো পুনরায় ব্যবহার করতে পারেন। ইন্টারফেস টাইপের আরেকটি সাধারণ ব্যবহার হলো মেথড থেকে সাব-ইন্টারফেস বা সেশন অবজেক্ট রিটার্ন করা, যেমন পূর্ববর্তী উদাহরণে ITeleportSession এর ক্ষেত্রে দেখা যায়। এই নেস্টিং বিভিন্ন API-কে API-স্তরে অথবা রানটাইম স্টেটের উপর ভিত্তি করে এনক্যাপসুলেট করার সুযোগ দেয়। উদাহরণস্বরূপ, একটি সেশন কোনো নির্দিষ্ট রিসোর্সের মালিকানা বোঝাতে পারে। যখন ইন্টারফেসগুলো একাধিকবার পাস করা হয় বা যে ক্লায়েন্ট বা সার্ভার থেকে এসেছে সেখানে ফেরত পাঠানো হয়, তখন সেগুলো সর্বদা অন্তর্নিহিত বাইন্ডার অবজেক্টের পয়েন্টার ইকুয়ালিটি বজায় রাখে।
মেথডের শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে। মেথডের আর্গুমেন্টগুলো in , out , বা inout হতে পারে। এটি কীভাবে আর্গুমেন্টের প্রকারকে প্রভাবিত করে, সে সম্পর্কে আলোচনার জন্য AIDL ব্যাকএন্ডের দিকনির্দেশনা (AIDL backends directionality) দেখুন।
পার্সেলযোগ্য
কিভাবে ব্যাকএন্ড-নির্দিষ্ট পার্সেলএবল তৈরি করতে হয় তার বিবরণের জন্য, AIDL ব্যাকএন্ড কাস্টম পার্সেলএবল দেখুন ।
অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলো সরাসরি AIDL-এ পার্সেলযোগ্য সংজ্ঞা সমর্থন করে। এই ধরনের পার্সেলযোগ্যকে স্ট্রাকচার্ড পার্সেলযোগ্য বলা হয়। AIDL কম্পাইলার এবং আমাদের বিল্ড সিস্টেমে স্ট্রাকচার্ড ও স্টেবল AIDL কীভাবে সম্পর্কিত, সে সম্পর্কে আরও তথ্যের জন্য, স্ট্রাকচার্ড বনাম স্টেবল AIDL দেখুন।
উদাহরণস্বরূপ:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
ইউনিয়ন
অ্যান্ড্রয়েড ১২ এবং এর পরবর্তী সংস্করণগুলো ট্যাগযুক্ত ইউনিয়ন ডিক্লারেশন সমর্থন করে। উদাহরণস্বরূপ:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
ব্যাকএন্ড-নির্দিষ্ট বিশদ বিবরণের জন্য AIDL ব্যাকএন্ড ইউনিয়নগুলি দেখুন।
এনাম
অ্যান্ড্রয়েড ১১ এবং এর পরবর্তী সংস্করণগুলো enum ডিক্লারেশন সমর্থন করে। উদাহরণস্বরূপ:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
নেস্টেড টাইপ ঘোষণা
অ্যান্ড্রয়েড ১৩ এবং এর পরবর্তী সংস্করণগুলো নেস্টেড টাইপ ডিক্লারেশন সমর্থন করে। উদাহরণস্বরূপ:
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 , সেগুলোকে double মান হিসেবে গণ্য করা হয়। Float মানের শেষে f সাফিক্স থাকে, যেমন 2.4f । l বা L সাফিক্সযুক্ত একটি ইন্টিগ্রাল মান একটি 64-বিটের long মান নির্দেশ করে। অন্যথায়, ইন্টিগ্রাল মানগুলো 8-বিট (byte), 32-বিট (int), এবং 64-বিট (long)-এর মধ্যে ক্ষুদ্রতম মান-সংরক্ষণকারী signed টাইপটি গ্রহণ করে। তাই 256 একটি int হিসেবে গণ্য করা হয়, কিন্তু 255 + 1 ওভারফ্লো হয়ে byte 0 হয়ে যায়। Hex মান, যেমন 0x3 , প্রথমে 32-বিট এবং 64-বিটের মধ্যে ক্ষুদ্রতম মান-সংরক্ষণকারী unsigned টাইপ হিসেবে ব্যাখ্যা করা হয় এবং তারপরে আবার unsigned মান হিসেবে ব্যাখ্যা করা হয়। সুতরাং, 0xffffffff এর int মান হলো -1 । অ্যান্ড্রয়েড ১৩ থেকে, byte ভ্যালু বোঝানোর জন্য কনস্ট্যান্টের সাথে u8 সাফিক্স যোগ করা যায়, যেমন 3u8 । এই সাফিক্সটি গুরুত্বপূর্ণ, কারণ এর ফলে 0xffu8 * 3 এর মতো একটি ক্যালকুলেশনকে -3 ও byte টাইপ হিসেবে ব্যাখ্যা করা হয়, যেখানে 0xff * 3 হলো 765 ও int টাইপ।
সমর্থিত অপারেটরগুলোর C++ এবং Java সেম্যান্টিকস রয়েছে। সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকারের ক্রমানুসারে, বাইনারি অপারেটরগুলো হলো || && | ^ & == != < > <= >= << >> + - * / % । ইউনারি অপারেটরগুলো হলো + - ! ~ ।