루팅 없이 카카오톡 데이터 이전하기

Shovel, Development

제목은 저렇게 써 뒀지만 이전 기기의 루팅은 필요하며, 새 기기의 루팅은 필요하지 않습니다!

배경

나는 2014년 부터 루팅 + 티타늄 백업을 통해 폰이 바뀔 때마다 카카오톡 데이터를 옮기고 있었다. 카톡 업데이트가 되면서 자체 백업 기능을 통해 옮기기 시작했는데, 자체 백업이 고장나는 일이 발생하고 말았다.

에러 메시지: 데이터베이스가 손상되어 대화 백업이 불가능합니다.

데이터베이스가 손상되어 대화 백업이 불가능합니다.

데이터베이스가 손상됐다면 폰에서도 대화기록 로딩이 실패해야할 것인데 이상하게도 백업만 실패한다.

데스크탑에서 백업을 시도하였을 때에는 백업 자체는 정상적으로 되지만 불러올 때
에러 메시지: 데이터가 손상되어 대화 내용 복원에 실패했습니다.

데이터가 손상되어 대화 내용 복원에 실패했습니다.

라고 떴다.

짜증나서 /data/data/com.kakao.talk/databases/KakaoTalk.dbKakaoTalk2.db 를 루팅을 통해 가져왔다. 암호화를 jiru/kakaodecrypt 를 통해 해제해보니 제대로 해제되었다.

이를 통해 KakaoTalk.dbKakaoTalk2.db만 옮기는 게 가능하다면 메세지의 백업이 가능할 것이라는 확신을 가졌다.

방법

어떻게 옮길 것인가가 제일 중요한 문제인데, /data 는 루팅 없이 건드리기가 참 힘들다. 같은 패키지명의 다른 앱을 하나 만들어서 쓴다고 해도 Signature 때문에 업데이트가 불가능할 것이다. 여러 방법을 고민하다 나는 adb backup 기능을 쓰기로 했다.

백업을 할 시에 db파일이 어딘가엔 들어있을 거고 그 db파일만 바꿔치기 한다면 성공적으로 데이터를 옮길 수 있지 않을까라는 생각을 했다.

1. 이전 기기에서 카톡 데이터베이스를 가져오기

이전 기기가 루팅되었다는 전제 하에, /data/data/com.kakao.talk/databases/ 폴더 내의 KakaoTalk.dbKakaoTalk2.db를 컴퓨터로 백업해온다.

2. 새 기기에서 백업파일을 가져오기

일단 새 기기에 카카오톡 4.2.2 를 깔아야한다. 무슨 구닥다리 버전을 깔나 싶겠지만, 최신 버전에서는 카카오톡의 adb 백업이 불가능해진다.

깔았다면, 한번 실행시켜준 후에 USB 디버깅을 켜고 $ adb backup -f OriginalBackup.ab -apk com.kakao.talk 를 통해 OriginalBackup.ab 를 가져와야 한다.

3. 백업 파일을 수정하기

이 후에 android-backup-toolkit 을 다운받고 압축을 해제한다.

이를 통해서 ab를 tar로 언패킹할 것이다.
이 과정이 시간이 오래 걸린 과정이었는데, 나는 계속 반디집으로 db파일을 바꿔치기하고 다시 패킹해서 넣었는데 자꾸만 복원이 완료됐다고만 뜨고 제대로 되지 않는 것이었다. 로그캣을 통해 보니까 Illegal semantic path 라길래 검색을 해보았다. nelenkov/android-backup-extractor#37 관련 이슈가 있더라.

star를 통해 압축해야 한다고 한다.

  • 구글에서 나와 비슷한 생각을 한 사람을 찾았는데 참고하면 좋을 듯 하다.
    참고 링크

각설하고, 한 방법만 쓰자면

  1. star-ubuntu-lucid에서 $ sudo dpkg -i star_1.5final-2ubuntu2_i386.deb로 star를 설치
  2. android-backup-extractor에서 $ java -jar abe.jar unpack OriginalBackup.ab OriginalBackup.tar를 통해 tar 파일을 추출
  3. $ tar -tf OriginalBackup.tar > OriginalBackup.list를 통해 tar 파일의 목록 추출 (에러의 원인인 맨 끝에 붙는 '/' 가 없는 걸 확인 가능하다.)
  4. $ tar -xf OriginalBackup.tar를 통해 tar 파일의 압축 해제
  5. KakaoTalk.db를 바꿔치기하고 KakaoTalk2.db를 넣기
  6. KakaoTalk2.db를 넣었으니까 OriginalBackup.list에다가도 apps/com.kakao.talk/db/KakaoTalk2.db 를 넣어준다. 사실 난 이 과정을 빼먹고 해서 KakaoTalk.db만 백업됐는데 대화목록만 백업할 거면 이렇게 해도 상관 없다.
  7. 중요!! $ star -c -v -f CraftedBackup.tar -no-dirslash list=OriginalBackup.list 를 통해 CraftedBackup.tar를 생성한다.
  8. android-backup-extractor로 다시 패킹해도 상관없을 듯 한데, 난 그냥 시키는대로 $ dd if=OriginalBackup.ab bs=24 count=1 of=CraftedBackup.ab$ openssl zlib -in CraftedBackup.tar >> CraftedBackup.ab 를 통해 패킹했다.

이를 통해 수정된 백업파일이 생기면 $ adb restore CraftedBackup.ab 를 통해 카톡을 복구할 수 있다.

복원 창에 com.kakao.talk가 떠있음

이와 같이 복원 시작을 눌렀을 때 복원 창에 com.kakao.talk가 뜨면 제대로 복원 파일이 생성된 것이다.

4. 백업이 잘 됐나 확인해보기

이제 카톡을 플레이스토어에서 업데이트하면 된다.

업그레이드 중입니다.

이와 같이 업데이트하고 앱을 켜면 "업그레이드 중입니다." 라고 뜬다. 이후에 처음 카카오톡을 설치한 것 처럼 인증을 진행하면 된다. 복구 파일이 있다고 복구하겠냐고 클라우드 복원을 물어보면 쿨하게 거절해주면 된다.

2013.12.25 대화기록

인증을 진행하고 나니까 말끔하게 채팅기록이 살아있었다. 다음과 같이 2013년 12월 25일 대화기록까지 제대로 백업되었다. 물론, 대화기록만 백업했기에 이미지는 제대로 백업되지 않았다.

결론

카카오톡같이 사람의 스트레스 게이지를 높여주는 메신저 대신에 텔레그램을 애용합시다 여러분