AIDL ভাষা শিথিলভাবে জাভা ভাষার উপর ভিত্তি করে। ফাইলগুলি একটি ইন্টারফেস চুক্তি এবং এই চুক্তিতে ব্যবহৃত বিভিন্ন ডেটা প্রকার এবং ধ্রুবক নির্দিষ্ট করে৷
প্যাকেজ
প্রতিটি AIDL ফাইল একটি ঐচ্ছিক প্যাকেজ দিয়ে শুরু হয় যা বিভিন্ন ব্যাকএন্ডে প্যাকেজের নামের সাথে মিলে যায়। একটি প্যাকেজ ঘোষণা এই মত দেখায়:
package my.package;
জাভা অনুরূপ, AIDL ফাইলগুলি অবশ্যই তাদের প্যাকেজের সাথে মেলে এমন একটি ফোল্ডার কাঠামোতে থাকতে হবে৷ প্যাকেজ my.package
সহ ফাইলগুলি অবশ্যই my/package/
ফোল্ডারে থাকতে হবে।
প্রকারভেদ
এআইডিএল ফাইলগুলিতে, এমন অনেক জায়গা রয়েছে যেখানে প্রকারগুলি নির্দিষ্ট করা যেতে পারে। 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 ইন্টারফেস:
interface ITeleport {
void teleport(Location baz, float speed);
String getName();
}
একটি ইন্টারফেস পদ্ধতির একটি সিরিজ সহ একটি বস্তুকে সংজ্ঞায়িত করে। পদ্ধতিগুলি oneway
হতে পারে ( oneway void doFoo()
) বা সিঙ্ক্রোনাস। যদি একটি ইন্টারফেসকে oneway
( oneway interface ITeleport {...}
) হিসাবে সংজ্ঞায়িত করা হয়, তাহলে এর মধ্যে থাকা সমস্ত পদ্ধতিই oneway
। ওয়ানওয়ে পদ্ধতিগুলি অ্যাসিঙ্ক্রোনাসভাবে পাঠানো হয় এবং ফলাফল ফেরত দিতে পারে না। একই থ্রেড থেকে একই বাইন্ডারে একমুখী পদ্ধতিগুলিও ক্রমিকভাবে চালায় (যদিও সম্ভাব্য বিভিন্ন থ্রেডে)। কিভাবে থ্রেড সেটআপ করতে হয় তার আলোচনার জন্য, AIDL ব্যাকএন্ড থ্রেড ম্যানেজমেন্ট দেখুন।
পদ্ধতিতে শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে। পদ্ধতির আর্গুমেন্ট in
, out
, বা inout
হতে পারে। এটি কীভাবে আর্গুমেন্টের ধরনকে প্রভাবিত করে তার আলোচনার জন্য, AIDL ব্যাকএন্ডস দিকনির্দেশনা দেখুন।
পার্সেবল
কিভাবে ব্যাকএন্ড-নির্দিষ্ট পার্সেলেবল তৈরি করতে হয় তার বর্ণনার জন্য, AIDL ব্যাকএন্ড কাস্টম পার্সেলেবল ।
Android 10 এবং উচ্চতর সমর্থন parcelable সংজ্ঞা সরাসরি 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;
}
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
, দ্বৈত মান হিসাবে বিবেচিত হয়। ফ্লোট মান f
প্রত্যয় আছে, যেমন 2.4f
। l
বা L
প্রত্যয় সহ একটি অবিচ্ছেদ্য মান একটি 64-বিট দীর্ঘ মান নির্দেশ করে। অন্যথায়, ইন্টিগ্রেল মানগুলি 8-বিট (বাইট), 32-বিট (int), এবং 64-বিট (লং) এর মধ্যে সবচেয়ে ছোট মান-সংরক্ষিত সাইনড টাইপ পায়। তাই 256
একটি int
হিসাবে বিবেচিত হয়, কিন্তু 255 + 1
ওভারফ্লো হয় byte
0
। হেক্স মান, যেমন 0x3
, প্রথমে 32-বিট এবং 64-বিটের মধ্যে ক্ষুদ্রতম মান-সংরক্ষিত স্বাক্ষরবিহীন প্রকার হিসাবে ব্যাখ্যা করা হয় এবং তারপরে স্বাক্ষরবিহীন মান হিসাবে পুনরায় ব্যাখ্যা করা হয়। সুতরাং, 0xffffffff
int
মান আছে -1
। Android 13 থেকে শুরু করে, একটি byte
মান উপস্থাপন করতে 3u8
এর মতো ধ্রুবকগুলিতে u8
প্রত্যয় যোগ করা যেতে পারে। এই প্রত্যয়টি গুরুত্বপূর্ণ যাতে একটি গণনা, যেমন 0xffu8 * 3
, টাইপ byte
সহ -3
হিসাবে ব্যাখ্যা করা হয় যেখানে 0xff * 3
টাইপ int
সহ 765
।
সমর্থিত অপারেটরগুলিতে C++ এবং জাভা শব্দার্থবিদ্যা রয়েছে। সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকারের জন্য, বাইনারি অপারেটর হল || && | ^ & == != < > <= >= << >> + - * / %
। ইউনারি অপারেটর হল + - ! ~
AIDL ভাষা শিথিলভাবে জাভা ভাষার উপর ভিত্তি করে। ফাইলগুলি একটি ইন্টারফেস চুক্তি এবং এই চুক্তিতে ব্যবহৃত বিভিন্ন ডেটা প্রকার এবং ধ্রুবক নির্দিষ্ট করে৷
প্যাকেজ
প্রতিটি AIDL ফাইল একটি ঐচ্ছিক প্যাকেজ দিয়ে শুরু হয় যা বিভিন্ন ব্যাকএন্ডে প্যাকেজের নামের সাথে মিলে যায়। একটি প্যাকেজ ঘোষণা এই মত দেখায়:
package my.package;
জাভা অনুরূপ, AIDL ফাইলগুলি অবশ্যই তাদের প্যাকেজের সাথে মেলে এমন একটি ফোল্ডার কাঠামোতে থাকতে হবে৷ প্যাকেজ my.package
সহ ফাইলগুলি অবশ্যই my/package/
ফোল্ডারে থাকতে হবে।
প্রকারভেদ
এআইডিএল ফাইলগুলিতে, এমন অনেক জায়গা রয়েছে যেখানে প্রকারগুলি নির্দিষ্ট করা যেতে পারে। 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 ইন্টারফেস:
interface ITeleport {
void teleport(Location baz, float speed);
String getName();
}
একটি ইন্টারফেস পদ্ধতির একটি সিরিজ সহ একটি বস্তুকে সংজ্ঞায়িত করে। পদ্ধতিগুলি oneway
হতে পারে ( oneway void doFoo()
) বা সিঙ্ক্রোনাস। যদি একটি ইন্টারফেসকে oneway
( oneway interface ITeleport {...}
) হিসাবে সংজ্ঞায়িত করা হয়, তাহলে এর মধ্যে থাকা সমস্ত পদ্ধতিই oneway
। ওয়ানওয়ে পদ্ধতিগুলি অ্যাসিঙ্ক্রোনাসভাবে পাঠানো হয় এবং ফলাফল ফেরত দিতে পারে না। একই থ্রেড থেকে একই বাইন্ডারে একমুখী পদ্ধতিগুলিও ক্রমিকভাবে চালায় (যদিও সম্ভাব্য বিভিন্ন থ্রেডে)। কিভাবে থ্রেড সেটআপ করতে হয় তার আলোচনার জন্য, AIDL ব্যাকএন্ড থ্রেড ম্যানেজমেন্ট দেখুন।
পদ্ধতিতে শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে। পদ্ধতির আর্গুমেন্ট in
, out
, বা inout
হতে পারে। এটি কিভাবে আর্গুমেন্টের ধরনকে প্রভাবিত করে তার আলোচনার জন্য, AIDL ব্যাকএন্ডস দিকনির্দেশনা দেখুন।
পার্সেবল
কিভাবে ব্যাকএন্ড-নির্দিষ্ট পার্সেলেবল তৈরি করতে হয় তার বর্ণনার জন্য, AIDL ব্যাকএন্ড কাস্টম পার্সেলেবল ।
Android 10 এবং উচ্চতর সমর্থন parcelable সংজ্ঞা সরাসরি 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;
}
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
, দ্বৈত মান হিসাবে বিবেচিত হয়। ফ্লোট মান f
প্রত্যয় আছে, যেমন 2.4f
। l
বা L
প্রত্যয় সহ একটি অবিচ্ছেদ্য মান একটি 64-বিট দীর্ঘ মান নির্দেশ করে। অন্যথায়, ইন্টিগ্রেল মানগুলি 8-বিট (বাইট), 32-বিট (int), এবং 64-বিট (লং) এর মধ্যে সবচেয়ে ছোট মান-সংরক্ষিত সাইনড টাইপ পায়। তাই 256
একটি int
হিসাবে বিবেচিত হয়, কিন্তু 255 + 1
ওভারফ্লো হয় byte
0
। হেক্স মান, যেমন 0x3
, প্রথমে 32-বিট এবং 64-বিটের মধ্যে ক্ষুদ্রতম মান-সংরক্ষিত স্বাক্ষরবিহীন প্রকার হিসাবে ব্যাখ্যা করা হয় এবং তারপরে স্বাক্ষরবিহীন মান হিসাবে পুনরায় ব্যাখ্যা করা হয়। সুতরাং, 0xffffffff
int
মান আছে -1
। Android 13 থেকে শুরু করে, একটি byte
মান উপস্থাপন করতে 3u8
এর মতো ধ্রুবকগুলিতে u8
প্রত্যয় যোগ করা যেতে পারে। এই প্রত্যয়টি গুরুত্বপূর্ণ যাতে একটি গণনা, যেমন 0xffu8 * 3
, টাইপ byte
সহ -3
হিসাবে ব্যাখ্যা করা হয় যেখানে 0xff * 3
টাইপ int
সহ 765
।
সমর্থিত অপারেটরগুলিতে C++ এবং জাভা শব্দার্থবিদ্যা রয়েছে। সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকারের জন্য, বাইনারি অপারেটর হল || && | ^ & == != < > <= >= << >> + - * / %
। ইউনারি অপারেটর হল + - ! ~