问题
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