AIDL Dili

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 + - ! ~ .