민프

[Flutter Error] Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwner", java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ProcessLifecycleOwner; 본문

[Flutter Error]

[Flutter Error] Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwner", java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ProcessLifecycleOwner;

민프야 2023. 12. 27. 10:17

결론적으로 아래 라이브러리를 dependencies에 넣어줌으로써 해결하였습니다.

dependencies {
    implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}

 

 

본론으로 들어가보면

E/AndroidRuntime( 7998): java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ProcessLifecycleOwner;
E/AndroidRuntime( 7998): 	at com.google.mlkit.acceleration.internal.zzi.run(com.google.mlkit:acceleration@@16.0.0-beta1:1)
E/AndroidRuntime( 7998): 	at android.os.Handler.handleCallback(Handler.java:938)
E/AndroidRuntime( 7998): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 7998): 	at android.os.Looper.loopOnce(Looper.java:226)
E/AndroidRuntime( 7998): 	at android.os.Looper.loop(Looper.java:313)
E/AndroidRuntime( 7998): 	at android.app.ActivityThread.main(ActivityThread.java:8663)
E/AndroidRuntime( 7998): 	at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 7998): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
E/AndroidRuntime( 7998): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
E/AndroidRuntime( 7998): Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwner" on path: DexPathList[[zip file "/data/app/~~k66WFjUZOCq5Zs0pG8356g==/com.example.aiex-35wnT8pzv2zMFJBMTyeF6w==/base.apk"],nativeLibraryDirectories=[/data/app/~~k66WFjUZOCq5Zs0pG8356g==/com.example.aiex-35wnT8pzv2zMFJBMTyeF6w==/lib/arm64, /data/app/~~k66WFjUZOCq5Zs0pG8356g==/com.example.aiex-35wnT8pzv2zMFJBMTyeF6w==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
E/AndroidRuntime( 7998): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
E/AndroidRuntime( 7998): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
E/AndroidRuntime( 7998): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)

일부 기기에서 위 와 같은 에러가 나왔습니다.

Flutter에서 왜 이러한 에러가 나온것일까요?

 

먼저 androidx.lifecycle 에 대해서 알아보았습니다.

 

공식 홈페이지에 따르면 JetPack의 일부이고, 생명 주기와 관련 된 라이브러리 라는 것을 알 수 있었습니다.

수명 주기 인식 구성요소는 활동 및 프래그먼트와 같은 다른 구성요소의 수명 주기 상태 변경에 따라 작업을 실행합니다. 이러한 구성요소를 사용하면 잘 구성된 경량의 코드를 만들어 유지 관리가 더 쉬워집니다.
- https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ko - 

 

 

에러를 보면 아래와 같이 ProcessLifecycleOwner를 찾을 수 없다 라는 문구가 있는 것을 확인할 수 있었는데요.

Failed resolution of: Landroidx/lifecycle/ProcessLifecycleOwner
.
.
.
Didn't find class "androidx.lifecycle.ProcessLifecycleOwner"

ProcessLifecycleOwner는 공식홈페이지에 의하면 

belongs to Maven artifact android.arch.lifecycle:extensions:1.1.1이라고 나와있는데

 

LifeCycle에 포함된 클래스로, 전체 애플리케이션의 생명주기를 나타냅니다.

즉, 개별 액티비티나 프래그먼트의 생명주기가 아닌, 앱이 사용자에게 보이는지(포그라운드) 혹은 보이지 않는지(백그라운드) 등 앱 전체의 생명주기 상태를 관리합니다.

이를 통해 앱이 전체적으로 어떤 생명주기 상태에 있는지 알 수 있으며, 이 정보를 기반으로 앱 수준에서 작업을 조정할 수 있습니다.

현재는 Deprecated가 되었고, androidx.* 패키지로 변경되었다고 합니다.

 

결국 Flutter에서 android의 lifecycle를 담당해주는 패키지 lifecycle:extensions가 없어서 오류가 나는 것 같아서 추가해줬더니 정상 동작하는 것을 확인했습니다. 

 

그럼 아래 사진과 같이 android에서 deprecated가 된 lifecycle-extensions 라이브러리가 없어서 오류가 난 이유가 무엇일까?

https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ko -

androidx.lifecycle:lifecycle-extensions는 안드로이드 Jetpack의 일부인 Lifecycle 라이브러리의 확장 팩입니다.

이 라이브러리는 안드로이드 앱의 UI 컨트롤러(예: 액티비티와 프래그먼트)의 생명주기를 쉽게 관리할 수 있도록 도와줍니다.

 

구체적으로, 이 라이브러리는 생명주기의 복잡성을 추상화하여 앱이 시스템의 생명주기 변화에 맞춰 업데이트될 수 있도록 합니다.

lifecycle-extensions 패키지에는 다음과 같은 여러 구성요소가 포함되어 있습니다

Lifecycle - 컴포넌트(액티비티, 프래그먼트 등)의 생명주기 상태를 나타내며, 이 상태에 따라 관리해야 할 작업을 정의할 수 있습니다.
ViewModel - UI 관련 데이터를 저장하고 관리하여, 구성 변경(예: 화면 회전) 시에도 데이터를 유지할 수 있게 해줍니다.
LiveData - 데이터의 변경을 관찰할 수 있는 데이터 홀더 클래스로서, UI와 데이터 사이의 일관성을 유지할 수 있게 해줍니다.

 

Flutter에서 Android 앱을 구축할 때 이러한 라이브러리가 필요한 이유는, Flutter 아키텍쳐에서 네이티브 코드와 상호 작용하는 다리 역할을 하는 Embedder Platform-specific 사이에 위치합니다.

(Flutter 아키텍쳐 설명 : https://minf.tistory.com/entry/Flutter-Flutter-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90)

 

특히 Google ML Kit 같은 네이티브 라이브러리를 사용할 때, 해당 라이브러리가 Android 생명주기에 맞춰 제대로 작동하려면 필요한 종속성이 있을 수 있습니다.

 

에러 메시지에서 볼 수 있듯이, ProcessLifecycleOwner 클래스를 찾을 수 없어 발생한 문제는 lifecycle-extensions를 포함하므로 해결됩니다. 이는 ProcessLifecycleOwner 클래스가 해당 확장 팩에 포함되어 있기 때문입니다.

 

결론적으로, androidx.lifecycle:lifecycle-extensions는 앱이 안드로이드의 생명주기에 따라 제대로 동작하도록 도와주며, Flutter 앱에서 네이티브 기능을 사용할 때 종종 필요한 종속성을 제공함으로써 해당 에러는 해당 라이브러리를 포함시켜서 해결하시면 될 것 같습니다.

 


출처

https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ko

 

Lifecycle  |  Android 개발자  |  Android Developers

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Lifecycle 수명 주기 인식 구성요소는 활동 및 프래그먼트와 같은 다른 구성요소의 수명 주기 상태 변경에 따라

developer.android.com

https://developer.android.com/reference/android/arch/lifecycle/ProcessLifecycleOwner

 

ProcessLifecycleOwner  |  Android Developers

Stay organized with collections Save and categorize content based on your preferences. added in version 1.1.0 belongs to Maven artifact android.arch.lifecycle:extensions:1.1.1 ProcessLifecycleOwner The android.arch Architecture Components packages are no l

developer.android.com

https://minf.tistory.com/entry/Flutter-Flutter-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

[Flutter] Flutter 아키텍쳐를 알아보자

공식문서를 기준으로 Flutter의 아키텍쳐에 대해서 살펴보자 결론적으로 Flutter Dart 코드는 운영체제와 직접적으로 소통하지 않는다. 보통 Native 앱 개발을 할 때 버튼이나 Text Input 등 어떠한 요소

minf.tistory.com

 

Comments