Android Error) Unable to invoke no-args constructor for class. Registering an InstanceCreator with Gson for this type may fix this problem.

반응형

 

Error

Retrofit 을 통해 API 통신을 하던 도중 다음과 같은 에러가 발생하였다.

API 통신 로그는 콘솔에 출력되는 것으로는 잘 되는 것 처럼 보이고

클래스에 주어진 멤버 변수에 값이 정상적으로 들어가는 것까지 확인되었는데도

이상하게 상태는 onFailure 메소드로 넘어가서 실패가 출력된다.

Unable to invoke no-args constructor for class.
Registering an InstanceCreator with Gson for this type may fix this problem.


해결 방법

결론부터 말하면 최적화 도구를 사용하였을 때 최적화 과정을 통해 요소들이 보존되지 않는 현상 때문에 발생한다.

해결 방법은 정말 간단하게도 최적화에서 해당 클래스나 메소드를 제외하면 된다.

최적화를 제외하는 애너테이션은 다음과 같다.

@keep

 

나같은 경우에는 API 통신을 통해 받아오는 데이터를 클래스의 멤버 변수에 저장하였는데,

해당 클래스 위에 @keep 애너테이션을 붙여주었다.


최적화 도구를 사용하였는지 확인하는 방법

인터넷 검색을 통해 알아본 바로는 ProGuard 또는 R8를 통해 최적화를 진행한다고 되어 있다.

하지만 나는 ProGuard를 통해 최적화가 진행되었으므로 ProGuard를 기준으로 설명하겠다.

 

  1. build.gradle (Module) 파일을 연다.
  2. android 부분의 buildTypes를 확인한다.
  3. 아래의 설정이 사용중인지 확인한다.
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

위의 코드는 ProGuard 사용 여부를 설정하는 코드이다.

설정 내용을 요악하자면,

  • minifyEnabled
    • 코드 최적화와 축소를 활성화하는 옵션
    • true 설정 시 릴리스 빌드에서 ProGuard가 활성
    • 최종적으로 ProGuard를 활성화하여 코드와 리소스의 크기를 최적화하여 앱 크기를 줄임
  • proguardFiles
    • ProGuard 설정 파일을 지정하는 옵션
    • getDefaultProguardFile('proguard-android-optimize.txt') 는 기본 설정 파일을 의미
    • 'proguard-rules.pro' 는 사용자 정의 설정 파일을 의미

 

build.gradle 파일에 해당 설정 내용이 존재한다면 이미 해당 도구를 사용중인 것이다.


참고

 

반응형