5 个版本
0.2.0 | 2023年8月10日 |
---|---|
0.1.4 | 2023年8月10日 |
0.1.3 | 2023年8月10日 |
0.1.2 | 2023年8月10日 |
0.1.1 | 2023年8月10日 |
#1410 in 开发工具
用于 3 个库
265KB
3.5K SLoC
安全 Rust 接口到 Android 的 libbinder
。
该包主要设计为 Rust AIDL 编译器后端的目标,通常不应直接由用户使用。它基于 binder NDK 库构建,以便 APEX 模块可以使用,因此仅公开 NDK 接口中的功能。
示例
以下示例说明了 AIDL 后端如何使用此包。
use binder::{
declare_binder_interface, Binder, IBinder, Interface, Remotable, Parcel, SpIBinder,
StatusCode, TransactionCode,
};
// Generated by AIDL compiler
pub trait ITest: Interface {
fn test(&self) -> binder::Result<String>;
}
// Creates a new local (native) service object, BnTest, and a remote proxy
// object, BpTest, that are the typed interfaces for their respective ends
// of the binder transaction. Generated by AIDL compiler.
declare_binder_interface! {
ITest["android.os.ITest"] {
native: BnTest(on_transact),
proxy: BpTest,
}
}
// Generated by AIDL compiler
fn on_transact(
service: &dyn ITest,
code: TransactionCode,
_data: &BorrowedParcel,
reply: &mut BorrowedParcel,
) -> binder::Result<()> {
match code {
SpIBinder::FIRST_CALL_TRANSACTION => {
reply.write(&service.test()?)?;
Ok(())
}
_ => Err(StatusCode::UNKNOWN_TRANSACTION),
}
}
// Generated by AIDL compiler
impl ITest for Binder<BnTest> {
fn test(&self) -> binder::Result<String> {
self.0.test()
}
}
// Generated by AIDL compiler
impl ITest for BpTest {
fn test(&self) -> binder::Result<String> {
let reply = self
.as_binder()
.transact(SpIBinder::FIRST_CALL_TRANSACTION, 0, |_| Ok(()))?;
reply.read()
}
}
// User implemented:
// Local implementation of the ITest remotable interface.
struct TestService;
impl Interface for TestService {}
impl ITest for TestService {
fn test(&self) -> binder::Result<String> {
Ok("testing service".to_string())
}
}
依赖关系
~0–2MB
~39K SLoC