Reuse Binder connection for VirtualizationService
RpcSession can leak threads if not properly shut down. This is being
fixed in a different bug/CL, but we can also avoid this problem by
reusing one RpcSession for multiple connections to the same virtmgr
server.
Bug: 269731051
Bug: 271830568
Test: atest MicrodroidTestApp
Change-Id: I232ec3893c34abcc5aaa3a07e69ce479df76fb0d
diff --git a/javalib/src/android/system/virtualmachine/VirtualMachine.java b/javalib/src/android/system/virtualmachine/VirtualMachine.java
index 5f39b1c..7713faf 100644
--- a/javalib/src/android/system/virtualmachine/VirtualMachine.java
+++ b/javalib/src/android/system/virtualmachine/VirtualMachine.java
@@ -459,7 +459,7 @@
}
}
- IVirtualizationService service = vm.mVirtualizationService.connect();
+ IVirtualizationService service = vm.mVirtualizationService.getBinder();
try {
service.initializeWritablePartition(
@@ -785,7 +785,7 @@
throw new VirtualMachineException("Failed to create APK signature file", e);
}
- IVirtualizationService service = mVirtualizationService.connect();
+ IVirtualizationService service = mVirtualizationService.getBinder();
try {
if (mVmOutputCaptured) {
diff --git a/javalib/src/android/system/virtualmachine/VirtualizationService.java b/javalib/src/android/system/virtualmachine/VirtualizationService.java
index c3f2ba3..1cf97b5 100644
--- a/javalib/src/android/system/virtualmachine/VirtualizationService.java
+++ b/javalib/src/android/system/virtualmachine/VirtualizationService.java
@@ -41,6 +41,9 @@
*/
private final ParcelFileDescriptor mClientFd;
+ /* Persistent connection to IVirtualizationService. */
+ private final IVirtualizationService mBinder;
+
private static native int nativeSpawn();
private native IBinder nativeConnect(int clientFd);
@@ -57,15 +60,18 @@
throw new VirtualMachineException("Could not spawn VirtualizationService");
}
mClientFd = ParcelFileDescriptor.adoptFd(clientFd);
- }
- /* Connects to the VirtualizationService AIDL service. */
- public IVirtualizationService connect() throws VirtualMachineException {
IBinder binder = nativeConnect(mClientFd.getFd());
if (binder == null) {
throw new VirtualMachineException("Could not connect to VirtualizationService");
}
- return IVirtualizationService.Stub.asInterface(binder);
+ mBinder = IVirtualizationService.Stub.asInterface(binder);
+ }
+
+ /* Returns the IVirtualizationService binder. */
+ @NonNull
+ IVirtualizationService getBinder() {
+ return mBinder;
}
/*