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ı içinde 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. Bununla birlikte, paketin hariç tutulması, türler paket olmadan belirtilip genel ad alanına konulduğunda belirsiz içe aktarma hatalarına neden olabilir (genellikle tüm türler ad alanı olmalıdır):

    import Foo;  // same as my.package.Foo

Türleri tanımlayın

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();
    }

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ı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). İ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.

Bağlayıcı, birçok arayüzün ve bağlayıcı nesnenin, bağlayıcı arayüzleri üzerinden 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 örnekteki ITeleportSession gibi yöntemlerden alt arayüzlerin veya oturum nesnelerinin 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öntemlerin sıfır veya daha fazla bağımsız değişkeni olabilir. Yöntemlerin 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 bir açıklama için AIDL arka uçları yönü konusuna 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 ayrıştırılabilir tanımları destekler. Bu tür ayrıştırılabilir ürüne, yapılandırılmış ayrıştırılabilir adı verilir. 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 bildirimlerini 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. İfadeler, işlemleri iç içe yerleştirmek için parantez kullanabilir. Sabit ifade değerleri, tam veya kayan değerlerle kullanılabilir.

true ve false değişmez değerleri 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 noktalı değerlerin f son eki (ör. 2.4f) bulunur. 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. Yani 256, int olarak kabul edilir ancak 255 + 1, byte 0 değerine taşar. 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. Yani, 0xffffffff, int değerine (-1) sahip. 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 || && | ^ & == != < > <= >= << >> + - * / % şeklinde sıralanır. Birli operatörler + - ! ~ şeklindedir.