Category Archives: Infra

이음의-시스템-인프라를-소개합니다

Retrofit2 + RxJava proguard 설정하기

안녕하세요, 이음소시어스에서 안드로이드 앱 개발을 맡고 있는 김범준(준) 입니다.

최근 안드로이드 HTTP Client 라이브러리를 Volley에서 Retrofit2로 옮기는 과정에서 겪었던 ProGuard 관련 문제와 해결과정을 공유하려 합니다.

문제가 발생한 과정은 다음과 같습니다.

1. 새로운 feature에 쓰이는 API 모듈을 Retrofit2를 통해 구현하였습니다.

2. QA 까지 아무 문제가 없어서 구글 플레이에 업데이트 버전을 배포하였습니다.

3. 구글 플레이에서 앱을 다운로드하니 새로 만든 API 모듈에서 에러가 발생했습니다 ㅠㅠ

 

멀쩡하던 API가 배포하니 갑자기 안되다니.. (멘붕)

92_55169f19d5d14_1833

APK 파일을 다운로드해서 테스트하지 않고 Android Studio를 통한 빌드로만 테스트한 것이 문제였습니다.

ProGuard가 APK를 난독화하는 과정에서 문제가 생겼던 것이죠!

정확히 어떤 문제였는지 설명하기에 앞서 먼저 ProGuard와 저희가 사용한 Retrofit2 설정에 대해 간략하게 설명 드리겠습니다.

 

ProGuard 란?

ProGuard는 APK 빌드 과정에서 사용하지 않는 코드를 제거함으로써 크기를 최소화하고, 남은 코드를 난독화를 통해 리버스 엔지니어링을 어렵게하는 툴입니다.

ProGuard의 경우에는 class, method, field의 이름을 줄여 난독화 하게 되는데, 예를 들어 ‘name’이라는 String 타입의 멤버 변수를 ‘a’라고 뜻을 알 수 없는 짧은 단어로 치환하는 것이죠.

이 때, 난독화가 프로그램 작동에 영향을 줄 수 있는 부분들은 ‘-keep class ~’와 같은 방법으로 난독화에서 제외해줍니다.

 

Retrofit2 + RxJava

저희가 Retrofit2를 도입하면서 선택한 구조는 RxJava의 Observable 클래스와  GsonConverter를 이용합니다.

RxJava의 Observable를 통해 어떤 클래스로 response를 받을 것인지 지정해주면, GsonConverter를 통해 response를 JSON으로 파싱하여 지정한 클래스의 각 멤버 변수에 대입해줍니다.

API 콜을 부르면 콜백에 지정한 클래스의 객체를 돌려주니 바로 콜백에서 클래스 메소드를 사용할 수 있습니다. (넘나 편한것..)

Retrofit2 + RxJava의 자세한 설정이 궁금하신 분은 이 링크를 참고해주세요~

 

문제는 Model 클래스의 난독화에 있었다..

위에서 언급한 것처럼 response가 들어오게 되면 GsonConverter가 JSON으로 파싱해주고 Model 클래스의 멤버 변수에 대입해주는데, 이 때 ProGuard가 이 클래스의 멤버 변수를 난독화하면..! 대응 되는 이름의 멤버 변수가 없으니 문제가 생기는 것이죠.

실제로 난독화 된 클래스를 보면 다음과 같습니다. dex2jar 와 JD-GUI를 통해 디컴파일 하였습니다.

멤버 변수가 a, b, c 로 바뀐 것을 확인할 수 있습니다. 그렇다면 문제를 해결하기 위해선 ProGuard가 Model 클래스를 난독화하지 않도록 만들어주면 되겠죠~

 

ProGuard Configuration

Retrofit 홈페이지는 ProGuard를 사용할 시 어떤 설정을 적용해야 하는지 친절하게 써 놓았습니다.

스크린샷 2016-08-05 오후 3.16.38

이것만 적용하고 설정이 끝났다고 생각해서 문제가 생긴 것이죠 ㅠㅠ

keep model

위의 설정은 Retrofit2이 제대로 작동하기 위한 것이고 RxJava를 추가로 사용하기 때문에 따로 설정을 해줘야 합니다.

위과 같이 사용하는 Model 클래스를 난독화에서 제외해주시면 됩니다. 결과는 다음과 같습니다.

원래 멤버 변수 이름대로 있는 것을 확인할 수 있습니다! 앱 또한 정상 작동하였습니다.

Inner 클래스를 사용하는 경우 몇몇 변수가 난독화가 되는 일이 일어나기도 한다고 합니다. 이런 경우에는 다음과 같이 Inner 클래스도 난독화에서 제외하는 코드를 추가해줍니다.

해결!

 

후기

저에겐 안드로이드 앱 배포가 이번이 처음이었는데요, 예상치 못한 오류가 터져서 고생을 했지만 그래도 해결하고 나니 많이 배운 것 같아 뿌듯하네요 ㅎ

두서 없는 글 읽어주셔서 감사합니다~ (ㅡ)(__)