반응형
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를 기준으로 설명하겠다.
- build.gradle (Module) 파일을 연다.
- android 부분의 buildTypes를 확인한다.
- 아래의 설정이 사용중인지 확인한다.
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 파일에 해당 설정 내용이 존재한다면 이미 해당 도구를 사용중인 것이다.
참고
반응형