#android #ipc #android-ndk #binder #interface #bindings #service

binder_ndk

Rust 为 Android 的 Binder IPC 机制提供的绑定

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 个库

Apache-2.0 协议

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