ภาษา AIDL จะใช้ภาษา Java อย่างคร่าวๆ ไฟล์จะระบุสัญญาอินเทอร์เฟซ รวมถึงประเภทข้อมูลและคงที่ต่างๆ ที่ใช้ในสัญญานี้
แพ็กเกจ
ไฟล์ AIDL ทุกไฟล์จะเริ่มต้นด้วยแพ็กเกจที่ไม่บังคับซึ่งสอดคล้องกับชื่อแพ็กเกจในแบ็กเอนด์ต่างๆ การประกาศแพ็กเกจจะมีลักษณะดังนี้
package my.package;
ไฟล์ AIDL ต้องอยู่ในโครงสร้างโฟลเดอร์ที่ตรงกับแพ็กเกจเช่นเดียวกับ Java ไฟล์ที่มีแพ็กเกจ my.package
ต้องอยู่ในโฟลเดอร์ my/package/
ประเภท
ในไฟล์ AIDL มีหลายตำแหน่งที่คุณระบุประเภทได้ ดูรายการประเภทที่รองรับในภาษา AIDL ได้ที่ประเภทแบ็กเอนด์ AIDL
คำอธิบายประกอบ
ภาษา AIDL หลายส่วนรองรับคำอธิบายประกอบ ดูรายการคำอธิบายประกอบและตำแหน่งที่ใช้คำอธิบายประกอบได้ที่คำอธิบายประกอบ AIDL
การนําเข้า
หากต้องการใช้ประเภทที่กําหนดไว้ในอินเทอร์เฟซอื่นๆ คุณต้องเพิ่มการพึ่งพาในระบบบิลด์ก่อน ในโมดูล cc_*
และ java_*
Soong ซึ่งมีการใช้ไฟล์ .aidl
โดยตรงภายใต้ srcs
ในเวอร์ชันแพลตฟอร์ม Android คุณสามารถเพิ่มไดเรกทอรีโดยใช้ช่อง 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
โดยปริยาย ระบบจะส่งเมธอดแบบช่องทางเดียวแบบไม่พร้อมกันและไม่สามารถแสดงผลลัพธ์ เมธอดแบบ 1 ทิศทางจากเธรดเดียวกันไปยัง Binder เดียวกันจะทํางานตามลําดับด้วย (แม้ว่าอาจอยู่ในเธรดอื่น) ดูข้อมูลเกี่ยวกับวิธีตั้งค่าเทรดได้ที่การจัดการชุดข้อความของแบ็กเอนด์ AIDL
Binder ช่วยให้แชร์อินเทอร์เฟซและออบเจ็กต์ Binder หลายรายการผ่านอินเทอร์เฟซ Binder ได้ อินเทอร์เฟซ AIDL มักใช้การเรียกกลับเป็นส่วนหนึ่งของการเรียกเมธอด เช่น กับ ITeleportCallback
ในตัวอย่างก่อนหน้า คุณนําออบเจ็กต์การเรียกคืนไปใช้งานซ้ำได้ระหว่างการเรียกใช้เมธอดเดียวกันหรือการเรียกใช้เมธอดอื่น อีกตัวอย่างหนึ่งที่ใช้ประเภทอินเทอร์เฟซกันโดยทั่วไปคือสำหรับอินเทอร์เฟซย่อยหรือออบเจ็กต์เซสชันที่จะแสดงผลจากเมธอด เช่น กับ ITeleportSession
ในตัวอย่างก่อนหน้า การซ้อนนี้อนุญาตให้รวม API ต่างๆ ได้ที่ API หรือตามสถานะรันไทม์ เช่น เซสชันอาจแสดงถึงกรรมสิทธิ์ของทรัพยากรหนึ่งๆ เมื่อมีการส่งอินเทอร์เฟซหลายครั้งหรือส่งคืนไปยังไคลเอ็นต์หรือเซิร์ฟเวอร์ที่มาจากอินเทอร์เฟซนั้น ระบบจะรักษาความเท่าเทียมของพอยน์เตอร์ของออบเจ็กต์ Binder ที่เกี่ยวข้องไว้เสมอ
เมธอดอาจมีอาร์กิวเมนต์ตั้งแต่ 0 รายการขึ้นไป อาร์กิวเมนต์ของเมธอดอาจเป็น in
, out
หรือ inout
หากต้องการพูดคุยว่าการดำเนินการนี้ส่งผลต่อประเภทอาร์กิวเมนต์อย่างไร โปรดดูทิศทางของแบ็กเอนด์ AIDL
พาร์เซล
ดูคำอธิบายวิธีสร้าง Parcelable สำหรับแบ็กเอนด์ที่เฉพาะเจาะจงได้ที่Parcelable ที่กําหนดเองสําหรับแบ็กเอนด์ AIDL
Android 10 ขึ้นไปรองรับคําจํากัดความที่แยกได้โดยตรงใน AIDL ข้อมูลที่มีการแบ่งย่อยประเภทนี้เรียกว่า Structured Parcelable ดูข้อมูลเพิ่มเติมเกี่ยวกับความเกี่ยวข้องกันของ 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 Backends Union
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, Parcelable และ Union ที่กําหนดเองอาจมีค่าคงที่แบบจำนวนเต็มและสตริงด้วย เช่น
const @utf8InCpp String HAPPY = ":)";
const String SAD = ":(";
const byte BYTE_ME = 1;
const int ANSWER = 6 * 7;
นิพจน์คงที่
คุณสามารถระบุค่าคงที่ AIDL ขนาดอาร์เรย์ และเครื่องมือแจกแจงได้โดยใช้นิพจน์คงที่ นิพจน์สามารถใช้วงเล็บเพื่อฝังการดำเนินการ ค่านิพจน์แบบคงที่สามารถใช้กับค่าจำนวนเต็มหรือค่าทศนิยมได้
ลิเทอรัล true
และ false
แสดงค่าบูลีน ค่าที่มี .
แต่ไม่มีส่วนต่อท้าย เช่น 3.8
จะถือว่าเป็นค่า Double ค่าทศนิยมมีคำต่อท้าย f
เช่น 2.4f
ค่าจำนวนเต็มที่มีส่วนต่อท้าย l
หรือ L
หมายถึงค่าแบบ 64 บิต ไม่เช่นนั้น ค่าปริพันธ์จะได้ประเภทที่มีการลงชื่อซึ่งคงค่าไว้น้อยที่สุดระหว่าง 8 บิต (ไบต์), 32 บิต (int) และ 64 บิต (ยาว) ดังนั้น 256
จึงถือว่าเป็น int
แต่ 255 + 1
จะแสดงผลเป็น byte
0
ระบบจะตีความค่าฐาน 16 เช่น 0x3
เป็นครั้งแรกเป็นประเภทที่ไม่มีค่าแสดง (Unsigned) ที่เล็กที่สุดซึ่งเก็บค่าไว้ระหว่าง 32 บิตกับ 64 บิต จากนั้นจะตีความใหม่เป็นค่าที่ไม่มีค่าแสดง ดังนั้น 0xffffffff
จึงมีค่า int
-1
ตั้งแต่ Android 13 เป็นต้นไป คุณจะเพิ่มส่วนต่อท้าย u8
ลงในค่าคงที่ได้ เช่น 3u8
เพื่อแทนค่า byte
ส่วนต่อท้ายนี้สำคัญเพื่อให้ระบบตีความการคํานวณ เช่น 0xffu8 * 3
เป็น -3
ที่มีประเภท byte
ส่วน 0xff * 3
คือ 765
ที่มีประเภท int
โอเปอเรเตอร์ที่รองรับมี C++ และความหมายของ Java โอเปอเรเตอร์ไบนารีจะเป็น || && | ^ & == != < > <= >= << >> + - * / %
โดยเรียงลำดับจากความสำคัญต่ำสุดไปสูงสุด โอเปอเรเตอร์แบบยูนาร์คือ + - ! ~