Сбой приложения Android Kotlin с фатальным сигналом 6 (SIGABRT) при запуске на реальном устройстве

#android #android-fragments #crash #android-emulator #layout-inflater

#Android #android-фрагменты #сбой #android-эмулятор #компоновка-надуватель

Вопрос:

Мое приложение выходит из строя после возврата в onCreateView фрагмента. Трассировка стека, которую я получаю,:

 
D/MenuAtividadesFragment: onCreate: Cheguei no onCreate

D/MenuAtividadesFragment: onCreateView: Cheguei no On createView

I/zygote: Starting a blocking GC NativeAllocBlocking

D/skia: --- allocation failed for scaled bitmap

I/zygote: Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)

D/MenuAtividadesFragment: onViewCreated: Cheguei em On View Created

I/Choreographer: Skipped 1195 frames!  The application may be doing too much work on its main thread.

D/skia: external/skia/include/core/SkBitmap.h:282: fatal error: "sk_throw"

A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 11765 (.aplicativo_rdo), pid 11765 (.aplicativo_rdo)

Disconnected from the target VM, address: 'localhost:51879', transport: 'socket'
 

Он возвращает фатальный сигнал 6, но в настоящее время я только увеличиваю представление.

 package com.eim.rdoApplication.ui.fragment

import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.widget.AutoCompleteTextView
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.cardview.widget.CardView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.eim.rdoApplication.R
import com.eim.rdoApplication.data.model.entity.ActivityEntity
import com.eim.rdoApplication.data.model.entity.InstallationReportEntity
import com.eim.rdoApplication.data.model.openWeatherApi.CurrentLocationInformation
import com.eim.rdoApplication.ui.viewModel.DepartmentsMenuViewModel
import com.eim.rdoApplication.utils.GPSUtilsKotlin
import com.eim.rdoApplication.utils.Resource
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.collect
import kotlin.coroutines.CoroutineContext


private const val TAG = "MenuAtividadesFragment"
@AndroidEntryPoint
class HomeFragment:Fragment(), CoroutineScope, TryAgainNetworkListener {

    private val navController by lazy {
        findNavController()
    }
    lateinit var loadingImageView: ImageView
    lateinit var loadingBg: ImageView
    lateinit var autoCompleteTextView: AutoCompleteTextView
    lateinit var reportTitleTextView:TextView
    lateinit var rootView: View
    private val args: HomeFragmentArgs by navArgs()
    private val departmentsMenuViewModel:DepartmentsMenuViewModel by viewModels()
    lateinit var dialogFragment: NetworkErrorFragment
    private var job = Job()
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.IO   job

    private var installationsReports: List<InstallationReportEntity>?=null

    override fun onCreate(savedInstanceState: Bundle?) {
        departmentsMenuViewModel.installationReportId = args.installationReportId
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate: Cheguei no onCreate")
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
                Log.d(TAG, "onCreateView: Cheguei no On createView")
                rootView = inflater.inflate(
                    R.layout.fragment_new_home_screen_updated,
                    container,
                    false
                )
//                setupReloadButton()
//                setupLoadingViews()
//                getUserInformation()
//                setupCardViews()
//                setupWeather()
                return rootView
        }
 

По-видимому, причиной сбоя является только раздувание представления.

Еще одна интересная вещь заключается в том, что представление фрагмента может увеличиваться при запуске на виртуальном устройстве Android (Pixel 3 API 30), но сбой на реальном устройстве (Motorola G5S API 26).

Я был бы признателен, если бы кто-нибудь мог помочь мне найти причину этого.

[ОТРЕДАКТИРОВАНО] Итак, ребята, я установил LeakCanary, чтобы попытаться сузить возможную утечку памяти, и, оказывается, я приблизился к причине. Это отчет, который он мне дает:

 ====================================
    HEAP ANALYSIS RESULT
    ====================================
    1 APPLICATION LEAKS
    References underlined with "~~~" are likely causes.
    Learn more at https://squ.re/leaks.
    3054 bytes retained by leaking objects
    Signature: 108d5f2862bd8da48823273827314afbdcc2540
    ┬───
     GC Root: Local variable in native code
    
    ├─ android.os.HandlerThread instance
        Leaking: NO (PathClassLoader↓ is not leaking)
        Thread name: 'LeakCanary-Heap-Dump'
         HandlerThread.contextClassLoader
    ├─ dalvik.system.PathClassLoader instance
D/LeakCanary:     Leaking: NO (InternalLeakCanary↓ is not leaking and A ClassLoader is never leaking)
         PathClassLoader.runtimeInternalObjects
    ├─ java.lang.Object[] array
        Leaking: NO (InternalLeakCanary↓ is not leaking)
         Object[].[616]
    ├─ leakcanary.internal.InternalLeakCanary class
        Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
         static InternalLeakCanary.resumedActivity
    ├─ com.eim.rdoApplication.ui.activity.MainActivity instance
        Leaking: NO (NavHostFragment↓ is not leaking and Activity#mDestroyed is false)
        mApplication instance of com.eim.rdoApplication.AppAplication
        mBase instance of androidx.appcompat.view.ContextThemeWrapper, not wrapping known Android context
         MainActivity.mFragments
    ├─ androidx.fragment.app.FragmentController instance
        Leaking: NO (NavHostFragment↓ is not leaking)
         FragmentController.mHost
    ├─ androidx.fragment.app.FragmentActivity$HostCallbacks instance
        Leaking: NO (NavHostFragment↓ is not leaking)
        this$0 instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
        mActivity instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
        mContext instance of com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
         FragmentActivity$HostCallbacks.mFragmentManager
    ├─ androidx.fragment.app.FragmentManagerImpl instance
        Leaking: NO (NavHostFragment↓ is not leaking)
         FragmentManagerImpl.mPrimaryNav
    ├─ androidx.navigation.fragment.NavHostFragment instance
        Leaking: NO (LoginFragment↓ is not leaking and Fragment#mFragmentManager is not null)
         NavHostFragment.mChildFragmentManager
    ├─ androidx.fragment.app.FragmentManagerImpl instance
D/LeakCanary:     Leaking: NO (LoginFragment↓ is not leaking)
         FragmentManagerImpl.mFragmentStore
    ├─ androidx.fragment.app.FragmentStore instance
        Leaking: NO (LoginFragment↓ is not leaking)
         FragmentStore.mActive
    ├─ java.util.HashMap instance
        Leaking: NO (LoginFragment↓ is not leaking)
         HashMap.table
    ├─ java.util.HashMap$Node[] array
        Leaking: NO (LoginFragment↓ is not leaking)
         HashMap$Node[].[0]
    ├─ java.util.HashMap$Node instance
        Leaking: NO (LoginFragment↓ is not leaking)
         HashMap$Node.value
    ├─ androidx.fragment.app.FragmentStateManager instance
        Leaking: NO (LoginFragment↓ is not leaking)
         FragmentStateManager.mFragment
    ├─ com.eim.rdoApplication.ui.fragment.login.LoginFragment instance
        Leaking: NO (Fragment#mFragmentManager is not null)
        componentContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper,
        wrapping activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
         LoginFragment.loadingBg
                        ~~~~~~~~~
    ├─ androidx.appcompat.widget.AppCompatImageView instance
        Leaking: UNKNOWN
        Retaining 2801 bytes in 23 objects
        View not part of a window view hierarchy
        View.mAttachInfo is null (view detached)
D/LeakCanary:     View.mID = R.id.imageView_loading_bg
        View.mWindowAttachCount = 1
        mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
        activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
         AppCompatImageView.mParent
                             ~~~~~~~
    ╰→ androidx.constraintlayout.widget.ConstraintLayout instance
         Leaking: YES (ObjectWatcher was watching this because com.eim.rdoApplication.ui.fragment.login.LoginFragment
         received Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks))
         Retaining 3054 bytes in 52 objects
         key = 0ab7649b-62de-4b19-a9c6-7c9cf02b88a5
         watchDurationMillis = 142488
         retainedDurationMillis = 137486
         View not part of a window view hierarchy
         View.mAttachInfo is null (view detached)
         View.mWindowAttachCount = 1
         mContext instance of dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper, wrapping
         activity com.eim.rdoApplication.ui.activity.MainActivity with mDestroyed = false
 

Я получил этот отчет, но я не совсем понимаю, как его решить или что я делаю не так

Комментарии:

1. Поделитесь своим xml

Ответ №1:

Я думаю, я выяснил, что вызвало фатальную ошибку. Я установил LeakCanary и получил трассировку выше. После копания в трассировке, из того, что я мог понять, оказалось, что я сохранял ссылку внутри фрагмента A на некоторые представления. Затем, когда я переходил от фрагмента A к следующему фрагменту, я неправильно очищал ссылки на представления. Это было исправлено путем установки значения null для этой ссылки в методе onDestroyView() фрагмента A.