README.md
1# VM Payload API
2
3This directory contains the definition of the VM Payload API. This is a native
4API, exposed as a set of C functions, available to payload code running inside a
5[Microdroid](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/build/microdroid/README.md)
6VM.
7
8Note that only native code is supported in Microdroid, so no Java APIs are
9available in the VM, and only 64 bit code is supported.
10
11To create a VM and run the payload from Android see the [AVF Java
12APIs](../framework-virtualization/README.md).
13
14## Entry point
15
16The payload should be packaged as one (or more) .so files inside the app's APK -
17under the `lib/<ABI>` directory, like other JNI code.
18
19The primary .so, which is specified as part of the VM configuration via
20[VirtualMachineConfig.Builder#setPayloadBinaryPath](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/libs/framework-virtualization/src/android/system/virtualmachine/VirtualMachineConfig.java),
21must define the entry point for the payload.
22
23This entry point is a C function called `AVmPayload_main()`, as declared in
24[vm_main.h](include/vm_main.h). (In C++ this must be defined as `extern "C"`.)
25
26## API header
27
28The functions available to the payload once it starts are declared in
29[vm_payload.h](include/vm_payload.h).
30
31### Linking
32
33In the Android build system, the payload binary should be built with
34`libvm_payload#current` specified as one of the `shared_libs`; this links
35against a stub `libvm_payload.so`, where the dependencies will be satisfied at
36runtime from the real `libvm_payload.so` hosted within the Microdroid VM.
37
38See `MicrodroidTestNativeLib` in the [test
39APK](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/tests/testapk/Android.bp)
40for an example.
41
42In other build systems a similar stub `libvm_payload.so` can be built using
43[stub.c](stub/stub.c) and the [linker script](libvm_payload.map.txt).
44
45## Available NDK APIs
46
47In addition to the VM Payload APIs, a small subset of the [Android
48NDK](https://developer.android.com/ndk) can be used by the payload.
49
50This subset consists of:
51- The [standard C library](https://developer.android.com/ndk/guides/stable_apis#c_library).
52- The [Logging APIs](https://developer.android.com/ndk/guides/stable_apis#logging).
53- The [NdkBinder
54 API](https://developer.android.com/ndk/reference/group/ndk-binder). However
55 note that the payload can only host a binder server via
56 `AVmPayload_runVsockRpcServer`, defined in
57 [vm_payload.h](include/vm_payload.h), rather than
58 `AServiceManager_addService`, and cannot connect to any binder server. Passing
59 file descriptors to and from the VM is not supported.
60
61## C++
62
63C++ can be used, but you will need to include the C++ runtime in your APK along
64with your payload, either statically linked (if
65[appropriate](https://developer.android.com/ndk/guides/cpp-support#sr)) or as a
66separate .so.
67
68The same is true for other languages such as Rust.
69
70See [AIDL
71backends](https://source.android.com/docs/core/architecture/aidl/aidl-backends)
72for information on using AIDL with the NDK Binder from C++.
73
74## Rust
75
76A Rust wrapper library for the VM Payload API is available (as an rlib) for VM
77payloads written in Rust.
78
79This wrapper is not guaranteed to be stable; we may change it in future
80versions. But payload code built using it will depend only on the C VM Payload
81API and the NDK APIs that are available to the payload, so should run unchanged
82on future versions.
83
84See [wrapper/lib.rs](wrapper/lib.rs) and `libvm_payload_rs` in
85[Android.bp](Android.bp).
86