Add setDisplayService and waitDisplayService in IVirtualizationServiceInternal
In normal app context, it cannot add a service into service manager, so
add something similar into VirtualizationServiceInternal.
Bug: 331708504
Test: check if the display shows
Change-Id: I895e6a8affe3bc4e9de6bea226ebc40a7fcf7a0d
diff --git a/libs/android_display_backend/Android.bp b/libs/android_display_backend/Android.bp
index f818951..6ad5fab 100644
--- a/libs/android_display_backend/Android.bp
+++ b/libs/android_display_backend/Android.bp
@@ -37,11 +37,12 @@
srcs: [
"crosvm_android_display_client.cpp",
],
- stl: "libc++_static",
whole_static_libs: [
"libcrosvm_android_display_service-ndk",
+ "android.system.virtualizationservice_internal-ndk",
+ "android.system.virtualizationcommon-ndk",
+ "android.system.virtualizationservice-ndk",
"libyuv",
- "libc++_static",
],
shared_libs: [
"libbinder_ndk",
diff --git a/libs/android_display_backend/crosvm_android_display_client.cpp b/libs/android_display_backend/crosvm_android_display_client.cpp
index 91412af..6737453 100644
--- a/libs/android_display_backend/crosvm_android_display_client.cpp
+++ b/libs/android_display_backend/crosvm_android_display_client.cpp
@@ -15,6 +15,7 @@
*/
#include <aidl/android/crosvm/BnCrosvmAndroidDisplayService.h>
+#include <aidl/android/system/virtualizationservice_internal/IVirtualizationServiceInternal.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <android/native_window.h>
@@ -28,6 +29,8 @@
#include <mutex>
#include <vector>
+using aidl::android::system::virtualizationservice_internal::IVirtualizationServiceInternal;
+
#define LIBEXPORT __attribute__((visibility("default"))) extern "C"
typedef void (*android_display_log_callback_type)(const char* message);
@@ -104,9 +107,16 @@
strlen(name));
return nullptr;
}
+ ::ndk::SpAIBinder binder(
+ AServiceManager_waitForService("android.system.virtualizationservice"));
- auto status = AServiceManager_addService(service->asBinder().get(), name);
- if (status != STATUS_OK) {
+ auto virt_service = IVirtualizationServiceInternal::fromBinder(binder);
+ if (virt_service == nullptr) {
+ ErrorF(error_callback, "Failed to find android.system.virtualizationservice");
+ return nullptr;
+ }
+ auto status = virt_service->setDisplayService(service->asBinder());
+ if (!status.isOk()) {
ErrorF(error_callback, "Failed to register %s",
aidl::android::crosvm::ICrosvmAndroidDisplayService::descriptor);
return nullptr;