Grusie 안드로이드 개발 기술 블로그

[Android] release 버전에서 Gson 파싱이 안 되던 오류(코드 난독화 문제) 본문

안드로이드 개발

[Android] release 버전에서 Gson 파싱이 안 되던 오류(코드 난독화 문제)

grusie 2024. 5. 7. 15:23
728x90
반응형
SMALL

웹뷰를 활용한 페이지를 새로 만들어 테스트를 완료하고, release버전으로 내부테스트 배포를 하게 되었다.

기본 동작은 웹뷰에서 Json을 받아와 Gson 라이브러리를 활용하여 해당하는 모델로 파싱을 해주고, 그 모델을 가공하여, Unity 라이브러리에 전달하는 형태였으나, 어째서인지 배포를 한 뒤 부터 Unity 모듈의 초기화가 실패하는 현상이 발생했다.

 

원인 분석

release버전이기에, 세세한 Log를 보지 못 했고, 로그인 정보를 넘겨줄 때 문제가 있을 것이라는 추측만 할 수 있었다. 로그인 정보가 잘 못 되었나를 고민하였으나 Shared Preferences 같은 경우도, debugging 모드일 때에만 안드로이드 스튜디오에서 볼 수 있었고, release를 debuging 모드로 뽑아서 할까 하다가, Build Config의 Debug 모드를 true로 만들어 뽑아두고, Log를 찍어서 확인해 보기로 마음 먹었다.

 

aab를 뽑아서 플레이스토어에 올리는 것은 너무나도 비효율 적이기에, apk로 뽑아서 확인해 보았다.

 

로그를 찍은 부분

1. 웹뷰를 통해 데이터를 받아오는 부분

2. 받아온 데이터를 파싱하는 부분

3. 파싱한 데이터를 유니티 라이브러리에 넘기는 부분

 

이렇게 3군데에 로그를 찍고 확인해보았다.

@JavascriptInterface
fun postVrInfo(vrJson: String) {
    val vrJsonObject = JSONObject(vrJson)
    val gson = GsonBuilder().create()
    var vrInfoVo: VrInfoVo? = null
    
    Logger.d("confirm webView vrJson : $vrJson")
    
    try {
        vrInfoVo = gson.fromJson(
            vrJsonObject.toString(),
            VrInfoVo::class.java
        )
        
        Logger.d("confirm webView vrJsonObject : $vrInfoVo")
        
        ...
    } catch (e: Exception) {
        Logger.e("confirm webView vrJsonObject error: ${e.message}")
        ...
    }

    vrInfoVo?.let { vrInfoVo ->
    		...
            val openInfo = vrInfoVo.joinToString(memCheck = dataManager.userData.mem_check)
            Logger.d("confirm openInfo : $openInfo")
            ...
        	context.startActivity(vrRunIntent)
    }
}

 

결과에서는 파싱 에러가 발생하지는 않았고, vrInfoVo에 해당하는 필드들이 비어있는 값으로 되어있었다.

그래서 그것을 가공해서 보내는 openInfo에 값이 제대로 들어가지 않아, 인증을 제대로 하지 못했던 것이었다.

 

이것이 release버전에서만 그랬다는 것을 알고 있으니 둘의 어떤 차이가 있을까를 고민하며, Gson 파싱부분이 안 될 때를 검색해보았을 때, 난독화 문제가 있다는 것을 알게 되었다.

 

해결 방법

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

모듈 수준의 build gradleminifyEnabled true를 사용하여, proguard를 활용한 난독화를 릴리즈 버전일 때에 사용하도록 되어있었다.

난독화를 사용하며, Gson에서 파싱을 시도하는 경우 파싱이 제대로 되지 않는 현상이 있다는 것을 발견했다.

 

-keep class com.KOVI.HOUSE.cleanarchitecture.presentation.** { *; }

그렇다면, 해당하는 부분에서는 난독화를 하지 않도록 proguard를 수정 해주어야 한다.

proguard-rules.pro에 이렇게 작성하면, 해당하는 클래스 또는 폴더에서는 난독화를 하지 않는다.

 

이렇게 처리하면 원하는대로 데이터가 파싱이 되어, 잘 동작하는 것을 볼 수 있다.

코드 난독화 문제를 해결하여 Json파싱이 제대로 된 결과물

 

 

참고

https://yk-coding-letter.tistory.com/25#recentComments

 

[Android] App 코드 난독화와 Gson으로 json 파싱이 안되는 이슈

코드 난독화를 하면 디컴파일, reverse engineering 을 어렵게 하여 보안상의 안정성을 높힐 수 있다. release앱에는 난독화를 하는 것은 좋은 방법이지만 debug모드에서는 굳이 해야할 필요는 없을 것 같

yk-coding-letter.tistory.com

https://velog.io/@eoqkrskfk94/Proguard%EB%A1%9C-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C-%EB%82%9C%EB%8F%85%ED%99%94-%ED%95%98%EA%B8%B0

 

Proguard로 안드로이드 소스코드 난독화 하기

프로가드는 코드를 난독화 및 최적화를 해주는 무료 오픈소스 툴입니다. 즉 프로가드는 컴파일된 앱 패키지의 코드를 난독화해서

velog.io

 

후기

코드 난독화 문제까지 고민하게 될 줄은 정말 꿈에도 몰랐다. 아직까지 모르는 게 너무 많지만, 항상 이렇게 해결을 해나가는 것이 대견하다고 생각했다.

처음에 release버전만 안 된다는 걸 깨달았을 땐, 얼마나 심장 졸였는지 모르겠다.

웹이나, 서버, 유니티 쪽에 문제라고 생각을 하고 싶어도 릴리즈/디버그 상태일 때에 따라서만 다르니 그럴 일 없다고 생각했고, 코드가 똑같은데 왜 안 되지라는 생각을 수도 없이 하다가 발견하게 되었다.

그래도 오늘도 이렇게 한 가지 얻어가게 되어 좋았다.

반응형
LIST