Android数据备份与恢复

2022-03-07 宋洋葱 宋洋葱 2 min

使用 adb 命令备份手机数据

默认情况下安卓可以通过 adb backup 命令备份应用的数据

比如备份短信

adb shell pm list packages "telephony"
# com.android.providers.telephony
adb backup -f ~/Downloads/mmssms.db com.android.providers.telephony
# 在手机上点击"确定"

但是几乎大多数应用都在 AndroidManifest.xml 中把 android:allowBackup 属性设置成 false 了, 这样就无法备份,命令执行完发现数据基本不超过 1k,比如备份通讯录。

adb backup -f ~/Downloads/contacts.db com.android.providers.contacts

想要修改 android:allowBackup,简单的方法就是安装前修改 apk 的安装包,安装的时候就把这个设置改掉。

root 之后备份手机数据

app 的数据大体分为 3 部分:

  • 应用内存储,一般存储在 /data/data/app_packge_name,仅应用能访问。
  • 公共存储,一般在 /sdcard,可公开访问。
  • /data/app/xxx,安装包。

安装应用的时候,如果已经存在,则覆盖 /data/app/xxx,如果不存在则创建 /data/data/app_packge_name 的应用目录,用户和组会随机生成,比如腾讯的应用:

dipper:/data/data # ls -lh /data/data |grep tencent                                                                                              
drwx------ 37 u0_a248        u0_a248        4.0K 2022-03-02 09:21 com.tencent.android.qqdownloader
drwx------ 17 u0_a244        u0_a244        4.0K 2022-02-14 23:44 com.tencent.androidqqmail
drwx------ 41 u0_a204        u0_a204        4.0K 2022-03-05 16:03 com.tencent.map
drwx------ 61 u0_a227        u0_a227        4.0K 2022-02-18 23:24 com.tencent.mm
drwx------ 43 u0_a268        u0_a268        4.0K 2022-02-08 10:40 com.tencent.qqmusic
drwx------ 17 u0_a259        u0_a259        4.0K 2022-01-20 15:58 com.tencent.wemeet.app
drwx------ 18 u0_a236        u0_a236        4.0K 2022-02-10 01:18 com.tencent.weread

了解原理后即可备份应用数据。大多数应用的数据都存在 应用目录的databases 目录下。

# 备份
adb shell pm list packages "qq"
adb shell
su
cd /data/data 
ls grep "qq"
tar -czvf test.tar.gz com.tencent.qq
mv test.tar.gz /sdcard/Download/

# 也可以只备份应用下的这几个文件夹
# databases
# files
# shared_prefs


# 恢复
adb install /Users/songyangcong/Downloads/qq.apk
adb shell
su
cd /data/data/
mv com.tencent.qq com.tencent.qq.bak
tar -zxvf test.tar.gz
ls -lh |grep qq                                         
# drwx------  4 u0_a279        u0_a279   
chmod -R go-xwr com.tencent.qq
chown -R u0_a280:u0_a280 com.tencent.qq
# chmod -R u+xwr  com.tencent.qq

tar 命令说明:

  • -c或–create 建立新的备份文件。
  • -f<备份文件>或–file=<备份文件> 指定备份文件。
  • -v或–verbose 显示指令执行过程。
  • -z或–gzip或–ungzip 通过gzip指令处理备份文件。
  • -x或–extract或–get 从备份文件中还原文件。
  • -C<目的目录>或–directory=<目的目录> 切换到指定的目录。

增量备份

root 之后通过备份 /data/data/xxx 目录的方式缺点是无法增量备份。可以写个面具插件,当读取 app 的 allowBackup 属性时返回 true 即可。(此思路正在测试中)

也可通过第三方程序备份,比如 Swift Backup, 下载地址1:apkpure,下载地址2:uptodown

备份微信数据

微信在本地将应用数据存储在一个名为"EnMicroMsg.db"的加密 SQLite 数据库中。该数据库位于应用程序数据目录内的"MicroMsg"子文件夹中(通常类似于"/data/data/com.tencent.mm")。数据库使用 SQLCipher 进行加密,SQLCipher是 SQLite 的一个开源扩展,可提供完整的数据库加密,解密过程可参考数据库的解密

关键的数据如下:

# wechat files
/data/data/com.tencent.mm # du -sh *
# 4.0K  .auth_cache # 没有这个数据就当做新设备
# 2.8G	MicroMsg # 聊天数据
# 576M	files
# 12K	account.bin
# 2.2M	databases
# 1.1M	shared_prefs

Android 9 之后 adb 无法以 root 权限运行,也有方法可以解决。这样就可以直接 pull 文件了。

参考文档:

Leave a Comment

Your email address will not be published. Required fields are marked *