ภาษา AIDL มีพื้นฐานมาจากภาษา Java อย่างหลวมๆ ไฟล์ระบุสัญญาอินเทอร์เฟซและประเภทข้อมูลต่างๆ และค่าคงที่ที่ใช้ในสัญญานี้
บรรจุุภัณฑ์
ไฟล์ AIDL ทุกไฟล์เริ่มต้นด้วยแพ็คเกจเสริมที่สอดคล้องกับชื่อแพ็คเกจในแบ็กเอนด์ต่างๆ การประกาศแพ็คเกจมีลักษณะดังนี้:
package my.package;
เช่นเดียวกับ Java ไฟล์ AIDL จะต้องอยู่ในโครงสร้างโฟลเดอร์ที่ตรงกับแพ็คเกจ ไฟล์ที่มีแพ็คเกจ 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 {
void teleport(Location baz, float speed);
String getName();
}
อินเทอร์เฟซกำหนดวัตถุด้วยชุดของวิธีการ วิธีการอาจเป็น oneway
( oneway void doFoo()
) หรือแบบซิงโครนัส หากอินเทอร์เฟซถูกกำหนดให้เป็น oneway
( oneway interface ITeleport {...}
) ดังนั้นวิธีการทั้งหมดในนั้นจะเป็น oneway
โดยปริยาย วิธี Oneway ถูกส่งแบบอะซิงโครนัสและไม่สามารถส่งคืนผลลัพธ์ได้ วิธีการแบบ Oneway จากเธรดเดียวกันไปยังเครื่องผูกเดียวกันนั้นรับประกันว่าจะดำเนินการแบบอนุกรมด้วย (แม้ว่าอาจอยู่ในเธรดที่ต่างกัน) สำหรับการอภิปรายเกี่ยวกับวิธีการตั้งค่าเธรด โปรดดูที่ AIDL แบ็กเอนด์การจัดการเธรด
วิธีการสามารถมีอาร์กิวเมนต์เป็นศูนย์หรือมากกว่านั้นได้ อาร์กิวเมนต์ของเมธอดอาจเป็น in
, out
หรือ inout
สำหรับการอภิปรายว่าสิ่งนี้ส่งผลต่อประเภทอาร์กิวเมนต์อย่างไร โปรดดู AIDL แบ็กเอนด์ทิศทาง
พัสดุ
สำหรับคำอธิบายวิธีสร้างพัสดุแบบเฉพาะแบ็กเอนด์ AIDL แบ็กเอนด์แบบกำหนดเองแบบแบ่งพัสดุได้
Android 10 และสูงกว่ารองรับคำจำกัดความแบบแยกส่วนได้โดยตรงใน AIDL พัสดุประเภทนี้เรียกว่าพัสดุแบบมีโครงสร้าง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสัมพันธ์ระหว่าง 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;
}
เอนัม
Android 11 และสูงกว่ารองรับการประกาศแจงนับ ตัวอย่างเช่น:
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 เป็นต้นไป คุณสามารถเพิ่มส่วนต่อท้าย u8
ลงในค่าคงที่ เช่น 3u8
เพื่อแสดงค่า byte
ส่วนต่อท้ายนี้มีความสำคัญเพื่อให้การคำนวณ เช่น 0xffu8 * 3
ถูกตีความว่าเป็น -3
ด้วยประเภท byte
ในขณะที่ 0xff * 3
คือ 765
ด้วยประเภท int
ตัวดำเนินการที่รองรับมีซีแมนทิกส์ C++ และ Java เรียงลำดับจากลำดับความสำคัญต่ำสุดไปสูงสุด ตัวดำเนินการไบนารีคือ || && | ^ & == != < > <= >= << >> + - * / %
ตัวดำเนินการ Unary คือ + - ! ~
.