How to examine SharedPreferences from adb shell?

断了今生、忘了曾经 提交于 2019-12-03 01:52:34

问题


Now that we can Examining sqlite3 Databases from a Remote Shell, is it possible to examine SharedPreferences from adb shell? Since it would be much more convenient to examine and manipulate SharedPreferences from command line when debugging.

Or put in another way, in what files SharedPreferences are saved, and how to view and modify these files?


回答1:


Fine, I found the file just after I raised the question above. (It seem asking questions publicly stimulate me to search answers by myself much more diligently, since I don't want my dear peers to view me as a lazy programmer.)

It is an XML file under /data/data/your.app.package.name/shared_prefs, and the file name is your.app.package.name_preferences.xml. It is really easy to modify the preferences when you figure out that the content is just a key-value map.




回答2:


If the app is debugable you could do:

$ adb shell
$ run-as <app-package-id>
$ cat /data/data/<app-package-id>/shared_prefs/prefs.xml

Note that the preference might be stored in another file so better check the directory to find it:

$ ls /data/data/<app-package-id>/shared_prefs/



回答3:


I am using this convenient one-liner to pull, edit in vim, and push shared preferences for an app:

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/

Just set APP_ID to your application id.

Note that this assumes you are using the default file name for shared preferences, as obtained from PreferenceManager.getDefaultSharedPreferences(context). Also, ADB needs to be running in root mode: adb root




回答4:


Helper bash function

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:


In case anyone else is running into "Permission Denied" errors using all of the above suggestions like I was, you may need to use exec-out like this:

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



回答6:


First pull shared preferences file from device. This requires root permision.

adb pull /data/data/org.test/shared_prefs/MyKeys.xml MyKeys.xml

Now MyKeys.xml is stored in current directory of your system.

Modify values by

vim MyKeys.xml

After editing file save changes and push to device.

adb push MyKeys.xml /data/data/org.test/shared_prefs/MyKeys.xml

To Verify your changes

adb shell
cat /data/data/org.test/shared_prefs/MyKeys.xml


来源:https://stackoverflow.com/questions/1243079/how-to-examine-sharedpreferences-from-adb-shell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!