듀얼심 폰 메시지 및 통화 기록 내 번호 구분하여 다른 폰으로 옮기기 (샤오미 전용?)
아래 과정은 (아마) 루팅이 필요하다!
듀얼심 폰은 메시지 수발신 기록 및 통화 기록(이하 메시지 기록)에 자신의 번호가 구분되어 저장되어 어떤 메시지를 어느 번호로 보내고 받았는지를 알 수 있다. 그러나 구글의 안드로이드 백업 및 서드 파티 메시지 백업 앱은 유저가 번호를 하나만 쓰는 상황을 상정하고 개발했는지 백업 데이터에 자신의 번호 정보가 들어있지 않아 기록이 섞이게 된다.
아래 과정은 두 기기 모두 임시 루팅이 용이한 샤오미 제품으로 진행해 보았으며, MIUI에서 지원하는 백업 기능은 자신의 번호까지 저장이 되므로 MIUI→MIUI의 경우 아래 절차를 따를 필요가 없다. ADB로는 가능한지는 모르겠고, 루팅을 안 하고 사용하는 기기인 경우에는 샤오미 제품에 커스텀 롬을 쓸 때만 의미가 있는 방법일 수도 있다. 다만 앱스토어에 루팅 없이도 메시지 기록을 백업하는 앱들이 많은 것으로 보아 루팅 없이 기록을 열어보는 방법이 분명히 있을 것이고, 그 방법을 통해 아래 과정에서 필요한 파일에 접근할 수만 있다면 아래 과정을 문제 없이 따라할 수 있을 것이다. 나는 샤오미 폰에 커스텀 롬을 쓰는 관계로 루팅해서 진행했다. 메시지를 백업해야 하는 기기를 A, 백업을 내려받을 기기를 B로 쓴다.
- 메시지를 백업 어플 등을 통하여 A에서 B로 옮긴다. A와 B가 동일한 롬이면 이 과정이 필요 없다.
- A와 B를 루팅하여 data/user_de/0/com.android.providers.telephony/databases/mmssms.db를 추출한다. (이하 A 파일, B 파일) A와 B가 동일한 롬이면 A에서만 추출하면 된다. 이하 A와 B의 롬이 다른 경우에만 서술한다. 이 경로는 기기마다 다를 수는 있는데 대부분의 경우는 같을 것이고 이 경로에 해당 파일이 없거나 해당 파일이 비어 있으면 data/data/com.android.providers.telephony/databases/mmssms.db를 찾으면 된다.
- SQLite DB browser로 두 파일을 연다.
- B 파일 sim_cards 또는 siminfo 테이블에 엔트리를 추가하여 bind_id(또는 sub_id)와 sim_id(존재할 경우)를 A 파일과 같이 고친다. 이 과정이 메시지 데이터베이스에 자신의 번호 정보를 추가하는 과정이다. 만약에 어느 쪽이든 sim_cards 또는 상응하는 유심 정보가 있는 테이블이 없으면 data/user_de/0/com.android.providers.telephony/databases/telephony.db에 있을 것이다.
예전의 백업 등의 사유로 예전에 썼던 번호로 수발신한 메시지가 있으나 A에조차 해당 자신의 번호 기록이 남아 있지 않다면 sim_cards 테이블에 엔트리를 추가할 수 있다. sim_id는 0, bind_id는 아무 거나 하면 되고 나머지는 의미 없는 듯하다. bind_id는 5번 과정에서와의 대조 용도로 쓰이므로 A 파일과 B 파일 간에 같을 필요는 없지만, 같은 bind_id를 공유하는 엔트리가 있어서는 안 된다. - A 파일을 참고하여 B 파일의 sms 및 pdu 테이블에 bind_id와 sim_id를 고친다. 이 과정이 메시지에 자신의 번호를 부여 또는 수정하는 과정이다. sms는 SMS, pdu는 MMS가 저장된 테이블이다.
- MMS에 첨부된 내용 확인이 필요하면, part 테이블의 mid와 pdu 테이블의 _id가 한 쌍인 듯 하니 part 테이블에서 원하는 MMS의 첨부 미디어 파일 경로를 확인할 수 있다. 내 경우에는 /data/user_de/0/com.android.providers.telephony/app_parts/에 미디어 파일이 저장되어 있는 것 같다. 역시나 기기마다 테이블과 레이블의 내용이 다를 수 있으나 큰 차이는 없을 것이고, 백업 어플이 일반적으로 메시지 백업 시 미디어 파일의 동시 백업을 지원하는 것 같아 미디어 파일을 별도로 백업할 필요는 없어 보인다.
- threads 테이블에서 last_sim_id도 수정할 수 있다. 메시지 앱을 열면 각 메시지 상대마다 가장 최근 메시지 미리보기에 내 유심 번호가 표시될 것이다. 해당 메시지를 실제로는 1번 유심에서 수발신 했어도 last_sim_id를 2로 두면 2번이라고 나온다. 해당 대화 내용을 열어 보면 해당 메시지는 정상적으로 1번 유심으로 수발신 되었다고 표시되며, 새로 메시지를 보내거나 받으면 last_sim_id가 업데이트 되므로 어떤 이유에서든 잘못된 값이 입력되어 있다고 해도 수정하지 않아도 문제는 없다.
- 수정한 B 파일을 B의 원본 파일에 뒤집어 씌운다. 루팅이 되어 있더라도 (안드로이드 버전에 따라?) 파일 브라우저로 단순히 복사해서 붙여 넣는 건 안 될 수도 있고, 안 된다면 termux로 진행하면 된다.
- 이렇게 복사한 파일은 owner가 radio가 아니라 root이라 B의 메시지 앱이 읽을 수가 없다. termux에서 아래 명령어를 (필요 시 경로를 알맞게 바꾸어) 실행하면 된다.
su
chown radio:radio /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
chmod 660 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
통화 기록도 위와 같이 진행하면 된다. 포코폰 F1 기준으로 통화 기록은 MIUI에서는 data/data/com.android.providers.contacts/databases/calllog.db, PixelExperience에서는 data/user_de/0/com.android.providers.contacts/databases/calllog.db에 있다. 기종과 롬 종류에 따라 contact2.db에 있을 수도 있다. 메시지 기록과는 달리 파일 owner를 바꾸어 줄 필요가 없는 것 같으나, 기종과 롬 종류에 따라 다른지는 확인이 안 되었으므로 통화 기록이 로딩되지 않는다면 owner를 바꾸어 주도록 하자.
주의1: 포코폰 F1에서는 sim_id 1이 기기 표시상의 2번 유심, 2가 1번 유심인 것 같다. 그러나 last_sim_id는 1이 1번 유심, 2가 2번 유심인 것 같다. 포코폰 F1은 홍미노트 5 등의 기기들과 다르게 유심 전용 슬롯이 기기상에서 2번으로, 하이브리드 슬롯이 1번으로 나오는데 MIUI 코딩을 실수로.바꿔 한 게 아닌가 의심된다.
주의2: pdu 테이블의 snippet, preview_type, preview_data, preview_data_ts는 붙여 넣을 필요가 없다. 메시지 미리보기 관련된 데이터로, 이 데이터의 복사가 잘못되면 미리보기와 원본 메시지가 일치하지 않게 될 수 있다. 어차피 준비된 미리보기가 없으면 메시지 메시지 앱이 자동으로 미리보기를 생성하므로 복사해서 얻을 이득이 없다.
참고: https://thebinaryhick.blog/.../mo-sims-mo-problems.../
이거 보고 한 건 아닌데 비슷한 것 같고 더 자세하다.
data/user_de/0/com.android.providers.contacts/databases/calllog.db