অ্যান্ড্রয়েড ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (AIDL) হলো এমন একটি টুল যা ব্যবহারকারীদের আইপিসি (IPC) থেকে মুক্তি দেয়। একটি ইন্টারফেস (যা একটি .aidl ফাইলে নির্দিষ্ট করা থাকে) দেওয়া হলে, বিভিন্ন বিল্ড সিস্টেম aidl বাইনারি ব্যবহার করে C++ বা Java বাইন্ডিং তৈরি করে, যাতে এই ইন্টারফেসটি রানটাইম বা বিটনেস নির্বিশেষে বিভিন্ন প্রসেসের মধ্যে ব্যবহার করা যায়।
অ্যান্ড্রয়েডের যেকোনো প্রসেসের মধ্যে AIDL ব্যবহার করা যেতে পারে: প্ল্যাটফর্ম কম্পোনেন্টগুলোর মধ্যে অথবা অ্যাপগুলোর মধ্যে। তবে, এটি কখনোই অ্যাপের জন্য API হিসেবে ব্যবহৃত হয় না। উদাহরণস্বরূপ, প্ল্যাটফর্মে একটি SDK API ইমপ্লিমেন্ট করার জন্য AIDL ব্যবহার করা যেতে পারে, কিন্তু SDK API সারফেসে সরাসরি AIDL API থাকে না। অ্যাপগুলোর মধ্যে সরাসরি AIDL কীভাবে ব্যবহার করতে হয়, সে সম্পর্কে ডকুমেন্টেশনের জন্য সংশ্লিষ্ট অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন দেখুন। যখন এমন প্ল্যাটফর্ম কম্পোনেন্টগুলোর মধ্যে AIDL ব্যবহার করা হয় যেগুলো আলাদাভাবে আপডেট করা হয়, যেমন APEX (অ্যান্ড্রয়েড ১০ থেকে শুরু) বা HAL (অ্যান্ড্রয়েড ১১ থেকে শুরু), তখন Stable AIDL নামে পরিচিত ভার্সনিং সিস্টেমটি অবশ্যই ব্যবহার করতে হবে।
উদাহরণ
এখানে একটি AIDL ইন্টারফেসের উদাহরণ দেওয়া হলো:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
একটি সার্ভার প্রসেস একটি ইন্টারফেস রেজিস্টার করে এবং সেটিতে কল গ্রহণ করে, এবং একটি ক্লায়েন্ট প্রসেস সেই ইন্টারফেসগুলোতে কল করে। অনেক ক্ষেত্রে, একটি প্রসেস ক্লায়েন্ট এবং সার্ভার উভয় হিসেবেই কাজ করে, কারণ এটি একাধিক ইন্টারফেস রেফারেন্স করতে পারে। AIDL ভাষা সম্পর্কে আরও বিস্তারিত জানতে, AIDL ভাষা দেখুন। এই ইন্টারফেসগুলো ব্যবহার করার জন্য উপলব্ধ বিভিন্ন রানটাইম সম্পর্কে আরও বিস্তারিত জানতে, AIDL ব্যাকএন্ড দেখুন। এই টাইপ ডিক্লারেশনগুলো একটি নির্দিষ্ট ভাষার ক্লাস ডিক্লারেশনের মতোই, কিন্তু এগুলো একাধিক প্রসেসের মধ্যে কাজ করে।
এটি কীভাবে কাজ করে
AIDL কল করার জন্য বাইন্ডার কার্নেল ড্রাইভার ব্যবহার করে। যখন আপনি একটি কল করেন, তখন একটি মেথড আইডেন্টিফায়ার এবং সমস্ত অবজেক্ট একটি বাফারে প্যাক করা হয় এবং একটি রিমোট প্রসেসে কপি করা হয়, যেখানে একটি বাইন্ডার থ্রেড ডেটা পড়ার জন্য অপেক্ষা করে। একটি বাইন্ডার থ্রেড যখন কোনো ট্রানজ্যাকশনের জন্য ডেটা পায়, তখন থ্রেডটি লোকাল প্রসেসে একটি নেটিভ স্টাব অবজেক্ট খুঁজে বের করে, এবং এই ক্লাসটি ডেটা আনপ্যাক করে একটি লোকাল ইন্টারফেস অবজেক্টে কল করে। এই লোকাল ইন্টারফেস অবজেক্টটিই একটি সার্ভার প্রসেস তৈরি এবং রেজিস্টার করে। যখন একই প্রসেস এবং একই ব্যাকএন্ডে কল করা হয়, তখন কোনো প্রক্সি অবজেক্ট থাকে না, এবং তাই কোনো প্যাকিং বা আনপ্যাকিং ছাড়াই কলগুলো সরাসরি হয়। আরও তথ্যের জন্য, বাইন্ডার ওভারভিউ দেখুন।
ডিভাইসে থাকা পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করুন
ডিভাইসের পরিষেবাগুলির সাথে যোগাযোগ করার জন্য অ্যান্ড্রয়েডে কয়েকটি কমান্ড রয়েছে। চেষ্টা করুন:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing