如何用ADB命令获取SQLite数据库?执行后生成1KB无效文件求助
我之前也碰到过类似的ADB导出数据库失效的情况,咱们一步步来排查可能的原因:
检查应用的Debuggable状态
run-as命令只能访问debug签名或开启了debuggable属性的应用。如果你的应用最近更新为release版本,或者修改了AndroidManifest.xml里的android:debuggable="false",那么run-as会无法正常读取沙箱内的文件,导出的就是空内容或错误信息(对应1KB的无效文件)。
验证方法:执行adb shell run-as mypackagename,如果返回run-as: Package 'mypackagename' is not debuggable,就说明是这个问题。解决方式是重新打包debug版本,或者临时开启debuggable属性。确认数据库路径是否正确
应用更新后,数据库的存储路径可能发生变化(比如部分应用会把数据库移到/data/data/mypackagename/files/或自定义子目录)。你可以先手动确认路径:adb shell run-as mypackagename ls -l /data/data/mypackagename/ # 查看所有子目录,找到数据库所在位置如果原来的
/databases/mydbname.db不存在,就需要修正命令里的路径。拆分导出步骤排查传输问题
直接跨设备导出可能因为ADB连接不稳定导致中断,生成不完整的文件。可以分两步操作:- 先把数据库复制到设备的公共可访问目录:
adb shell run-as mypackagename cat /databases/mydbname.db > /sdcard/mydbname.db - 再从公共目录拉取到电脑:
adb pull /sdcard/mydbname.db D:\mydbname.db
如果这样能得到完整的数据库,说明是直接导出时的传输问题;如果还是1KB文件,那问题出在读取数据库的环节。
- 先把数据库复制到设备的公共可访问目录:
检查数据库文件是否损坏
应用运行时的异常可能导致数据库损坏,这时候cat出来的内容无效。可以在设备内直接验证数据库:adb shell run-as mypackagename sqlite3 /databases/mydbname.db .tables # 输入该命令,看能否列出数据库表如果报错,说明数据库本身损坏,需要修复应用的数据库逻辑,或者从备份恢复。
验证电脑端路径的写入权限
Windows的部分目录(比如系统盘根目录、Program Files)需要管理员权限才能写入,可能导致导出的文件仅生成占位符。试试把导出路径改成桌面这样的权限宽松目录:adb exec-out run-as mypackagename cat /databases/mydbname.db > C:\Users\你的用户名\Desktop\mydbname.db
内容的提问来源于stack exchange,提问作者Marie Mirzazade

