AIDL ভাষাটি জাভা ভাষার উপর ভিত্তি করে তৈরি। ফাইলগুলি একটি ইন্টারফেস চুক্তি এবং এই চুক্তিতে ব্যবহৃত বিভিন্ন ডেটা প্রকার এবং ধ্রুবক নির্দিষ্ট করে।
প্যাকেজ
প্রতিটি AIDL ফাইল একটি ঐচ্ছিক প্যাকেজ দিয়ে শুরু হয় যা বিভিন্ন ব্যাকএন্ডের প্যাকেজ নামের সাথে সঙ্গতিপূর্ণ। একটি প্যাকেজ ঘোষণা এইরকম দেখায়:
package my.package;
জাভার মতো, AIDL ফাইলগুলি অবশ্যই তাদের প্যাকেজের সাথে মেলে এমন একটি ফোল্ডার কাঠামোতে থাকতে হবে। my.package প্যাকেজ সহ ফাইলগুলি অবশ্যই my/package/ ফোল্ডারে থাকতে হবে।
প্রকারভেদ
AIDL ফাইলগুলিতে, অনেক জায়গা আছে যেখানে প্রকারগুলি নির্দিষ্ট করা যেতে পারে। AIDL ভাষায় সমর্থিত প্রকারগুলির একটি সঠিক তালিকার জন্য, AIDL ব্যাকএন্ড প্রকারগুলি দেখুন।
টীকা
AIDL ভাষার বেশ কিছু অংশ টীকা সমর্থন করে। টীকাগুলির তালিকা এবং সেগুলি কোথায় প্রয়োগ করা যেতে পারে তার জন্য, AIDL টীকাগুলি দেখুন।
আমদানি
অন্যান্য ইন্টারফেসে সংজ্ঞায়িত প্রকারগুলি ব্যবহার করতে, আপনাকে প্রথমে বিল্ড সিস্টেমে নির্ভরতা যুক্ত করতে হবে। cc_* এবং java_* Soong মডিউলগুলিতে, যেখানে .aidl ফাইলগুলি অ্যান্ড্রয়েড প্ল্যাটফর্ম বিল্ডগুলিতে সরাসরি 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 ব্যাকএন্ড থ্রেড ম্যানেজমেন্ট দেখুন।
বাইন্ডার অনেক ইন্টারফেস এবং বাইন্ডার অবজেক্টকে বাইন্ডার ইন্টারফেসের মাধ্যমে শেয়ার করার অনুমতি দেয়। AIDL ইন্টারফেসগুলি প্রায়শই পদ্ধতি কলের অংশ হিসাবে কলব্যাক ব্যবহার করে, যেমন পূর্ববর্তী উদাহরণে ITeleportCallback এর সাথে। আপনি একই পদ্ধতিতে কল বা বিভিন্ন পদ্ধতিতে কলের মধ্যে কলব্যাক অবজেক্টগুলি পুনরায় ব্যবহার করতে পারেন। ইন্টারফেস ধরণের আরেকটি সাধারণ ব্যবহার হল সাব-ইন্টারফেস বা সেশন অবজেক্টগুলিকে পূর্ববর্তী উদাহরণে ITeleportSession এর মতো পদ্ধতি থেকে ফেরত পাঠানো। এই নেস্টিং বিভিন্ন API গুলিকে API-তে বা রানটাইম অবস্থার উপর ভিত্তি করে এনক্যাপসুলেট করার অনুমতি দেয়। উদাহরণস্বরূপ, একটি সেশন একটি নির্দিষ্ট রিসোর্সের মালিকানা উপস্থাপন করতে পারে। যখন ইন্টারফেসগুলি একাধিকবার পাস করা হয় বা তারা যে ক্লায়েন্ট বা সার্ভার থেকে এসেছে সেখানে ফেরত পাঠানো হয়, তখন তারা সর্বদা অন্তর্নিহিত বাইন্ডার অবজেক্টের পয়েন্টার সমতা সংরক্ষণ করে।
পদ্ধতিতে শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে। পদ্ধতির আর্গুমেন্টগুলি in , out , অথবা inout হতে পারে। এটি আর্গুমেন্টের ধরণগুলিকে কীভাবে প্রভাবিত করে তা আলোচনার জন্য, AIDL ব্যাকএন্ডের দিকনির্দেশনা দেখুন।
পার্সেবল
ব্যাকএন্ড-নির্দিষ্ট পার্সেবল তৈরি করার পদ্ধতির বর্ণনার জন্য, 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 ব্যাকএন্ড ইউনিয়ন দেখুন।
এনামস
অ্যান্ড্রয়েড ১১ এবং উচ্চতর সংস্করণগুলি এনাম ঘোষণা সমর্থন করে। উদাহরণস্বরূপ:
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 , দ্বিগুণ মান হিসাবে বিবেচিত হয়। ফ্লোট মানগুলিতে f প্রত্যয় থাকে, যেমন 2.4f । l বা L প্রত্যয় সহ একটি ইন্টিগ্রাল মান 64-বিট দীর্ঘ মান নির্দেশ করে। অন্যথায়, ইন্টিগ্রাল মানগুলি 8-বিট (বাইট), 32-বিট (int) এবং 64-বিট (দীর্ঘ) এর মধ্যে সবচেয়ে ছোট মান-সংরক্ষণকারী স্বাক্ষরিত প্রকার পায়। সুতরাং 256 একটি int হিসাবে বিবেচনা করা হয়, কিন্তু 255 + 1 byte 0 হিসাবে ওভারফ্লো হয়। হেক্স মান, যেমন 0x3 , প্রথমে 32-বিট এবং 64-বিটের মধ্যে সবচেয়ে ছোট মান-সংরক্ষণকারী স্বাক্ষরিত প্রকার হিসাবে ব্যাখ্যা করা হয় এবং তারপরে স্বাক্ষরিত মান হিসাবে পুনরায় ব্যাখ্যা করা হয়। সুতরাং, 0xffffffff int মান -1 রয়েছে। অ্যান্ড্রয়েড ১৩ থেকে শুরু করে, 3u8 এর মতো ধ্রুবকের সাথে u8 প্রত্যয় যোগ করা যেতে পারে, যা একটি byte মান উপস্থাপন করে। এই প্রত্যয়টি গুরুত্বপূর্ণ যাতে 0xffu8 * 3 এর মতো একটি গণনা -3 টাইপ byte সহ ব্যাখ্যা করা হয় যেখানে 0xff * 3 টাইপ int সহ 765 হয়।
সমর্থিত অপারেটরগুলিতে C++ এবং জাভা শব্দার্থবিদ্যা রয়েছে। সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকারের ক্রম অনুসারে, বাইনারি অপারেটরগুলি হল || && | ^ & == != < > <= >= << >> + - * / % । ইউনারি অপারেটরগুলি হল + - ! ~ ।