Bug Fix

[Bug Fix] 앱 재설치 시 크래시 발생(EncryptedSharedPreferences )

베르_최성훈 2023. 11. 12. 19:39

 

오늘은 Festago 출시 후 앱에 crash 가 발생한 첫 번째 사례와 해결한 방법에 대해 써보겠습니다.

 

문제 발생 과정

 

개발 과정에서는 문제가 생기지 않았고

처음 설치했을 때도 문제가 발생하지 않았다.

 

 

첫 출시에 감격하고 있었는데..

곧바로 문제가 발생했다.

 

 

앱을 삭제했다가 다시 설치하면 무조건 crash 가 발생하는 것이다!

 

 

전혀 예상치 못한 오류에 어디서 문제가 발생한건지 왜 두 번 설치해야 문제가 발생하는 것인지 고민하다가

프로젝트에 적용한 Firebase Crashlytics Log를 확인해보았다.

 

 

 

 

AuthLocalDataSource 의 SharedPreferences 에서 오류가 발생한 것이었다.

 

오류 메세지는 다음과 같았다. 

 

Caused by android.security.KeyStoreException Signature/MAC verification failed

 

해당 예외가 발생하는 문제를 구글링을 해보았다.

 

 

문제 인식

https://github.com/google/tink/issues/535

EncryptedSharedPreferences 공식문서

 

구글링한 결과 EncryptedSharedPreferences 와 관련된 것이었다.

 

위 글을 정리하자면

 

SharedPreferences 는 AutoBackup 이 default 이다. 

앱을 삭제해도 데이터가 사라지지 않게 하기 위해 백업하는 것이다.

 

문제는 EncryptedSharedPreferences 는 SharedPreferences 의 구현체로 key 와 value 를 암호화하는데

재설치시 이 key 가 유효하지 않게 된다.

 

따라서 backup rules 를 사용해 EncryptedSharedPreferences 가 백업되지 않도록 해줘야한다

 

문제 해결

공식문서에서 소개한 방법 외에도 다른 방법이 있는지 확인해 보았다.

 

1. allowBackup = “false” 

2. try catch 로 잡고 EncryptedSharedPreference 재설정
3. EncryptedSharedPreference 가 Auto Backup 되지 않도록 backup rules 사용 제외

 

찾아본 방법은 이것 세가지였는데

1번은 모든 데이터가 백업되지 않기 때문에 사용하지 않았다.

2번도 나쁘지 않은 방법이긴 했지만 crash 가 발생하고 잡는 것 보다 발생하지 않는 상황을 만드는 것이 더 좋다고 판단했다.

결국 공식문서에서 소개한 3번 방법을 사용하기로 했다.

 

https://developer.android.com/guide/topics/data/autobackup#IncludingFiles

 

안드로이드 11 이하와 안드로이드 12 이상 기기에서 제거하는 방법이 달랐는데

<application ...
 android:fullBackupContent="@xml/backup_rules">
</application>

 

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
   <exclude domain="sharedpref" path="."/>
</full-backup-content>

 

위와 같이 백업 룰을 추가하여 11 이하에서 sharedPref 가 포함되지 않도록 해주었다.

 

 

<application ...
 android:dataExtractionRules="backup_rules.xml">
</application>

 

<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup disableIfNoEncryptionCapabilities="true|false">
        <exclude domain="sharedpref" path="." />
    </cloud-backup>
</data-extraction-rules>

 

12 이상에서도 backupRules 를 추가해주었는데 fullBackupContent 대신 dataExrtractionRules 를 사용해야 한다.

 

똑같이 sharedPref 가 포함되지 않도록 해줬다.

 

빠르게 변경한 후 1.0.1 버전으로 업데이트했다.

 

결론

 

출시하기 전엔 문제가 없는줄 알았는데 출시하고 나서 버그가 발생할 수 있구나 처음 알게되었다.

 

기술을 사용할 때 더 꼼꼼하게 보는 습관을 가져야겠다 다짐했으며

출시,배포, 유지보수 경험이 생각보다 훨씬 중요하다는 것을 느꼈다.

 

 

PR 링크

https://github.com/woowacourse-teams/2023-festa-go/pull/381