如何通过adb shell检查SharedPreferences?

47
现在我们可以从远程Shell检查sqlite3数据库,那么是否可以从adb shell检查SharedPreferences呢?当调试时,从命令行检查和操作SharedPreferences会更加方便。

或者换一种说法,SharedPreferences保存在哪些文件中,如何查看和修改这些文件?

8个回答

53

好的,我在提出上面的问题后很快找到了文件。(似乎公开提问激发了我更加努力地搜索答案,因为我不想让我的同行们认为我是一个懒惰的程序员。)

它是位于/data/data/your.app.package.name/shared_prefs下的XML文件,文件名为your.app.package.name_preferences.xml。一旦你意识到它只是一个键值对映射,就很容易修改偏好设置了。


3
你的问题是如何编辑它?VI和Nano编辑器都没有安装。那么你该怎样编辑它呢? - susparsy
2
当您在编写首选项时使用标志mode_private时,文件会存储在哪里? - Pedro Teran
请注意,在某些情况下,文件可能会出现在不同的目录中,比如/data/user_de/0/your.app.package.name/shared_prefs。不要害怕稍微搜索一下。 - Jim

46

如果应用程序是可调试的,您可以执行以下操作:

$ 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/

4
在较新的版本中,默认路径为/data/user/0/<app-package-id>... - WindRider
2
你需要root访问权限才能运行此程序,否则会出现“权限被拒绝”的错误提示。 - Oush
1
@Oush,您是指Android设备本身必须被root,还是使用adb root命令就足够了? - Setaa

13

我正在使用这个便捷的一行代码来拉取、在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


在Android模拟器上出现了权限被拒绝的错误。 - Olkunmustafa

6

辅助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
}

5

如果其他人也遇到了权限被拒绝的问题,并且像我一样使用了以上所有建议,那么你可能需要这样使用exec-out

adb exec-out run-as <package.name> cat /data/data/<package.name>/shared_prefs/<package.name>_preferences.xml

6
需要使用 debuggable 包。 - Ender
这是在所有列出的答案中唯一对我有效的方法。 - Phani Rithvij

1

首先从设备中提取共享偏好文件。这需要root权限。

adb pull /data/data/org.test/shared_prefs/MyKeys.xml 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

1
如果您正在使用Flutter的shared_preferences,文件位于/data/data/your.app.package.name/shared_prefs/FlutterSharedPreferences.xml。请注意,如果您编辑了该文件,您必须重新启动应用程序才能看到更改。进行热重载/热重启不会将手动更改暴露给您的应用程序。

0

如果您想从 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

别忘了重新启动应用程序以查看结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接