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++ یا زبان دیگری استفاده کردند. به دانشآموزان توضیح دهید که چرا هر مرحله لازم است.
- نمونهای از نوع سرویس خود (
BirthdayService
) ایجاد کنید. - این service object را در
Bn*
type مربوطه قرار دهید (در این مورد،BnBirthdayService
). این نوع توسط Binder تولید میشود و عملکرد رایج Binder را ارائه میکند که توسط کلاس پایهBnBinder
در C++ ارائه میشود. ما در Rust ارثبری یا inheritance نداریم، بنابراین در عوض از ترکیب composition میکنیم وBirthdayService
خود را درBnBinderService
تولید شده قرار میدهیم. -
add_service
را فراخوانی کنید و به آن یک شناسه سرویس و شی سرویس خود بدهید (شی «BnBirthdayService» در مثال). -
join_thread_pool
را فراخوانی کنید تا thread فعلی را به Binder thread اضافه کنید و شروع به گوش دادن برای connectionها کنید.