AIDL dili, Java diline benzer. 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. Paket beyanı aşağıdaki gibi görünür:
package my.package;
Java'ya benzer şekilde, AIDL dosyaları da paketleriyle eşleşen bir klasör yapısında olmalıdır. Paket my.package içeren dosyalar my/package/ klasöründe olmalıdır.
Türler
AIDL dosyalarında türlerin belirtilebileceği birçok yer vardır. AIDL dilinde desteklenen türlerin tam listesi için AIDL arka uç türleri başlıklı makaleyi inceleyin.
Ek Açıklamalar
AIDL dilinin çeşitli bölümleri ek açıklamaları destekler. Ek açıklamaların ve nerede uygulanabileceklerinin listesi için AIDL ek açıklamaları başlıklı makaleyi inceleyin.
İçe aktarmalar
Diğer arayüzlerde tanımlanan türleri kullanmak için önce derleme sistemine bağımlılıklar eklemeniz gerekir. Android platform derlemelerinde cc_* ve java_* Soong modüllerinde .aidl dosyalarının doğrudan srcs altında kullanıldığı yerlerde, aidl: { include_dirs: ... } alanını kullanarak dizin ekleyebilirsiniz. aidl_interface kullanılarak yapılan içe aktarma işlemleri için burayı inceleyin.
İçe aktarma işlemi şu şekilde görünür:
import some.package.Foo; // explicit import
Aynı paketteki bir türü içe aktarırken paket atlanabilir. Ancak, paket atlandığında türler paket olmadan belirtilip genel ad alanına yerleştirilirse (genellikle tüm türler ad alanına yerleştirilmelidir) belirsiz içe aktarma hataları oluşabilir:
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
Aşağıda bir AIDL arayüzü örneği verilmiştir:
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();
}
Arayüz, bir dizi yöntemi olan bir nesneyi tanımlar. Yöntemler oneway (oneway void doFoo()) veya eşzamanlı olabilir. Bir arayüz oneway (oneway interface ITeleport {...}) olarak tanımlanırsa içindeki tüm yöntemler örtülü olarak oneway olur. Tek yönlü yöntemler eşzamansız olarak gönderilir ve sonuç döndüremez. Aynı iş parçacığından aynı bağlayıcıya giden tek yönlü yöntemler de seri olarak yürütülür (ancak farklı iş parçacıklarında yürütülebilir). İş parçacıklarının nasıl ayarlanacağıyla ilgili tartışma için AIDL arka uçlarında iş parçacığı yönetimi başlıklı makaleyi inceleyin.
Binder, birçok arayüzün ve bağlayıcı nesnenin bağlayıcı arayüzleri aracılığıyla paylaşılmasına olanak tanır. AIDL arayüzleri, yöntem çağrıları kapsamında sıklıkla geri çağırmaları kullanır. Örneğin, önceki örnekteki ITeleportCallback. Aynı yönteme yapılan çağrılar veya farklı yöntemlere yapılan çağrılar arasında geri çağırma nesnelerini yeniden kullanabilirsiniz. Arayüz türlerinin bir diğer yaygın kullanımı, önceki örnekteki ITeleportSession gibi yöntemlerden döndürülecek alt arayüzler veya oturum nesneleri içindir. Bu iç içe yerleştirme, farklı API'lerin API'de veya çalışma zamanı durumuna göre kapsüllenmesine olanak tanır. Örneğin, bir oturum belirli bir kaynağın sahipliğini temsil edebilir. Arayüzler birden çok kez iletildiğinde veya geldikleri istemciye ya da sunucuya döndürüldüğünde, her zaman temel bağlayıcı nesnenin işaretçi eşitliğini korurlar.
Yöntemler sıfır veya daha fazla bağımsız değişkene sahip olabilir. Yöntemlere iletilen bağımsız değişkenler in, out veya inout olabilir. Bu durumun bağımsız değişken türlerini nasıl etkilediğiyle ilgili bir tartışma için AIDL arka uçlarının yönlülüğü başlıklı makaleye bakın.
Ayrıştırılabilir öğeler
Arka uca özel parcelable'ların nasıl oluşturulacağıyla ilgili açıklama için AIDL arka uçları özel parcelable'lar başlıklı makaleyi inceleyin.
Android 10 ve sonraki sürümlerde, parcelable tanımları doğrudan AIDL'de desteklenir. Bu tür paketlenebilir nesnelere yapılandırılmış paketlenebilir nesneler denir. Yapılandırılmış ve kararlı AIDL'nin AIDL derleyicisinde ve derleme sistemimizde nasıl ilişkili olduğu hakkında daha fazla bilgi için Yapılandırılmış ve kararlı AIDL başlıklı makaleyi inceleyin.
Örneğin:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
Sendikalar
Android 12 ve sonraki sürümlerde etiketli birleşim bildirimleri desteklenir. Örneğin:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Arka uca özel ayrıntılar için AIDL Arka Uç Birleşimleri başlıklı makaleyi inceleyin.
Numaralandırmalar
Android 11 ve sonraki sürümlerde enum bildirimleri desteklenir. Örneğin:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
İç İçe Tür Bildirimleri
Android 13 ve sonraki sürümlerde iç içe tür bildirimleri desteklenir. Ö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, paketlenebilirler ve birleşimler de aşağıdaki gibi tam sayı ve dize sabitleri içerebilir:
const @utf8InCpp String HAPPY = ":)";
const String SAD = ":(";
const byte BYTE_ME = 1;
const int ANSWER = 6 * 7;
Sabit ifadeler
AIDL sabitleri, dizi boyutları ve numaralandırıcılar sabit ifadeler kullanılarak belirtilebilir. İfadelerde işlemleri iç içe yerleştirmek için parantezler kullanılabilir. Sabit ifade değerleri, tam sayı veya kayan nokta değerleriyle kullanılabilir.
true ve false değişmezleri, Boole değerlerini temsil eder. . içeren ancak 3.8 gibi bir sonek içermeyen değerler çift değer olarak kabul edilir. Kayan nokta değerleri, 2.4f gibi f sonekine sahiptir. l veya L sonekine sahip bir tam sayı değeri, 64 bitlik uzun bir değeri gösterir. Aksi takdirde, tam sayı değerleri 8 bit (bayt), 32 bit (int) ve 64 bit (uzun) arasında değer koruyan en küçük işaretli türü alır. Bu nedenle 256, int olarak kabul edilir ancak 255 + 1, byte 0 olarak taşar. 0x3 gibi onaltılık değerler önce 32 bit ile 64 bit arasında değer koruyan en küçük işaretsiz tür olarak yorumlanır, ardından işaretsiz değerler olarak yeniden yorumlanır. Yani 0xffffffff, int değerine sahip
-1. Android 13'ten itibaren u8 soneki, byte değerini temsil etmek için 3u8 gibi sabitlere eklenebilir. Bu sonek, 0xffu8 * 3 gibi bir hesaplamanın byte türünde -3 olarak yorumlanması, 0xff * 3'ün ise int türünde 765 olarak yorumlanması için önemlidir.
Desteklenen operatörler C++ ve Java semantiğine sahiptir. En düşükten en yüksek önceliğe doğru sıralandığında ikili operatörler || && | ^ & == != < > <= >= << >> + - * / % olur. Tekli operatörler + - ! ~.