마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

앱 업데이트할 때 별도 작업 추가할 수 있을까요?

0 추천
안녕하세요. 초보 개발자입니다.

안드로이드 개발에 대해서 거의 모르지만 아이디어 하나 믿고 구글링해가며 어찌어찌 앱을 하나 만들어서 출시했는데요, 배포까지 된 단계에서 업데이트를 하려니 기본적인 시스템 구조를 몰라서 좀 난처해졌습니다.

앱에서 사용자 데이터를 파일로 저장하는 부분이 있는데요,

FileOutputStream file = openFileOutput(FILENAME, Context.MODE_PRIVATE);

이런 형태로 파일을 생성해서 거기에 데이터를 저장하고 다음 번에 앱 로딩할 때는 FileInputStream으로 불러와서 데이터를 사용하였습니다.

그런데 이 상태에서 앱 버전을 업데이트하니 기존에 깔려 있던 구 버전이 삭제되고 신 버전을 깔면서 사용자 데이터도 모두 소실되어 버리더군요. 사용자들의 항의가 빗발칩니다ㅠ

구글링을 해보니 SD카드에 저장해야 앱 업데이트 시 삭제되지 않는다고 하여 앱을 그렇게 고쳐서 업데이트를 하려고 보니, 그러면 변경 전 버전 사용자들이 업데이트를 하면서 데이터를 모두 날리게 될 테니 또 항의를 받을 게 분명합니다ㅠ

 

어떻게 하면 기존 사용자 데이터를 안전하게 이식하면서 앱 업데이트를 수행할 수 있을까요?

앱 업데이트 시에 수행되는 스크립트?에 접근해서 기존 사용자 데이터를 SD카드에 옮기고 앱 업데이트 작업을 할 수 있는 방법이 있을까요?
오직너마늘 (130 포인트) 님이 2022년 12월 28일 질문

1개의 답변

+1 추천

openFileOutput 메소드를 보면  두번째 인자는  아래처럼 사용하라고 나와 있습니다.

https://developer.android.com/reference/android/content/Context#openFileOutput(java.lang.String,%20int)

modeint: Operating mode. Value is either 0 or a combination of MODE_PRIVATEMODE_WORLD_READABLEMODE_WORLD_WRITEABLE, and MODE_APPEND

따라서 아래처럼 값을 조합해서 사용하시는 것이 맞을 것 같습니다.

FileOutputStream file = openFileOutput(FILENAME, Context.MODE_PRIVATE | Context.APPEND);

테스트해보면 Context.APPEND를 붙일 경우 앱을 업그레이드 하더라도 파일에 있는 데이터가 보존되는 걸로 확인이 됩니다.  테스트 해보세요.

그리고 간단한 데이터의 경우는 보통 SharedPreferences를 해당 용도로 많이 사용합니다. 그리고 암호화를 지원하는 보안이 강화된 버전을 사용하시려면(강력히 권장) Jetpack security 관련 라이브러리를 사용하시면 됩니다.

https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences

님과 같이 사용쟈정보를 암호화 없이 저장하면 루팅된 디바이스(애뮬레이터 포함)의 경우는 사용자 정보를 열여서 쉽게 확인할 수 있으므로, 주의해서 처리하시길 권장합니다.

spark (227,470 포인트) 님이 2022년 12월 28일 답변
자세한 답변 감사합니다! 주말쯤에 해당 방법으로 해결이 될지 테스트해보겠습니다. SharedPreferences와 암호화에 대한 정보도 정말 감사합니다. 새해 복 많이 받으세요~
...