회사에서 서비스 중인 앱 하나를 유지보수하는데 Rest API 요청할 때 Exception을 뱉어내는 일이 발생했다.
java.lang.runtimeexception: Stub!
이걸로 무려 4시간을 삽질한 결과 원인은 Apache 라이브러리였다.
Apache 라이브러리는 okhttp3가 등장하기 전 Android에서 Rest API를 사용하기 위해 사용하던 라이브러리이다. 근데 Apache 라이브러리는 android.jar 내에 내장되어있다.
Apahce 라이브러리 내에 모델 클래스인 BasicNameValuePair
우선 Stub은 라이브러리에서 구현체가 존재하지 않아 클래스를 사용할 수 없을 때 뱉어내는 일종의 경고 메세지다.
Android의 경우 라이브러리로서 android.jar 파일이 존재하는데 안드로이드 스튜디오 상으론 껍데기만 있고 실제 구현체는 AOSP 내에 존재한다.
마찬가지로 Apache 라이브러리 또한 일종의 껍데기만 android.jar 내에 존재하고 실제 구현체는 AOSP가 가지고 있어야하는데.. Android 14부터는 Apache 라이브러리의 지원이 전면 중단되어 AOSP 내에서도 제거되었다.
지원 중단은 Android 6 부터 되었고 Android 9 부터는 기본적으로 사용이 불가능했지만 가이드에 따라 Android 13 까지는 예외처리하여 사용이 가능하였다.
기존 Apache 라이브러리를 사용하던 로직을 okhttp3로 마이그레이션 하는 방법이다.
이 방법이 가장 안전하고 효과적이라고 생각한다.
개발자 문서에 따르면 Target SDK를 28로 조정하고 기존의 예외처리를 적용하라고 가이드하고 있다.
마이그레이션 할 수고를 덜어주는 방법은 2번째인 TargetSDK을 조정하는 방법이지만
PlayStore 정책으로 인해 작성일인 2024.01.05 기준 TargetSDK이 33 이하일 경우에는 앱을 배포할 수 없다.
그래서 PlayStore에 배포하는 앱이라면 okhttp3로 마이그레이션 하는 수 밖에 없다.
필자의 경우 서비스하는 앱이 사설 배포이기에 TargetSDK를 신경쓸 필요가 없어 마이그레이션 없이 TargetSDK만 조정하는 방향으로 해당 현상을 해결하였다.