【问题标题】:How to examine SharedPreferences from adb shell?如何从 adb shell 检查 SharedPreferences?
【发布时间】:2010-11-17 14:28:31
【问题描述】:

现在我们可以Examining sqlite3 Databases from a Remote Shell,是否可以从 adb shell 检查 SharedPreferences?因为在调试时从命令行检查和操作 SharedPreferences 会更方便。

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

【问题讨论】:

    标签: android adb android-sharedpreferences


    【解决方案1】:

    好的,我是在提出上述问题后才找到该文件的。 (公开提问似乎会刺激我更加努力地自己寻找答案,因为我不想让我亲爱的同龄人认为我是一个懒惰的程序员。)

    /data/data/your.app.package.name/shared_prefs下的XML文件,文件名为your.app.package.name_preferences.xml。当您发现内容只是一个键值映射时,修改首选项真的很容易。

    【讨论】:

    • 如问,你怎么能编辑它?!未安装 VI 和 Nano 编辑器。比你怎么编辑???
    • 那么当你在编写首选项时有标志 mode_private 怎么办......文件去哪里了?
    • 请注意,在某些情况下,文件可能最终位于不同的目录中,例如 /data/user_de/0/your.app.package.name/shared_prefs。不要害怕搜索一下
    【解决方案2】:

    如果应用可调试,您可以这样做:

    $ 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/&lt;app-package-id&gt;...
    • 你需要root权限才能工作,否则你会得到Permission denied
    • @Oush 你的意思是Android设备本身必须root还是使用** adb root**就足够了?
    【解决方案3】:

    我正在使用这个方便的单行来拉取、在 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 模拟器上给出了权限被拒绝错误。
    【解决方案4】:

    首先从设备中提取共享首选项文件。这需要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
    

    【讨论】:

      【解决方案5】:

      如果其他人像我一样使用上述所有建议遇到​​“权限被拒绝”错误,您可能需要像这样使用exec-out

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

      【讨论】:

      • 需要可调试的包
      【解决方案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
      }
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您想编辑共享首选项来自 adb 脚本,请参阅如何在 Android 模拟器上获取 root here。 (如果在您的情况下使用 'adb root' 还不够)。

          如果您想在 Android 上安装 vi 编辑器/busybox,请转到 here。 [可选]

          要编辑共享首选项值,您需要先将应用的 xml 文件复制到 SDstorage,将其复制到本地文件系统,编辑然后上传回到手机。

          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
          

          不要忘记重新启动应用以查看结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-06
            • 1970-01-01
            • 2022-08-14
            • 1970-01-01
            • 2014-05-14
            • 1970-01-01
            • 2011-07-26
            相关资源
            最近更新 更多