Merge "Session Memory Leak - Weak Ref in FieldClassificationRequest" into udc-dev

This commit is contained in:
Haoran Zhang
2023-06-16 19:45:19 +00:00
committed by Android (Google) Code Review
3 changed files with 35 additions and 2 deletions

View File

@@ -46,6 +46,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.server.utils.Slogf;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
@@ -319,6 +320,13 @@ public final class Helper {
return context.createDisplayContext(display);
}
static <T> @Nullable T weakDeref(WeakReference<T> weakRef, String tag, String prefix) {
T deref = weakRef.get();
if (deref == null) {
Slog.wtf(tag, prefix + "fail to deref " + weakRef);
}
return deref;
}
private interface ViewNodeFilter {
boolean matches(ViewNode node);

View File

@@ -44,6 +44,8 @@ import android.util.Slog;
import com.android.internal.infra.AbstractRemoteService;
import com.android.internal.infra.ServiceConnector;
import java.lang.ref.WeakReference;
/**
* Class responsible for connection with the Remote {@link FieldClassificationService}.
* This class is instantiated when {@link AutofillManagerServiceImpl} is established.
@@ -133,7 +135,8 @@ final class RemoteFieldClassificationService
}
public void onFieldClassificationRequest(@NonNull FieldClassificationRequest request,
FieldClassificationServiceCallbacks fieldClassificationServiceCallbacks) {
WeakReference<FieldClassificationServiceCallbacks>
fieldClassificationServiceCallbacksWeakRef) {
final long startTime = SystemClock.elapsedRealtime();
if (sVerbose) {
Slog.v(TAG, "onFieldClassificationRequest request:" + request);
@@ -170,6 +173,15 @@ final class RemoteFieldClassificationService
Slog.d(TAG, "onSuccess " + msg);
}
}
FieldClassificationServiceCallbacks
fieldClassificationServiceCallbacks =
Helper.weakDeref(
fieldClassificationServiceCallbacksWeakRef,
TAG, "onSuccess "
);
if (fieldClassificationServiceCallbacks == null) {
return;
}
fieldClassificationServiceCallbacks
.onClassificationRequestSuccess(response);
}
@@ -180,6 +192,15 @@ final class RemoteFieldClassificationService
if (sDebug) {
Slog.d(TAG, "onFailure");
}
FieldClassificationServiceCallbacks
fieldClassificationServiceCallbacks =
Helper.weakDeref(
fieldClassificationServiceCallbacksWeakRef,
TAG, "onFailure "
);
if (fieldClassificationServiceCallbacks == null) {
return;
}
fieldClassificationServiceCallbacks
.onClassificationRequestFailure(0, null);
}

View File

@@ -850,8 +850,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
RemoteFieldClassificationService remoteFieldClassificationService =
mService.getRemoteFieldClassificationServiceLocked();
if (remoteFieldClassificationService != null) {
WeakReference<RemoteFieldClassificationService.FieldClassificationServiceCallbacks>
fieldClassificationServiceCallbacksWeakRef =
new WeakReference<>(Session.this);
remoteFieldClassificationService.onFieldClassificationRequest(
mClassificationState.mPendingFieldClassificationRequest, Session.this);
mClassificationState.mPendingFieldClassificationRequest,
fieldClassificationServiceCallbacksWeakRef);
}
mClassificationState.onFieldClassificationRequestSent();
}