PC·모바일

듀얼심 폰 메시지 및 통화 기록 내 번호 구분하여 다른 폰으로 옮기기 (샤오미 전용?)

Ash-Fred 2024. 3. 11. 22:06

아래 과정은 (아마) 루팅이 필요하다!

 

듀얼심 폰은 메시지 수발신 기록 및 통화 기록(이하 메시지 기록)에 자신의 번호가 구분되어 저장되어 어떤 메시지를 어느 번호로 보내고 받았는지를 알 수 있다. 그러나 구글의 안드로이드 백업 및 서드 파티 메시지 백업 앱은 유저가 번호를 하나만 쓰는 상황을 상정하고 개발했는지 백업 데이터에 자신의 번호 정보가 들어있지 않아 기록이 섞이게 된다.

아래 과정은 두 기기 모두 임시 루팅이 용이한 샤오미 제품으로 진행해 보았으며, MIUI에서 지원하는 백업 기능은 자신의 번호까지 저장이 되므로 MIUI→MIUI의 경우 아래 절차를 따를 필요가 없다. ADB로는 가능한지는 모르겠고, 루팅을 안 하고 사용하는 기기인 경우에는 샤오미 제품에 커스텀 롬을 쓸 때만 의미가 있는 방법일 수도 있다. 다만 앱스토어에 루팅 없이도 메시지 기록을 백업하는 앱들이 많은 것으로 보아 루팅 없이 기록을 열어보는 방법이 분명히 있을 것이고, 그 방법을 통해 아래 과정에서 필요한 파일에 접근할 수만 있다면 아래 과정을 문제 없이 따라할 수 있을 것이다. 나는 샤오미 폰에 커스텀 롬을 쓰는 관계로 루팅해서 진행했다. 메시지를 백업해야 하는 기기를 A, 백업을 내려받을 기기를 B로 쓴다.

 

  1. 메시지를 백업 어플 등을 통하여 A에서 B로 옮긴다. A와 B가 동일한 롬이면 이 과정이 필요 없다.
  2. 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를 찾으면 된다.
  3. SQLite DB browser로 두 파일을 연다.
  4. 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를 공유하는 엔트리가 있어서는 안 된다.
  5. A 파일을 참고하여 B 파일의 sms 및 pdu 테이블에 bind_id와 sim_id를 고친다. 이 과정이 메시지에 자신의 번호를 부여 또는 수정하는 과정이다. sms는 SMS, pdu는 MMS가 저장된 테이블이다. 
  6. MMS에 첨부된 내용 확인이 필요하면, part 테이블의 mid와 pdu 테이블의 _id가 한 쌍인 듯 하니 part 테이블에서 원하는 MMS의 첨부 미디어 파일 경로를 확인할 수 있다. 내 경우에는 /data/user_de/0/com.android.providers.telephony/app_parts/에 미디어 파일이 저장되어 있는 것 같다. 역시나 기기마다 테이블과 레이블의 내용이 다를 수 있으나 큰 차이는 없을 것이고, 백업 어플이 일반적으로 메시지 백업 시 미디어 파일의 동시 백업을 지원하는 것 같아 미디어 파일을 별도로 백업할 필요는 없어 보인다.
  7. threads 테이블에서 last_sim_id도 수정할 수 있다. 메시지 앱을 열면 각 메시지 상대마다 가장 최근 메시지 미리보기에 내 유심 번호가 표시될 것이다. 해당 메시지를 실제로는 1번 유심에서 수발신 했어도 last_sim_id를 2로 두면 2번이라고 나온다. 해당 대화 내용을 열어 보면 해당 메시지는 정상적으로 1번 유심으로 수발신 되었다고 표시되며, 새로 메시지를 보내거나 받으면 last_sim_id가 업데이트 되므로 어떤 이유에서든 잘못된 값이 입력되어 있다고 해도 수정하지 않아도 문제는 없다.
  8. 수정한 B 파일을 B의 원본 파일에 뒤집어 씌운다. 루팅이 되어 있더라도 (안드로이드 버전에 따라?) 파일 브라우저로 단순히 복사해서 붙여 넣는 건 안 될 수도 있고, 안 된다면 termux로 진행하면 된다.
  9. 이렇게 복사한 파일은 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