1702ac6ca0
Replace relative paths with full AOSP https paths, so they work in contexts without the full Virtualization repo. Mention the linker script, which may be needed to generate the stub library. Bug: 259237660 Test: n/a Change-Id: Ifce9b91955c97a19c0227d8535d5313eb34c5714 |
||
---|---|---|
.. | ||
include | ||
include-restricted | ||
src | ||
stub | ||
Android.bp | ||
README.md | ||
libvm_payload.map.txt |
README.md
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 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.
Entry point
The payload should be packaged as one (or more) .so files inside the app's APK -
under the lib/<ABI>
directory, like other JNI code.
The primary .so, which is specified as part of the VM configuration via VirtualMachineConfig.Builder#setPayloadBinaryPath, must define the entry point for the payload.
This entry point is a C function called AVmPayload_main()
, as declared in
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.
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
for an example.
In other build systems a similar stub libvm_payload.so
can be built using
stub.c and the linker script.
Available NDK APIs
In addition to the VM Payload APIs, a small subset of the Android NDK can be used by the payload.
This subset consists of:
- The standard C library.
- The Logging APIs.
- The NdkBinder
API. However
note that the payload can only host a binder server via
AVmPayload_runVsockRpcServer
, defined in vm_payload.h, rather thanAServiceManager_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) or as a separate .so.
The same is true for other languages such as Rust.
See AIDL backends for information on using AIDL with the NDK Binder from C++.