我们测试的时候有可能需要通过读取数据库来确认问题,但是某些设备上无法获取root权限(尤其是android 5.0以上),这里简单整理一些小技巧。
测试app
查看app所使用的数据库
首先想到的就是dumpsys
命令,执行一下adb shell dumpsys package com.heima.ormlitedemo
,结果如下:
1 | Activity Resolver Table: |
发现一些app相关的信息都有了,但就是没有database路径和文件名。要知道无root权限访问/data/data
路径,总是提示Permission denied
。虽然可以在一个root过的设备上先把路径记录下来,但毕竟不是正途,应该还有更“科学”的办法的。
后来果然不负重望,在使用dumpsys meminfo
命令时居然让我找到了一个小花招:
1 | >>adb shell dumpsys meminfo com.heima.ormlitedemo |
可以看到末尾是有打开数据库的内存占用的,这里可以显示数据库的绝对路径。
但是这个办法有个限制:数据库必须要使用过,即必须打开app并手动触发一次数据库的增删改查。
run-as
首先,使用run-as命令需要被测app为可调试(打包时设置debuggable=true,也通过pkgFlags或flags是否存在DEBUGGABLE来判断),或手机为全局可调试(ro.debuggable=1,一般手机出厂后都是0)。
先上命令:
1 | adb exec-out run-as com.heima.ormlitedemo cat /data/data/com.heima.ormlitedemo/databases/user.db > user.db |
这两条命令,功能是一样的,唯一的区别是注意数据库文件的路径可以使用绝对路径(第一个)或相对路径(第二个)。第二个要注意的地方就是,重定向符号>
后面的文件路径,不是设备上的,而是你的PC。
其实另外还有两种办法,一个是用tar
命令代替cat
,这样可以直接压缩整个文件夹;另外一个办法,在adb shell
的交互式命令行下,先通过run-as
改变当前用户,再用chmod
修改文件权限再拷贝出来。但是这两个办法第一个我尝试后没有成功,第二种方式步骤太繁琐,所以都被我放弃了。
backup
第二个方案是使用adb backup
将数据备份,然后借用工具解密。
先执行命令adb backup -f backup.ab -noapk com.heima.ormlitedemo
,然后手机端会弹出提示,让你设置密码,为了简单这里直接设置为空即可。其中-f
用来指定备份文件(扩展名为.ab),-noapk
指定不备份apk本身,最后一个参数是要备份app的包名。
这样备份以后,通过Android Backup Utilities这样一个工具,即可解密得到数据库和其它文件了。
Android Backup Utilities备份下载
用法:
1 | java -jar "Android Backup Utilities/Android Backup Extractor/android-backup-extractor-20171005-bin/abe.jar" unpack backup.ab backup.tar |
这样把.ab
文件解密为tar,然后再解压出来,找到数据库文件即可。
相对上一个方案,这个办法对app没有限制,也不要求root权限,唯一的隐患就是某些厂商“优化”了backup功能。