# VM Payload API This directory contains the definition of the VM Payload API. This is a native API, exposed as a set of C functions, available to payload code running inside a [Microdroid](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/master/microdroid/README.md) VM. Note that only native code is supported in Microdroid, so no Java APIs are available in the VM, and only 64 bit code is supported. To create a VM and run the payload from Android, see [android.system.virtualmachine.VirtualMachineManager](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/master/javalib/src/android/system/virtualmachine/VirtualMachineManager.java). ## Entry point The payload should be packaged as one (or more) .so files inside the app's APK - under the `lib/` directory, like other JNI code. The primary .so, which is specified as part of the VM configuration via [VirtualMachineConfig.Builder#setPayloadBinaryPath](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/master/javalib/src/android/system/virtualmachine/VirtualMachineConfig.java), must define the entry point for the payload. This entry point is a C function called `AVmPayload_main()`, as declared in [vm_main.h](include/vm_main.h). (In C++ this must be defined as `extern "C"`.) ## API header The functions available to the payload once it starts are declared in [vm_payload.h](include/vm_payload.h). ### Linking In the Android build system, the payload binary should be built with `libvm_payload#current` specified as one of the `shared_libs`; this links against a stub `libvm_payload.so`, where the dependencies will be satisfied at runtime from the real `libvm_payload.so` hosted within the Microdroid VM. See `MicrodroidTestNativeLib` in the [test APK](https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/master/tests/testapk/Android.bp) for an example. In other build systems a similar stub `libvm_payload.so` can be built using [stub.c](stub/stub.c) and the [linker script](libvm_payload.map.txt). ## Available NDK APIs In addition to the VM Payload APIs, a small subset of the [Android NDK](https://developer.android.com/ndk) can be used by the payload. This subset consists of: - The [standard C library](https://developer.android.com/ndk/guides/stable_apis#c_library). - The [Logging APIs](https://developer.android.com/ndk/guides/stable_apis#logging). - The [NdkBinder API](https://developer.android.com/ndk/reference/group/ndk-binder). However note that the payload can only host a binder server via `AVmPayload_runVsockRpcServer`, defined in [vm_payload.h](include/vm_payload.h), rather than `AServiceManager_addService`, and cannot connect to any binder server. Passing file descriptors to and from the VM is not supported. ## C++ C++ can be used, but you will need to include the C++ runtime in your APK along with your payload, either statically linked (if [appropriate](https://developer.android.com/ndk/guides/cpp-support#sr)) or as a separate .so. The same is true for other languages such as Rust. See [AIDL backends](https://source.android.com/docs/core/architecture/aidl/aidl-backends) for information on using AIDL with the NDK Binder from C++.