Утечка памяти windowonbackinvokeddispatcher $ onbackinvokedcallbackwrapper in inputmethodservice ondestroy () Android 14Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Утечка памяти windowonbackinvokeddispatcher $ onbackinvokedcallbackwrapper in inputmethodservice ondestroy () Android 14

Сообщение Anonymous »

Я реализовал пользовательскую программную клавиатуру с использованием Compose для создания части пользовательского интерфейса и inputmethodservice () для взаимодействия функции IME. < /p>
он работает так же, как и ожидалось. Тем не менее, утечка памяти windowonbackinvokeddispatcher $ onbackinvokedcallbackwrapper появляется при изменении ориентации экрана или переключения на другую мягкую клавиатуру с реализованной и наоборот. Это происходит только на Android API 34 на физических устройствах, таких как Motorola Edge 40 Pro, Motorola Edge 30 Neo и Samsung Galaxy S24. Кроме того, эта утечка воспроизводит эмуляторы Android: Intel X86_64 Система Atom Image API 34, Google APIS Intel X86_64 Изображение системы атома 34. Я заметил интересное поведение в Image Image System Intel X86_64 API 35 и Google APIS Intel X86_64 ATOM -Image API 35, где на основе какого -то LeaKanary. Но через несколько секунд сообщение изменилось на «Все оставшиеся объекты были собраны мусором». И эмуляторы Android: Intel X86_64 Atom System Image API 33, Google APIS Intel X86_64 ATOM System Image API 33, Google Play Intel X86_64 ATOM System Image API 33, Google Play Intel X86_64 Atom System Image API 34, Google Play Intel X86_64 ATEM ATOM API 35. < /P> P> P> P> PRIEL System Image Image 35. P> P> P> P> P> PREA -PRIEL Image Image 34. трассировка: < /p>
====================================
HEAP ANALYSIS RESULT
====================================
1 APPLICATION LEAKS

References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.

299455 bytes retained by leaking objects
Signature: 680efbf9ebebd6f8946131812c75d1798f996c35
┬───
│ GC Root: Global variable in native code

├─ android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper instance
│ Leaking: UNKNOWN
│ Retaining 300.0 kB in 6630 objects
│ WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper is a binder stub. Binder stubs will often be retained
│ long after the associated activity or service is destroyed, as by design stubs are retained until the other side
│ gets GCed. If WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper is not a *static* inner class then that's
│ most likely the root cause of this leak. Make it static. If
│ WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper is an Android Framework class, file a ticket here:
https://issuetracker.google.com/issues/ ... ent=192705
│ ↓ WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper.mCallbackRef
│ ~~~~~~~~~~~~
├─ android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef instance
│ Leaking: UNKNOWN
│ Retaining 299.5 kB in 6629 objects
│ ↓ WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef.mStrongRef
│ ~~~~~~~~~~
├─ android.inputmethodservice.InputMethodService$$ExternalSyntheticLambda3 instance
│ Leaking: UNKNOWN
│ Retaining 299.5 kB in 6628 objects
│ f$0 instance of com.example.customsoftkeyboard.service.IMEHexadecimalService
│ ↓ InputMethodService$$ExternalSyntheticLambda3.f$0
│ ~~~
╰→ com.example.customsoftkeyboard.service.IMEHexadecimalService instance
​ Leaking: YES (ObjectWatcher was watching this because com.example.customsoftkeyboard.service.
​ IMEHexadecimalService received Service#onDestroy() callback and Service not held by ActivityThread)
​ Retaining 299.5 kB in 6627 objects
​ key = 81bcf4b0-11cc-407a-b4e5-66622602a44c
​ watchDurationMillis = 8244
​ retainedDurationMillis = 3242
​ mApplication instance of com.example.customsoftkeyboard.CustomSoftKeyboardApplication
​ mBase instance of android.app.ContextImpl
====================================
0 LIBRARY LEAKS

A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over.
See https://square.github.io/leakcanary/fun ... zing-leaks
====================================
0 UNREACHABLE OBJECTS

An unreachable object is still in memory but LeakCanary could not find a strong reference path
from GC roots.
====================================
METADATA

Please include this in bug reports and Stack Overflow questions.

Build.VERSION.SDK_INT: 34
Build.MANUFACTURER: unknown
LeakCanary version: 3.0-alpha-8
App process name: com.example.customsoftkeyboard
Class count: 30515
Instance count: 205029
Primitive array count: 147949
Object array count: 28315
Thread count: 22
Heap total bytes: 29012550
Bitmap count: 6
Bitmap total bytes: 31110
Large bitmap count: 0
Large bitmap total bytes: 0
Stats: LruCache[maxSize=3000,hits=106811,misses=137464,hitRate=43%]
RandomAccess[bytes=7127807,reads=137464,travel=54128216187,range=34936098,size=43515825]
Analysis duration: 16250 ms
Heap dump file path: /storage/emulated/0/Download/leakcanary-com.example.customsoftkeyboard/2025-03-13_16-40-15_225.
hprof
Heap dump timestamp: 1741884036842
Heap dump duration: Unknown
====================================
< /code>
imehexadecimalservice код: < /p>
import android.inputmethodservice.InputMethodService
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.savedstate.SavedStateRegistry
import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.example.customsoftkeyboard.view.ComposeHexadecimalKeyBoardView

class IMEHexadecimalService : InputMethodService(), LifecycleOwner,
SavedStateRegistryOwner {

private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)

override val lifecycle: Lifecycle
get() = lifecycleRegistry

private val savedStateRegistryController = SavedStateRegistryController.create(this)

override val savedStateRegistry: SavedStateRegistry
get() = savedStateRegistryController.savedStateRegistry

override fun onCreateInputView(): View {
window?.window?.decorView?.let { decorView ->
decorView.setViewTreeLifecycleOwner(this)
decorView.setViewTreeSavedStateRegistryOwner(this)
}
return ComposeHexadecimalKeyBoardView(this)
}

override fun onCreate() {
super.onCreate()
savedStateRegistryController.performRestore(null)
handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
}

override fun onDestroy() {
super.onDestroy()
handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
}

private fun handleLifecycleEvent(event: Lifecycle.Event) =
lifecycleRegistry.handleLifecycleEvent(event)
}
< /code>
Похоже, что это интересное поведение подключено к Android Framework. Существует аналогичная проблема с этой утечкой WindowonBackInvokedDispatcher $ onbackinvokedcallbackwrapper https://issuetracker.google.com/issues/229007483
Я буду признателен за любую информацию или идеи о том, как исправить эту липку памяти. Спасибо за внимание!

Подробнее здесь: https://stackoverflow.com/questions/795 ... -in-inputm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»