AIDL dili

AIDL dili, Java diline dayanı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. Paket beyanı aşağıdaki gibi görünür:

    package my.package;

Java'ya benzer şekilde, AIDL dosyaları paketleriyle eşleşen bir klasör yapısında olmalıdır. my.package paketine sahip 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 bunların uygulanabileceği yerlerin listesi için AIDL ek açıklamaları başlıklı makaleyi inceleyin.

İthalat

Diğer arayüzlerde tanımlanan türleri kullanmak için önce derleme sistemine bağımlılık eklemeniz gerekir. Android platform 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 kullanan 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ılırken paket atlanabilir. Ancak paketi atlamak, türler paket olmadan belirtilip genel ad alanına yerleştirildiğinde belirsiz içe aktarma hatalarına neden olabilir (genellikle tüm türler ad alanına yerleştirilmelidir):

    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

Örnek bir AIDL arayüzü:

    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 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ı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çalarında yürütülebilir). İleti dizilerinin nasıl ayarlanacağıyla ilgili bir tartışma için AIDL arka uçlarında mesaj dizisi yönetimi başlıklı makaleyi inceleyin.

Binder, birçok arayüz ve bağlayıcı nesnesinin bağlayıcı arayüzleri aracılığıyla paylaşılmasına olanak tanır. AIDL arayüzleri, önceki örnekteki ITeleportCallback gibi yöntem çağrılarının bir parçası olarak sık sık geri çağırma işlevleri kullanır. Geri çağırma nesnelerini aynı yönteme veya farklı yöntemlere yapılan çağrılar arasında yeniden kullanabilirsiniz. Arayüz türlerinin yaygın bir başka kullanımı, önceki örnekte ITeleportSession ile gösterildiği gibi alt arayüzlerin veya oturum nesnelerinin yöntemlerden döndürülmesidir. 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 aktarıldığında veya geldikleri istemciye ya da sunucuya döndürüldüğünde, her zaman temel bağlayıcı nesnesinin işaretçi eşitliğini korur.

Yöntemler sıfır veya daha fazla bağımsız değişkene sahip olabilir. Yöntem bağımsız değişkenleri in, out veya inout olabilir. Bunun bağımsız değişken türlerini nasıl etkilediği hakkında bilgi edinmek için AIDL arka uç yönlülüğü bölümüne bakın.

Ayrıştırılabilir öğeler

Arka uça özgü 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ümler, doğrudan AIDL'de paketlenebilir tanımları destekler. Bu tür bir paketlenebilir öğeye yapılandırılmış paketlenebilir öğe denir. AIDL derleyicisinde ve derleme sistemimizde yapılandırılmış ve kararlı AIDL'nin 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.

Örnek:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Birlikler

Android 12 ve sonraki sürümler, etiketli birleştirme bildirimlerini destekler. Örnek:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Arka uçla ilgili ayrıntılar için AIDL Arka Uç Birleştirmeleri başlıklı makaleyi inceleyin.

Numaralandırmalar

Android 11 ve sonraki sürümler enum tanımları destekler. Örnek:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

İç içe yerleştirilmiş tür tanımları

Android 13 ve sonraki sürümler iç içe yerleştirilmiş tür tanımlarını destekler. Örnek:

    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ştirmelerde tam sayı ve dize sabitleri de bulunabilir. Örneğin:

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

Sabit ifadeler

AIDL sabitleri, dizi boyutları ve dizeleyiciler sabit ifadeler kullanılarak belirtilebilir. İfadelerde, işlemleri iç içe yerleştirmek için parantez kullanılabilir. Sabit ifade değerleri, tam veya kayan değerlerle kullanılabilir.

true ve false değişmezleri, Boole değerlerini temsil eder. . içeren ancak 3.8 gibi son ek içermeyen değerlerin çift değer olduğu kabul edilir. Kayan değerler f son ekiyle (ör. 2.4f) başlar. l veya L son eki içeren bir tam sayı değeri, 64 bit uzunluğunda bir değeri gösterir. Aksi takdirde, integral değerleri 8 bit (bayt), 32 bit (int) ve 64 bit (uzun) arasında değer koruyan en küçük imzalı türü alır. Dolayısıyla 256 bir int olarak kabul edilir ancak 255 + 1 taşarak byte 0 olur. 0x3 gibi onaltılık değerler, önce 32 bit ile 64 bit arasında değer koruyan en küçük imzalanmamış tür olarak yorumlanır ve ardından imzalanmamış değerler olarak yeniden yorumlanır. Dolayısıyla 0xffffffff, int değerine (-1) sahiptir. Android 13'ten itibaren u8 soneki, byte değerini temsil etmek için 3u8 gibi sabitlere eklenebilir. Bu son ek, 0xffu8 * 3 gibi bir hesaplamanın byte türüne sahip -3 olarak yorumlanması, 0xff * 3 ise int türüne sahip 765 olarak yorumlanması için önemlidir.

Desteklenen operatörler C++ ve Java semantiklerine sahiptir. İkili operatörler, en düşük öncelikten en yüksek önceliğe doğru || && | ^ & == != < > <= >= << >> + - * / % sıralanır. Birli operatörler + - ! ~ şeklindedir.