AIDL Server

در نهایت، می توانیم سروری ایجاد کنیم که سرویس را expose می‌کند:

birthday_service/src/server.rs:

//! Birthday service.
use birthdayservice::BirthdayService;
use com_example_birthdayservice::aidl::com::example::birthdayservice::IBirthdayService::BnBirthdayService;
use com_example_birthdayservice::binder;

const SERVICE_IDENTIFIER: &str = "birthdayservice";

/// Entry point for birthday service.
fn main() {
    let birthday_service = BirthdayService;
    let birthday_service_binder = BnBirthdayService::new_binder(
        birthday_service,
        binder::BinderFeatures::default(),
    );
    binder::add_service(SERVICE_IDENTIFIER, birthday_service_binder.as_binder())
        .expect("Failed to register service");
    binder::ProcessState::join_thread_pool()
}

birthday_service/Android.bp:

rust_binary {
    name: "birthday_server",
    crate_name: "birthday_server",
    srcs: ["src/server.rs"],
    rustlibs: [
        "com.example.birthdayservice-rust",
        "libbinder_rs",
        "libbirthdayservice",
    ],
    prefer_rlib: true, // To avoid dynamic link error.
}

فرآیند اجرای یک سرویس تعریف‌شده توسط کاربر (در این مورد نوع BirthdayService که IBirthdayService را پیاده‌سازی می‌کند) و شروع آن به‌عنوان یک سرویس Binder چند مرحله دارد و ممکن است پیچیده‌تر از آنچه دانش‌آموزان به آن عادت کرده‌اند به نظر برسد. اگر آن‌ها از Binder برای C++ یا زبان دیگری استفاده کردند. به دانش‌آموزان توضیح دهید که چرا هر مرحله لازم است.

  1. نمونه‌ای از نوع سرویس خود (BirthdayService) ایجاد کنید.
  2. این service object را در Bn* type مربوطه قرار دهید (در این مورد،BnBirthdayService). این نوع توسط Binder تولید می‌شود و عملکرد رایج Binder را ارائه می‌کند که توسط کلاس پایه BnBinder در C++ ارائه می‌شود. ما در Rust ارث‌بری یا inheritance نداریم، بنابراین در عوض از ترکیب composition می‌کنیم و BirthdayService خود را در BnBinderService تولید شده قرار می‌دهیم.
  3. add_service را فراخوانی کنید و به آن یک شناسه سرویس و شی‏ سرویس خود بدهید (شی‏ «BnBirthdayService» در مثال).
  4. join_thread_pool را فراخوانی کنید تا thread فعلی را به Binder thread اضافه کنید و شروع به گوش دادن برای connectionها کنید.