이동식 저장소

[Android] Proguard가 사람 잡는다 본문

Primary/Android

[Android] Proguard가 사람 잡는다

해스끼 2022. 10. 1. 22:18

Disclamer

이 글에서 제시하는 버그의 원인은 잘못되었습니다. 아래 글을 참고해 주세요.

 

한빛 캘린더 버그 소탕 대작전

한빛 캘린더는 내가 일하고 있는 한빛맹학교의 식단 및 학사일정을 알려주는 달력 앱이다. 그런데 앱을 처음 개발할 때부터 나를 괴롭히던 버그가 하나 있다. 학사일정은 전부 보이는데, 식단이

thinking-face.tistory.com

초보 개발자가 버그를 잡아가는 과정이라고 주시면 감사하겠습니다. ^^


이미 Proguard와 관련된 디버깅 글을 여러 번 쓴 바 있다.

 

[Android] 코드 경량화 시 Instrumented test가 실행되지 않는 오류

[Android] R8 컴파일러로 앱 경량화하기 왜 경량화해야 하는가? APK 파일에는 실행 가능한 바이트코드가 DEX(Dalvik Executable) 형태로 저장되어 있다. DEX 파일에는 앱에서 실행되는 Android framework 메서드,.

thinking-face.tistory.com

 

Gson에서 null이 반환될 때 with ProGuard

알 수 없는 에러 Proguard를 적용한 후 이상한 에러가 발생한다. java.lang.NullPointerException: Parameter specified as non-null is null: method com.practice.hanbitlunch.screen.Menu. , parameter name at..

thinking-face.tistory.com

그런데 오늘 또 하나의 이상한 에러가 발생했다.

식단이 보이지 않는다

최근 업데이트한 한빛 캘린더 1.1 버전을 폰에서 사용해 봤는데, 그런데 뭔가 이상하다. Android Studio에서 설치했을 때는 모든 날짜의 식단이 잘 보였는데, Google Play에서 업데이트한 앱에서는 특정 날짜의 식단이 보이지 않는 것이다.

 

다른 달의 식단도 참고해 본 결과, 10일 이후의 식단이 보이지 않는다는 결론을 내렸다. 이상하게도 학사일정은 잘 보인다.

머선일이고

이번에도 데이터의 흐름을 따라가 보기로 했다.

 

일단 나이스 API에서 데이터를 제대로 가져오긴 한다. 그렇다면 또 파싱이 문제인가? Json을 나이스 객체로 파싱하고, 다시 Room 객체로 변환하는 부분에 로그 코드를 추가해 보았다. 정확히는 날짜 문자열(``20221001``)이 ``2022``, ``10``, ``1``로 올바르게 파싱되는지 확인해 보았다.

 

로그 확인 결과, 데이터가 제대로 파싱 및 변환되고 있었다. 그런데 모든 날짜의 식단이 잘 보인다? 해결책이 로그 찍는 것입니까? 여기가 정녕 관측이 결과를 바꾸는 미시 세계란 말인가?

 

...바꿀 수 있지 않을까?

또 Proguard냐?

로그 찍는 코드만 추가했는데 문제가 해결됐다. 여기서 내가 생각한 가설은 다음과 같다.

  • 로그 찍는 코드가 없었을 때에는, 날짜 변수가 사용되지 않는 것으로 인식됐다.
  • 따라서 Proguard가 날짜 변수를 축소했다.
  • 로그 찍는 코드를 추가했다. 이제 날짜 변수가 ``Log.d`` 함수에서 사용되므로, 더 이상 Proguard에 의해 축소되지 않는다.
  • 날짜 변수가 최종 빌드에서 살아남았다.

 

하지만 Proguard의 매핑 파일을 확인해 보니 Room 객체의 모든 변수가 정상적으로 난독화되었다. 따라서 가설을 기각한다.

 

그럼에도 불구하고 Proguard를 의심할 수밖에 없다. 이미 전과가 많아서.. 그래서 내가 작성한 모든 클래스를 축소되지 않게 keep한 후 빌드해 보았다. 여기서 keep이란 Proguard의 핵심 기능인 축소와 난독화 모두 적용하지 않는 옵션을 말한다.

결과

모든 식단이 잘 보인다.

 

로직은 그대로 놔둔 상태에서 Proguard 규칙만 바꾸었더니 문제가 해결됐다. 따라서 이번 버그도 Proguard 때문인 것으로 판명할 수 있다.

 

아니면 뭣도 모르고 쓴 내 잘못인가.. 앞으로 Proguard 쓸 때는 일단 내 클래스를 전부 keep해야 할 듯.

'Primary > Android' 카테고리의 다른 글

[Android] AAB 더 알아보기  (0) 2022.10.14
[Android] APK와 AAB  (0) 2022.10.13
Gson에서 null이 반환될 때 with ProGuard  (0) 2022.09.27
[Android] 디버깅할 때 앱이 느리다면  (0) 2022.09.25
[Hilt] Entry Points  (0) 2022.09.10
Comments