AIDL dili genel olarak Java dilini temel alır. Dosyalar bir arayüz sözleşmesini ve bu sözleşmede kullanılan çeşitli veri türlerini ve sabitleri belirtir.
Paket
Her AIDL dosyası, çeşitli arka uçlardaki paket adlarına karşılık gelen isteğe bağlı bir paketle başlar. Bir paket bildirimi şuna benzer:
package my.package;
AIDL dosyalarının da Java'ya benzer şekilde paketleriyle eşleşen bir klasör yapısında olması gerekir. my.package
paketini içeren dosyalar my/package/
klasöründe olmalıdır.
Türler
AIDL dosyalarında türlerin belirlenebileceği birçok yer vardır. AIDL dilinde desteklenen türlerin tam listesi için bkz. AIDL arka uç türleri .
Ek açıklamalar
AIDL dilinin çeşitli bölümleri ek açıklamaları destekler. Ek açıklamaların listesi ve bunların uygulanabileceği yerler için bkz. AIDL ek açıklamaları .
İthalat
Diğer arayüzlerde tanımlanan türleri kullanmak için öncelikle yapı sistemine bağımlılıklar eklemelisiniz. Android platformu derlemelerinde .aidl
dosyalarının doğrudan srcs
altında kullanıldığı cc_*
ve java_*
Soong modüllerinde, aidl: { include_dirs: ... }
alanını kullanarak dizinler ekleyebilirsiniz. aidl_interface
kullanarak yapılan içe aktarma işlemleri için buraya bakın.
Bir içe aktarma şuna benzer:
import some.package.Foo; // explicit import
Aynı paketteki bir türü içe aktarırken paket atlanabilir. Bununla birlikte, paketin atlanması, türler paket olmadan belirtildiğinde ve genel ad alanına yerleştirildiğinde belirsiz içe aktarma hatalarına yol açabilir (genellikle tüm türler ad alanına sahip olmalıdır):
import Foo; // same as my.package.Foo
Türleri Tanımlama
AIDL dosyaları genellikle arayüz olarak kullanılan türleri tanımlar.
Arayüzler
İşte örnek bir AIDL arayüzü:
interface ITeleport {
void teleport(Location baz, float speed);
String getName();
}
Bir arayüz, bir nesneyi bir dizi yöntemle tanımlar. Yöntemler oneway
( oneway void doFoo()
) veya eşzamanlı olabilir. Bir arayüz oneway
( oneway interface ITeleport {...}
) olarak tanımlanmışsa, içindeki tüm yöntemler örtülü olarak oneway
. Tek yönlü yöntemler eşzamansız olarak gönderilir ve sonuç döndüremez. Aynı iş parçacığından aynı ciltleyiciye giden tek yönlü yöntemlerin de seri olarak yürütülmesi garanti edilir (ancak potansiyel olarak farklı iş parçacıklarında). İş parçacıklarının nasıl kurulacağına ilişkin bir tartışma için bkz. AIDL arka uç iş parçacığı yönetimi .
Yöntemler sıfır veya daha fazla bağımsız değişkene sahip olabilir. Yöntemlere ilişkin argümanlar in
, out
veya inout
olabilir. Bunun bağımsız değişken türlerini nasıl etkilediğine ilişkin bir tartışma için bkz. AIDL arka uç yönlülüğü .
Parçalanabilirler
Arka uca özgü parsellenebilirlerin nasıl oluşturulacağına ilişkin bir açıklama için AIDL, özel parsellenebilirleri arka uçlara ayırır .
Android 10 ve üzeri, doğrudan AIDL'de ayrıştırılabilir tanımları destekler. Bu tür parsellenebilire yapılandırılmış parsellenebilir denir. AIDL derleyicisinde ve yapı sistemimizde yapılandırılmış ve kararlı AIDL'nin nasıl ilişkili olduğu hakkında daha fazla bilgi için bkz. Yapılandırılmış ve kararlı AIDL'ye karşı .
Örneğin:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
Sendikalar
Android 12 ve üzeri sendika bildirimlerini destekler. Örneğin:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Numaralandırmalar
Android 11 ve üzeri, numaralandırma bildirimlerini destekler. Örneğin:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
İç İçe Tip Bildirimleri
Android 13 ve üzeri, iç içe tür bildirimlerini destekler. Örneğin:
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
}
Sabitler
Özel AIDL arayüzleri, ayrıştırılabilir öğeler ve birleşimler ayrıca aşağıdakiler gibi tamsayı ve dize sabitlerini de içerebilir:
const @utf8InCpp String HAPPY = ":)";
const String SAD = ":(";
const byte BYTE_ME = 1;
const int ANSWER = 6 * 7;
Sabit İfadeler
AIDL sabitleri, dizi boyutları ve numaralandırıcılar, sabit ifadeler kullanılarak belirtilebilir. İfadeler işlemleri iç içe geçirmek için parantez kullanabilir. Sabit ifade değerleri integral veya kayan değer değerleriyle kullanılabilir.
true
ve false
değerleri boole değerlerini temsil eder. ile değerler .
ancak 3.8
gibi bir sonek olmadan çift değer olarak kabul edilir. Float değerleri 2.4f
gibi f
son ekine sahiptir. l
veya L
son ekine sahip bir integral değeri, 64 bit uzunluğunda bir değeri belirtir. Aksi takdirde, integral değerleri 8 bit (byte), 32 bit (int) ve 64 bit (long) arasında değeri koruyan en küçük imzalı türü alır. Dolayısıyla 256
int
olarak kabul edilir, ancak 255 + 1
byte
0
olarak taşar. 0x3
gibi hex değerleri öncelikle 32 bit ile 64 bit arasındaki en küçük değeri koruyan işaretsiz tür olarak yorumlanır ve ardından işaretsiz değerler olarak yeniden yorumlanır. Yani, 0xffffffff
int
değeri -1
sahiptir. Android 13'ten başlayarak, bir byte
değerini temsil etmek için 3u8
gibi sabitlere u8
son eki eklenebilir. Bu son ek, 0xffu8 * 3
gibi bir hesaplamanın byte
türüyle -3
olarak yorumlanması, int
türüyle 0xff * 3
ise 765
olarak yorumlanması açısından önemlidir.
Desteklenen operatörler C++ ve Java semantiğine sahiptir. En düşükten en yükseğe doğru ikili operatörler || && | ^ & == != < > <= >= << >> + - * / %
. Tekli operatörler + - ! ~
.