들어가기 전
릴리즈 apk로 테스트를 하다가 처음 앱을 설치하고 실행하면 로그인 및 다른 기능들이 정말 잘 작동되는데, 앱을 삭제했다가 다시 깔아서 테스트를 하면 앱이 터지는 문제가 발생하였다. 이 과정에서 겪은 트러블 슈팅과 해결 방법을 작성해보도록 하겠다.
엄빠도 어렸다 릴리즈를 준비하면서 릴리즈 apk로 테스트를 계속 진행했는데, 첫 설치 후 앱을 실행하면 정말 잘 작동하였다. 문제였던 카카로 로그인도 잘 되고, 여러 기능들에 문제가 없었다. 그러나 앱을 삭제하고 다시 깔아보니 실행과 동시에 앱이 터지는 문제가 발생했다.
무엇이 문제일까?
1. 디버그 apk 에서는 괜찮았으니까, 코드 중에 buildConfig.DEBUG로 설정 한 부분이 있어서, 해당 부분이 릴리즈 apk에서 작동하지 못해서 생긴 문제 아닐까?
2. sharedPreference에 문제가 있는 것 같다.
이 두가지 의견이 있었는데, 바로 2번 sharedPreference의 문제였다.
이를 확인 한 방법은 삭제 하고 다시 깔았을 때, 캐시도 같이 삭제하니 앱이 잘 실행되는 것이였다.
캐시를 삭제 해야 잘 실행된다는 것은 현재 저장소에 문제가 있다고 추측할 수 있었다.
그리고 에러 description을 자세히 보니 이런 내용이 있었다.
com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
SharedPreference의 문제
현재 엄빠도 어렸다 서비스에서는 카카오 로그인을 한번 한 후 다시 앱을 들어오면, sharedPreference를 통해서 자동로그인이 된다.
이 때 사용한 sharedPreference는 EncryptedSharedPreferences이다.
EncryptedSharedPreferences는 간단히 말하자면 암호화된 sharedpreference 이다.
기존 sharedpreference는 소규모의 데이터를 앱 안 xml파일로 간편하게 저장할 수 있는 저장소로 xml 내용을 보면 key와 value를 다 볼 수 있다.
하지만 앱의 데이터를 이 같이 쉽게 열어보는게 좋지 않은 것 같아 구글에서는 암호화를 할 수 있는 security 라이브러리를 제공하고 있다. 이 라이브러리를 추가하면 sharedpreference 가 아닌 encryptedsharedpreference로 작성하면되고, 암호화를 할 수 있다.
그래서 EncryptedSharedPreferences 사용의 문제냐? 그건 아니다. 원인은 바로 이 포스팅의 제목처럼 앱을 삭제해도 데이터가 복구되는 문제 때문이였다!
앱을 삭제했는데 임시저정소 데이터가 남아있다.
이제껏 알고있는 바로는 앱을 삭제하면 sharedpreference (저장소)의 데이터도 삭제되는 것으로 알고 있었는데, 최신 기종에서 이 데이터가 남아있는 즉 복구되는 경우가 있다고 한다.
그 원인은 바로 Backup Manager 때문이였다. 이는 따로 설정하지 않으면 자동백업을 true로 진행한다.
이를 원치 않을경우 manifest에서 android:allowBackup = false로 설정하면 된다.
true로 되어있을 경우, 앱을 삭제해도 앱 내 저장되어있던 데이터가 다시 되살아난다.
그래서 백업과 EncryptedSharedPreferences랑 어떤 연관이?
EncryptedSharedPreferences를 소개하면서 말했던 Security 라이브러리는 android keystore system을 이용해 마스터키를 만들었다. 따라서 키를 앱 내부가 아닌, 시스템만이 접근 가능한 컨테이너에 저장하도록 하였다.
이런 상황에서 allowBackup=true로 설정했다면? keystore를 백업할 수 없으므로 암호화된 데이터가 복원되어도 이를 해독할 수가 없는것이다. 따라서 자동로그인을 위해서 사용한 sharedpreference에 값을 확인이 불가능하니 해당 에러가 발생하는 것이다.
이를 컴퓨터 안드로이드 스튜디오에서 돌렸을 경우에는 keystore를 파악할 수 있기 때문에 문제가 없었지만, 실제 릴리즈처럼 apk 파일을 이용해 모바일 기기로 실행시키면 문제가 발생하는 것이다.
해결방법
manifest에 application 내에 두 속성을 false로 바꿔주면된다.
android:allowBackup="false"
android:fullBackupContent="false"
이렇게 변경하면 apk 파일로 실행해도 더이상 에러가 발생하지 않는다!
마치며
카카오 로그인 api를 수정하니 또 다른 에러가 떠서 멘붕이 왔었는데, 이 역시 apk를 추출해서 모바일 기기로 돌렸을 때 확인할 수 있는 에러였다. 이제껏 프로젝트를 에뮬레이터에서만 돌리고, apk 파일 추출하고 릴리즈까지는 도달하지 못하다보니 새롭게 경험하는 트러블슈팅이 많았다. 릴리즈가 없었다면 겪지 못하고 알지 못했던 지식들이라 더욱 값진 것 같다. 이 포스팅 역시 해당 에러를 겪은 개발자들에게 도움이 되길 바란다!