AVF-совместимое приложение состоит из двух частей: часть приложения, работающая на хостовой ОС Android, и часть приложения, работающая на Microdroid внутри pVM.
Часть приложения, работающая на Android, реализует пользовательский интерфейс, неконфиденциальную бизнес-логику, а также создает жизненный цикл pVM и управляет им.
Часть приложения, работающая на Microdroid в pVM, отвечает за выполнение любых задач, которые необходимо выполнять безопасно.
Чтобы запустить часть вашего приложения, связанную с pVM, и взаимодействовать с ней, ваше хост-приложение создает pVM и запускает собственную общую библиотеку внутри pVM. Эта библиотека реализует службу связывания, которую хост-часть приложения использует для связи с частью приложения внутри pVM. На рис. 1 показаны две части приложения и канал связи связующего:
Настройте файл конфигурации
В вашем файле vm_config.json
должна быть запись об операционной системе и общей библиотеке pVM. В следующем файле assets/vm_config.json
показаны записи файла конфигурации для Microdroid и общей собственной библиотеки:
{
"os": {
"name": "microdroid"
},
"task": {
"type": "microdroid_launcher",
"command": MicrodroidTestNativeLib.so",
}
}
Реализация службы подшивки
В вашей общей библиотеке реализуйте службу подшивки. Например:
extern "C"
int android_native_main(int, char**) {
// Implement your binder service here
}
Создать код приложения
В хост-части вашего приложения создайте код, который подготавливает файл конфигурации, загружает (или создает) дескриптор виртуальной машины и запускает виртуальную машину. Например:
// Prepare the configuration file
VirtualMachineConfig config = new VirtualMachineConfig
.Builder(getApplication(), "assets/vm_config.json")
.build();
// Load (or create) the handle to a VM
VirtualMachine vm = VirtualMachineManager
.getInstance(getApplication())
.getOrCreate("my_vm", config);
// Run the VM
vm.run();
Общайтесь с виртуальной частью вашего приложения
Чтобы связаться с частью вашего приложения, связанной с виртуальной машиной, вы сначала регистрируете обратный вызов, чтобы получать уведомления, когда служба связывания на виртуальной машине будет готова. При получении уведомления вы подключаетесь к серверу связывания, а затем разговариваете с сервером, используя собственный интерфейс AIDL. Например:
// Register the callback
vm.setCallback(Executors.newSingleThreadExecutor(),
new VirtualmachineCallback() {
@Override
public void onPayloadReady(VirtualMachine vm) {
// Connect to the binder server
IBinder binder = vm.connectToVsockServer(PORT).get();
IMyService svc = IMyService.Stub.asInterface(binder);
// Talk with server using custom AIDL interface
Result res = svc.doSomething();
}
}); //exception handling & proper threading omitted
vm.run();
Чтобы загрузить исходный код демонстрационного приложения, демонстрирующего шаги, описанные в этом документе, обратитесь к MicrodroidDemo .