내 누출 탐지 도구는 LG 폰에서 정기적으로 같은 누출 신고 API19을 실행, LG L40 장치에서 테스트되었습니다 제조사 전용 API를 변경하려면
object com.squareup.SomeActivity
`-mContext of object android.widget.EditText
`-mView of object android.widget.BubblePopupHelper
`-sHelper of class android.widget.BubblePopupHelper
후드 안드로이드 SDK의 이것은 LG가 도입 한 메모리 누수입니다.
내가 모을 수있는 것으로부터, 초점을 맞춘 EditText는 해당 BubblePopupHelper를 사용하여 복사/붙여 넣기 팝업이나 텍스트 핸들을 표시합니다. 한 번에 하나의 포커스 만 편집 할 수 있기 때문에 도우미를 싱글 톤으로 만들고 최신 편집 텍스트에 대한 참조를 유지합니다.
그래서 전체 활동 &은 다른 편집 텍스트에 초점이 맞춰질 때까지 전체보기 계층 구조가 누설됨을 의미합니다.
어떻게 해결할 수 있습니까? 안타깝게도 이것은 SDK 코드이므로 LG의 향후 릴리스에서 수정 될 수 있지만 버그가있는 사용자가 항상있을 것입니다.
이 버그는 분명히 당신 잘못이 아니지만 여전히 메모리 누수로 인해 OutOfMemory 오류가 증가 할 수 있습니다. 따라서 문제를 해결해 보는 것이 좋습니다.
방법이 있지만 꽤 좋지 않습니다. 활동이 파괴되면 반사를 사용하여 누설을 제거 할 수 있습니다. 예를 들어, 한 가지 방법으로 sHelper 필드를 지우거나 다른 하나는 도우미에서 mView 필드를 지울 수 있습니다. 어느 쪽이든, 장치에서 시도해야합니다 (지금 당장 가지고 있지 않습니다).
private static final Executor backgroundExecutor =
newCachedThreadPool(backgroundThreadFactory("android-leaks"));
public static void fixLGBubblePopupHelper(final Application application) {
backgroundExecutor.execute(new Runnable() {
@Override public void run() {
final Field sHelperField;
try {
Class<?> bubbleClass = Class.forName("android.widget.BubblePopupHelper");
sHelperField = bubbleClass.getDeclaredField("sHelper");
sHelperField.setAccessible(true);
} catch (Exception ignored) {
// We have no guarantee that this class/field exists.
return;
}
application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacksAdapter() {
@Override public void onActivityDestroyed(Activity activity) {
try {
sHelperField.set(null, null);
} catch (IllegalAccessException ignored) {
}
}
});
}
});
}
오늘 나는 또한 API19가있는 LG 기기에서이 사실을 발견했습니다. @Blackbelt 이것은 활동이 파괴되어 가비지 수집을해야했기 때문에 확실히 누수입니다. 그러나이 정적 필드로 인해 힙에 활성 상태로 유지됩니다. 제 경우에는 힙 덤프를 만들기 전에 간단하고 작은 활동을 열었으므로 다른 활동의 누출을 쉽게 식별 할 수있었습니다. – dsh