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. }

Speaker Notes

فرآیند اجرای یک سرویس تعریف‌شده توسط کاربر (در این مورد نوع 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ها کنید.