계발자 블로그

[Android] data class 트러블 슈팅 - @keep 어노테이션 본문

Android

[Android] data class 트러블 슈팅 - @keep 어노테이션

더구더구 2026. 1. 10. 20:13

최근 회사 업무 중 내부 테스트를 위해 번들을 만들어 공유한 상황이었습니다.

안드로이드 스튜디오에서 빌드 했을 때 문제가 없었는데 번들로 설치 했을 때

이번에 추가한 화면에서 api 호출은 성공하지만 데이터를 못 불러왔습니다.

 

원인을 찾아보니 

R8 난독화 과정에서 데이터 클래스를 지워버렸습니다.

 

새로 추가된 화면의 데이터 클래스들은 enum + 중첩 모델이 많았는데 따라서

Gson이 리플렉션을 통해 런타임에 데이터 클래스 생성 - 역직렬화

하지만 해당 클래스가 코드에서 직접 참조 되지 않음 - R8은 컴파일 타임에 사용 하지 않는 클래스로 판단(제거)

Gson이 필드를 찾지 못함 - 데이터 파싱 실패

 

기존 api 모델들은 자바 코드로 되어 있는데 코드 상에서 명시적으로 접근하고 있어서

R8이 사용 중이라 판단 - 난독화에 걸리지 않았던 것 같습니다.

 

해결 방법은 간단했습니다.

@keep 어노테이션을 클래스 최상위에 적어주면 됐습니다.

 


@keep이란?

Android Developers

 

안드로이드 공식 문서에서는 위와 같이 설명하고 있습니다.

 

 


결론

데이터 클래스는 서버로부터 받아온 데이터 문자열을 리플렉션으로 역직렬화 하는 과정에서

이름이 필요하기 때문에 난독화를 하지 못하는 것을 배웠습니다.

 

그렇기 때문에 서버 데이터부터 전체적으로 난독화를 하면 된다고는 하지만

 

항상 매 버전 동일하게 난독화가 되는데 데이터가 보안상 유의미한 난독화라 부를 수 있는지

애매한 부분도 있는 것 같습니다.

 

 

 

 

 

 

'Android' 카테고리의 다른 글

[DI] Dependency Injection과 Dagger-Hilt  (0) 2024.01.07
[JetPack] Navigation (JAVA)  (0) 2022.12.04
[JetPack] WorkManager  (2) 2022.10.01
[JetPack] DataBinding  (0) 2022.08.16
[JetPack] ViewBinding  (0) 2022.07.27