Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Ikhtisar AIDL

Android Interface Definition Language (AIDL) adalah alat yang memungkinkan pengguna mengabstraksi IPC. Mengingat sebuah antarmuka (ditentukan dalam .aidl file), berbagai sistem build menggunakan aidl biner untuk membangun C ++ atau Java binding sehingga interface ini dapat digunakan di seluruh proses, terlepas dari runtime atau bitness ada.

AIDL dapat digunakan di antara proses apa pun di Android: antar komponen platform atau antar aplikasi. Namun, itu tidak pernah digunakan sebagai API untuk aplikasi. AIDL dapat digunakan untuk mengimplementasikan API SDK di platform, misalnya, tetapi permukaan SDK API tidak pernah berisi API AIDL secara langsung. Untuk dokumentasi tentang cara menggunakan AIDL antara aplikasi langsung, lihat sesuai Android dokumentasi pengembang . Ketika AIDL digunakan antara komponen platform yang diperbarui secara terpisah, seperti apexes (mulai Android 10) atau HAL (mulai di Android 11), sistem versioning dikenal sebagai AIDL Stabil harus digunakan.

Contoh

Berikut adalah contoh antarmuka AIDL:

    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 dan yang lebih tinggi mendukung deklarasi parcelable. Sebagai contoh:

    package my.package;

    import my.package.Boo;

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

Android 11 dan yang lebih tinggi mendukung deklarasi enum. Sebagai contoh:

    package my.package;

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

Android 12 dan deklarasi serikat dukungan yang lebih tinggi. Sebagai contoh:

    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 eksperimental) dan deklarasi tipe bersarang yang lebih tinggi mendukung. Sebagai contoh:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

Sebuah proses server register interface dan melayani panggilan untuk itu, dan proses klien membuat panggilan ke interface tersebut. Dalam banyak kasus, suatu proses bertindak sebagai klien dan server karena mungkin mereferensikan beberapa antarmuka. Untuk rincian lebih lanjut tentang berbagai runtimes tersedia untuk menggunakan antarmuka ini, lihat AIDL backends . Deklarasi tipe ini persis seperti deklarasi kelas dalam bahasa tertentu, tetapi mereka bekerja di seluruh proses.

Bagaimana itu bekerja

AIDL menggunakan driver kernel binder untuk melakukan panggilan. Saat Anda melakukan panggilan, pengidentifikasi metode dan semua objek dikemas ke dalam buffer dan disalin ke proses jarak jauh di mana utas pengikat menunggu untuk membaca data. Setelah utas pengikat menerima data untuk transaksi, utas mencari objek rintisan asli dalam proses lokal, dan kelas ini membongkar data dan membuat panggilan pada objek antarmuka lokal. Objek antarmuka lokal ini adalah objek yang dibuat dan didaftarkan oleh proses server. Ketika panggilan dilakukan dalam proses yang sama dan backend yang sama, tidak ada objek proxy, dan panggilan langsung tanpa pengepakan atau pembongkaran.

Berinteraksi dengan layanan di perangkat

Android hadir dengan beberapa perintah untuk memungkinkan interaksi dengan layanan di perangkat. Mencoba:

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