# AIDL Server

Finally, we can create a server which exposes the service:

_birthday_service/src/server.rs_:

```rust,ignore
{{#include ../birthday_service/src/server.rs:main}}
```

_birthday_service/Android.bp_:

```javascript
{{#include ../birthday_service/Android.bp:birthday_server}}
```

<details>

The process for taking a user-defined service implementation (in this case the
`BirthdayService` type, which implements the `IBirthdayService`) and starting it
as a Binder service has multiple steps, and may appear more complicated than
students are used to if they've used Binder from C++ or another language.
Explain to students why each step is necessary.

1. Create an instance of your service type (`BirthdayService`).
1. Wrap the service object in corresponding `Bn*` type (`BnBirthdayService` in
   this case). This type is generated by Binder and provides the common Binder
   functionality that would be provided by the `BnBinder` base class in C++. We
   don't have inheritance in Rust, so instead we use composition, putting our
   `BirthdayService` within the generated `BnBinderService`.
1. Call `add_service`, giving it a service identifier and your service object
   (the `BnBirthdayService` object in the example).
1. Call `join_thread_pool` to add the current thread to Binder's thread pool and
   start listening for connections.

</details>
