Клиент AIDL
Наконец, мы можем создать клиент Rust для нашего нового сервиса.
birthday_service/src/client.rs:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use com_example_birthdayservice::aidl::com::example::birthdayservice::IBirthdayService::IBirthdayService;
use com_example_birthdayservice::binder;
const SERVICE_IDENTIFIER: &str = "birthdayservice";
/// Вызвать сервис дня рождения.
fn main() -> Result<(), Box<dyn Error>> {
let name = std::env::args().nth(1).unwrap_or_else(|| String::from("Борис"));
let years = std::env::args()
.nth(2)
.and_then(|arg| arg.parse::<i32>().ok())
.unwrap_or(42);
binder::ProcessState::start_thread_pool();
let service = binder::get_interface::<dyn IBirthdayService>(SERVICE_IDENTIFIER)
.map_err(|_| "Failed to connect to BirthdayService")?;
// Вызвать сервис.
let msg = service.wishHappyBirthday(&name, years)?;
println!("{msg}");
}
birthday_service/Android.bp:
rust_binary {
name: "birthday_client",
crate_name: "birthday_client",
srcs: ["src/client.rs"],
rustlibs: [
"com.example.birthdayservice-rust",
],
prefer_rlib: true, // Чтобы избежать ошибки динамической линковки.
}
Обратите внимание, что клиент не зависит от libbirthdayservice.
Соберите, загрузите и запустите клиент на устройстве:
m birthday_client
adb push "$ANDROID_PRODUCT_OUT/system/bin/birthday_client" /data/local/tmp
adb shell /data/local/tmp/birthday_client Charlie 60
Happy Birthday Charlie, congratulations with the 60 years!
Strong<dyn IBirthdayService>— объект трейта, который представляет сервис, к которому подключился клиент.Strong— пользовательский умный указатель для Binder. Он отвечает и за счётчик ссылок объекта трейта внутри процесса, и за глобальный счётчик ссылок Binder, который отслеживает, сколько процессов имеют ссылку на объект.- Обратите внимание, что объект трейта, который клиент использует для общения с сервисом, использует тот же самый трейт, который реализует сервер. Для данного интерфейса Binder генерируется один трейт Rust, который используют и клиент, и сервер.
- Используйте тот же идентификатор сервиса, что и при регистрации сервиса. В идеале он должен быть определён в общем крейте, от которого зависят и клиент, и сервер.