AIDL'ye Genel Bakış

Android Arayüz Tanımlama Dili (AIDL), kullanıcıların IPC'yi soyutlamalarını sağlayan bir araçtır. Bir arabirim verildiğinde (bir .aidl dosyasında belirtilir), çeşitli yapı sistemleri, C++ veya Java bağlamaları oluşturmak için aidl ikili dosyasını kullanır, böylece bu arabirim, buradaki çalışma zamanı veya bitlikten bağımsız olarak işlemler arasında kullanılabilir.

AIDL, Android'deki herhangi bir işlem arasında kullanılabilir: platform bileşenleri arasında veya uygulamalar arasında. Ancak, hiçbir zaman uygulamalar için bir API olarak kullanılmaz. AIDL, örneğin platformda bir SDK API'sini uygulamak için kullanılabilir, ancak SDK API yüzeyi hiçbir zaman doğrudan AIDL API'lerini içermez. AIDL'nin uygulamalar arasında doğrudan nasıl kullanılacağına ilişkin belgeler için ilgili Android geliştiricilerinin belgelerine bakın. APEX'ler (Android 10'dan başlayarak) veya HAL'ler (Android 11'den başlayarak) gibi ayrı olarak güncellenen platform bileşenleri arasında AIDL kullanıldığında, Kararlı AIDL olarak bilinen sürüm oluşturma sistemi kullanılmalıdır.

Örnek

İşte örnek bir AIDL arayüzü:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 ve üstü, ayrılabilir bildirimleri destekler. Örneğin:

    package my.package;

    import my.package.Boo;

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

Android 11 ve üstü destek numaralandırma bildirimleri. Örneğin:

    package my.package;

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

Android 12 ve üstü destek birliği bildirimleri. Örneğin:

    package my.package;

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

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

Android T (AOSP deneysel) ve daha yüksek yuvalı 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
    }

Bir sunucu işlemi bir arabirimi kaydeder ve ona çağrılar sunar ve bir istemci süreci bu arabirimlere çağrı yapar. Çoğu durumda, bir işlem birden çok arabirime atıfta bulunabileceğinden hem istemci hem de sunucu görevi görür. Bu arabirimleri kullanmak için kullanılabilen çeşitli çalışma zamanları hakkında daha fazla ayrıntı için bkz. AIDL arka uçları . Bu tür bildirimler tam olarak belirli bir dildeki sınıf bildirimi gibidir, ancak süreçler arasında çalışırlar.

Nasıl çalışır

AIDL, arama yapmak için bağlayıcı çekirdek sürücüsünü kullanır. Bir çağrı yaptığınızda, bir yöntem tanımlayıcısı ve tüm nesneler bir arabelleğe paketlenir ve bir bağlayıcı iş parçacığının verileri okumak için beklediği uzak bir işleme kopyalanır. Bir bağlayıcı iş parçacığı bir işlem için veri aldığında, iş parçacığı yerel süreçte yerel bir saplama nesnesini arar ve bu sınıf verileri paketinden çıkarır ve yerel bir arabirim nesnesi üzerinde bir çağrı yapar. Bu yerel arabirim nesnesi, bir sunucu işleminin oluşturduğu ve kaydettiği nesnedir. Çağrılar aynı süreçte ve aynı arka uçta yapıldığında, hiçbir proxy nesnesi yoktur ve bu nedenle çağrılar herhangi bir paketleme veya paket açma olmadan doğrudandır.

Cihazdaki servislerle etkileşim kurma

Android, cihazdaki hizmetlerle etkileşime izin vermek için birkaç komutla birlikte gelir. Denemek:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing