现在我们可以从远程Shell检查sqlite3数据库,那么是否可以从adb shell检查SharedPreferences呢?当调试时,从命令行检查和操作SharedPreferences会更加方便。
或者换一种说法,SharedPreferences保存在哪些文件中,如何查看和修改这些文件?
好的,我在提出上面的问题后很快找到了文件。(似乎公开提问激发了我更加努力地搜索答案,因为我不想让我的同行们认为我是一个懒惰的程序员。)
它是位于/data/data/your.app.package.name/shared_prefs
下的XML文件,文件名为your.app.package.name_preferences.xml。一旦你意识到它只是一个键值对映射,就很容易修改偏好设置了。
如果应用程序是可调试的,您可以执行以下操作:
$ adb shell
$ run-as <app-package-id>
$ cat /data/data/<app-package-id>/shared_prefs/prefs.xml
请注意,偏好设置可能存储在另一个文件中,因此最好检查目录以找到它:
$ ls /data/data/<app-package-id>/shared_prefs/
/data/user/0/<app-package-id>...
。 - WindRider我正在使用这个便捷的一行代码来拉取、在vim中编辑和推送应用程序的共享偏好设置:
APP_ID=com.myapp; adb pull /data/data/${APP_ID}/shared_prefs/${APP_ID}_preferences.xml /tmp/${APP_ID}_preferences.xml && vim /tmp/${APP_ID}_preferences.xml && adb push /tmp/${APP_ID}_preferences.xml /data/data/${APP_ID}/shared_prefs/
只需将APP_ID
设置为您的应用程序ID即可。
请注意,这假定您正在使用共享首选项的默认文件名,如从PreferenceManager.getDefaultSharedPreferences(context)
获取的那样。同时,ADB需要在root模式下运行:adb root
辅助bash函数
function adb-pull-prefs {
# ${1} - app package
# ${2} - prefs name
adb exec-out run-as ${1} cat /data/data/${1}/shared_prefs/${2}.xml
}
如果其他人也遇到了权限被拒绝的问题,并且像我一样使用了以上所有建议,那么你可能需要这样使用exec-out
:
adb exec-out run-as <package.name> cat /data/data/<package.name>/shared_prefs/<package.name>_preferences.xml
首先从设备中提取共享偏好文件。这需要root权限。
adb pull /data/data/org.test/shared_prefs/MyKeys.xml MyKeys.xml
vim MyKeys.xml
adb push MyKeys.xml /data/data/org.test/shared_prefs/MyKeys.xml
adb shell
cat /data/data/org.test/shared_prefs/MyKeys.xml
/data/data/your.app.package.name/shared_prefs/FlutterSharedPreferences.xml
。请注意,如果您编辑了该文件,您必须重新启动应用程序才能看到更改。进行热重载/热重启不会将手动更改暴露给您的应用程序。如果您想从 adb 脚本中编辑共享首选项,请参阅如何在 Android 模拟器上获取 root here。(如果在您的情况下使用“adb root”不够)。
如果您希望在 Android 上安装 vi 编辑器/ busybox,请转到here。[可选]
要编辑共享首选项值,您需要先将应用程序的 xml 文件复制到 SD 存储卡,然后将其复制到本地文件系统中进行编辑,最后再上传回手机。
adb shell
su
cp /data/data/com.your.package.name/shared_prefs/com.your.package.name_preferences.xml /storage/emulated/0/
adb pull /storage/emulated/0/com.your.package.name_preferences.xml
nano com.your.package.name_preferences.xml
adb push com.your.package.name_preferences.xml /storage/emulated/0/com.your.package.name_preferences.xml
cp /storage/emulated/0/com.your.package.name_preferences.xml /data/data/com.your.package.name/shared_prefs/com.your.package.name_preferences.xml
别忘了重新启动应用程序以查看结果。
/data/user_de/0/your.app.package.name/shared_prefs
。不要害怕稍微搜索一下。 - Jim